Dockerの 概 要 とIIJでの 利 用 例 前 橋 孝 広 maebashi@iij.ad.jp 株 式 会 社 インターネットイニシアティブ 1
本 日 の 話 Dockerとは 概 要 Dockerfile Docker Hub 仕 組 み IIJでの 利 用 例 特 に 断 りがない 限 り 本 資 料 の 説 明 は CentOS 6.5/6.6 + docker 1.3.1を 前 提 としている Copyright (c) 2014 Internet Initiative Japan Inc. 2
Dockerとは? オープンソースのコンテナ 管 理 ソフトウェア Linuxホストの 中 に 別 の 独 立 したLinux 環 境 を 作 り 出 す 技 術 的 に 新 しいものではない chroot + α とか jail + α とかよく 言 われる ディスクイメージ 管 理 と アプリを 含 めたイメー ジのパッケージング 方 式 がキモ Copyright (c) 2014 Internet Initiative Japan Inc. 3
本 家 (www.docker.com)の com)の 説 明 Docker (プラットフォーム) = Docker Engine and Docker Hub Copyright (c) 2014 Internet Initiative Japan Inc. 4
Hypervisor 型 仮 想 化 vs コンテナ App A App B Bins/Libs Bins/Libs Guest OS Guest OS Hypervisor Host OS Server 仮 想 マシン dockerコンテナ は 隔 離 された 単 なるプロセス App A App B Bins/Libs Bins/Libs Docker Engine Host OS Server コンテナ Copyright (c) 2014 Internet Initiative Japan Inc. 5
何 がうれしいのか? 必 要 なアプリを 含 めたイメージを 簡 単 に 作 れる それをDocker HUBでソーシャルに 共 有 ディスクイメージはgitのコミットグラフのよう に 管 理 される 差 分 だけ 新 たなディスク 領 域 を 使 用 実 行 環 境 を 高 速 に 再 現 可 能 Copyright (c) 2014 Internet Initiative Japan Inc. 6
インストール(CentOS6.5の 場 合 ) $ sudo rpm -ivh http://ftp.iij.ad.jp/pub/linux/fedora/epel/6/x86 _64/epel-release-6-8.noarch.rpm $ sudo yum install docker-io (/etc/sysconfig/docker 編 集 ) $ sudo service docker start /etc/sysconfig/dockerの 例 other_args="-h=unix:///var/run/docker.sock / /d k -e native" ulimit -n 1048576 ulimit -u unlimited Copyright (c) 2014 Internet Initiative Japan Inc. 7
無 保 証 版 docker 131rpm 1.3.1 CentOS 6.5/6.6 (64bit 版 ) 用 $ wget https://github.com/maebashi/docker-rpm- el6/releases/download/v1.3.1/docker-io-1.3.1- e eases/do oad/ /doc e o 1.el6.x86_64.rpm.zip $ unzip docker-io-1.3.1-1.el6.x86_64.rpm.zip $ sudo rpm -ivh docker-io-1 1.3.1 1-1.el6.x86_64.rpm 64 (/etc/sysconfig/docker 編 集 ) $ sudo service docker start ソース(specファイル Dockerfileなど): https://github.com/maebashi/docker-rpm-el6rpm el6 Docker Hub: https://registry.hub.docker.com/u/maebashi/docker-rpm-el6/ rpm el6/ Copyright (c) 2014 Internet Initiative Japan Inc. 8
Hello, world docker pull (イメージを 取 ってくる) リポジトリ 名 :タグ 名 (イメージ 名 ) # docker pull centos:centos6 # docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE centos centos6 70441cac1ed5 8 hours ago 215.8 MB docker run (コンテナ 起 動 ) # docker run centos:centos6 echo Hello, world Hello, world # Copyright (c) 2014 Internet Initiative Japan Inc. 9
bashの 実 行 $ docker run -i -t centos:centos6 /bin/bash [root@a61514500d21 /]# ls bin home lost+found opt sbin sys var dev lib media proc selinux tmp etc lib64 mnt root srv usr [root@a61514500d21 /]# yum install -y ruby... Installed: ruby.x86_64 0:1.8.7.374-2.el6 Dependency Installed: compat-readline5.x86_64 0:5.2-17.1.el6 ruby-libs.x86_64 0:1.8.7.374-2.el6 Complete! [root@a61514500d21 /]# shellを 終 了 せずに tty から 切 り 離 すにはCtrl P Ctrl Q Copyright (c) 2014 Internet Initiative Japan Inc. 10
イメージいろいろ # docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE centos centos6 70441cac1ed5 8 hours ago 215.8 MB centos centos7 ae0c2d0bdc10 8 hours ago 224 MB centos latest ae0c2d0bdc10 8 hours ago 224 MB ubuntu 14.04 5506de2b643b 11 days ago 197.8 MB ubuntu latest 5506de2b643b 11 days ago 197.8 MB 同 じイメージ 名 (リポジトリ:タグ)でも pullする 時 期 に よってイメージ 内 容 は 異 なることがある 自 分 で( 既 存 イメージを 継 承 せずに)イメージを 作 る 方 法 もある Copyright (c) 2014 Internet Initiative Japan Inc. 11
イメージの 格 納 場 所 CentOS 65の 6.5の 場 合 /var/lib/docker/devicemapper/devicemapper/ # cd /var/lib/docker/devicemapper/devicemapper/ # ls -lh total 550M -rw-------. 1 root root 100G Nov 4 14:59 data -rw-------. 1 root root 2.0G Nov 4 14:59 metadata # 上 記 dataファイルがブロックプールァ data(とmetadata)の 中 に 複 数 のイメージを 格 納 devicemapper(dm)により 論 理 デバイスとして 使 える dmで 論 理 デバイスのスナップショットを 作 れる イメージは 合 計 100Gバイトまで( 変 更 可 ) Copyright (c) 2014 Internet Initiative Japan Inc. 12
コンテナのライフサイクル 止 まっている コンテナ 動 いている コンテナ run process image create start snapshot stop snapshot image commit rm Copyright (c) 2014 Internet Initiative Japan Inc. 13
dockerコンテナのネットワーク (デフォルトでは)コンテナ 毎 に 個 別 のEthernetインタフェース が 作 られ (ホスト 側 で 使 っていない)プライベートIPアドレスが 振 られる $ docker run -i -t centos:centos6 /bin/bash bash-4.1# ip a 4: lo: <LOOPBACK,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN... 5: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state t UP qlen 1000 link/ether aa:22:97:e5:b5:b5 brd ff:ff:ff:ff:ff:ff inet 172.17.0.2/16 scope global eth0 inet6 fe80::a822:97ff:fee5:b5b5/64 scope link valid_lft forever preferred_lft forever bash-4.1# IPマスカレードで ホスト 経 由 で 外 に 出 て 行 く Copyright (c) 2014 Internet Initiative Japan Inc. 14
dockerクライアントとdockerデーモン Docker Client docker pull docker run docker... Docker Remote API Host Docker Daemon Container 1 Docker Hub Container 2 Container... Copyright (c) 2014 Internet Initiative Japan Inc. 15
Dockerfile Copyright (c) 2014 Internet Initiative Japan Inc. 16
Dockerfile dockerイメージの ジ 構 成 内 容 を 記 述 するテ キストファイル OS ライブラリ アプリケーションをパッケー ジング Dockerfileにより 実 行 環 境 を 再 現 可 能 インフラをコードとして 扱 える Copyright (c) 2014 Internet Initiative Japan Inc. 17
Dockerfileとdocker build Dockerfileの 例 (centos6ベースでrubyを 入 れたイメージを 作 る) FROM centos:centos6 RUN yum install -y ruby docker build 上 記 内 容 のDockefileを 作 り... # docker build -t ruby - < Dockerfile... Complete! ---> b3a4de744050 Removing intermediate container 04afb30a1c34 Successfully built b3a4de744050 Copyright (c) 2014 Internet Initiative Japan Inc. 18
docker buildでやっていること FROMで で 指 定 されたイメージがなければpull RUNやADD や 等 の 行 ごとに コンテナを 起 動 ディスクイメージは 直 前 の 行 で 生 成 されたイメージ のスナップショット RUNやADDの 実 行 コンテナを 停 止 (ディスクイメージは 残 ってい る) 最 後 に 出 来 たイメージに 名 前 をセットする Copyright (c) 2014 Internet Initiative Japan Inc. 19
buildしたイメージの 確 認 build 前 # docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE centos centos6 70441cac1ed5 8 hours ago 215.8 MB # du -sh /var/lib/docker/devicemapper/devicemapper/* 549M /var/lib/docker/devicemapper/devicemapper/data 976K /var/lib/docker/devicemapper/devicemapper/metadata build 後 # docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ruby latest 583c11ebc182 24 seconds ago 253.7 MB centos centos6 70441cac1ed5 8 hours ago 215.8 MB # du -sh /var/lib/docker/devicemapper/devicemapper/* 590M /var/lib/docker/devicemapper/devicemapper/data 1.4M /var/lib/docker/devicemapper/devicemapper/metadata / /de ce appe /de ce appe / etadata Copyright (c) 2014 Internet Initiative Japan Inc. 20
Docker Hub Copyright (c) 2014 Internet Initiative Japan Inc. 21
Docker Hub とは? dockerのイメージを ジ 共 有 出 来 るサービス https://registry.hub.docker.com/ t h / Copyright (c) 2014 Internet Initiative Japan Inc. 22
registry, repository 概 念 図 Docker Hub registry centos ubuntu repository maebashi/docker rpm el6 tag latest centos7 centos6 latest trusty 14.04 12.04 latest private registry host:5000/app latest image pull push local cache dockerホスト pull Copyright (c) 2014 Internet Initiative Japan Inc. 23
Docker Hub Automated Build GitHub/Bitbucketと 連 動 し 自 動 的 にイ メージをbuildする User push clone Docker HUB Dockerfile, ソースファイル など build イメージ Copyright (c) 2014 Internet Initiative Japan Inc. 24
Automated Build の 利 用 例 無 保 証 版 docker rpmは Dockerは Hub 上 で Automated Buildされている これでrpmを 取 り 出 すことができる # docker run maebashi/docker-rpm-el6 rpm el6 tar cf -C /rpmbuild RPMS tar xf - Docker Hubからmaebashi/docker rpm el6イ b メージ 取 得 このイメージのbuild 中 にrpmが 生 成 されるよう になっているので それを 取 り 出 すだけ Copyright (c) 2014 Internet Initiative Japan Inc. 25
docker rpm el6のdockerfilerpm el6のdockerfile FROM centos:centos6 RUN yum install -y tar git hg rpmdevtools gcc glibc-static devicemapper-devel RUN rpm -ivh http://ftp.iij.ad.jp/pub/linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm RUN yum install -y pandoc 'golang(github.com/gorilla/mux)' / 'golang(github.com/kr/pty)' 'golang(code.google.com/p/go.net/websocket)' 'golang(code.google.com/p/gosqlite/sqlite3)' 'golang(github.com/syndtr/gocapability/capability)' 'golang(github.com/godbus/dbus)' 'golang(github.com/coreos/gosystemd)' 'golang(github.com/tchap/go-patricia/patricia)' ADD rpmbuild /rpmbuild RUN wget -P /rpmbuild/sources https://github.com/docker/docker/archive/v1.3.1.tar.gz RUN rpmbuild -bb /rpmbuild/specs/docker-io.spec -D "_topdir /rpmbuild" Copyright (c) 2014 Internet Initiative Japan Inc. 26
Docker Engineの 仕 組 み Copyright (c) 2014 Internet Initiative Japan Inc. 27
コンテナとは 何 か? 複 数 のLinux 標 準 機 能 の 組 み 合 わせで 実 現 する 隔 離 環 境 Namespaces ネットワーク 環 境 やファイル システム 等 の 分 離 Cgroups メモリやCPUなどのリソース 制 限 Capabilities 権 限 降 格 iptables ネットワークパケットフィルタ and NAT Copyright (c) 2014 Internet Initiative Japan Inc. 28
Namespace コンテナ 実 現 のための 中 核 となる 機 能 プロセスが 動 作 する 空 間 を 分 離 する いくつかの 種 類 がある Network Namespace ネットワーク 環 境 の 分 離 Mount Namespace ファイルシステムの 分 離 PID Namespace プロセステーブルの 分 離 UTS Namespace hostnameの 分 離 IPC Namespace IPCの 分 離 User Namespace UID/GIDの 分 離 (docker 1.3では 未 使 用 ) Copyright (c) 2014 Internet Initiative Japan Inc. 29
Network Namespace コンテナ 毎 にネットワーク 環 境 を 分 離 分 離 しないこともできる(ホストと 共 有 ) コンテナ1 Network Namespace eth0 コンテナ2 Network Namespace eth0 コンテナ3 Network Namespace eth0 veth ( 仮 想 NICのペア) ホスト vethxx vethyy vethzz docker0( 仮 想 ブリッジ) Network Namespace eth0 IPマスカレード ネットワーク Copyright (c) 2014 Internet Initiative Japan Inc. 30
Mount Namespace コンテナ 毎 にファイルシステムを 分 離 コンテナ 起 動 毎 に スナップショットを 作 成 ホストLinuxの /var/lib/docker/devicemapper/mnt/<id>/ にマウント image run create snapshot /.../mnt/<id>// / lost+found/ rootfs/ mount bin/ etc/ ホスト home/ Mount... Namespace mount コンテナのMount Namespaceを 作 り その root に rootfs/ 以 下 をマウント / bin/ etc/ home/... コンテナ Mount Namespace Copyright (c) 2014 Internet Initiative Japan Inc. 31
Mount Namespace (2) 一 部 のファイルは 個 別 にbind mountされ ている (docker 12より 1.2より 前 はread only) /etc/resolv.conf /etc/hosts /etc/hostname 実 体 との 対 応 は docker inspect <ID> 等 でわかる Copyright (c) 2014 Internet Initiative Japan Inc. 32
cgroups プロセスグループのリソース(CPU メモリ プ ディスクI/Oなど)の 利 用 を 制 限 dockerではcpu(set), memoryについて 制 限 可 デバイスへのアクセスも 制 限 リソース 使 用 状 況 の 統 計 値 がとれる Copyright (c) 2014 Internet Initiative Japan Inc. 33
IIJ 社 内 での 利 用 例 継 続 的 インテグレーション クラスタリング モニタリング Copyright (c) 2014 Internet Initiative Japan Inc. 34
継 続 的 インテグレーション(CI) drone オープンソースの CI サーバ dockerコンテナ 内 のクリーンな 環 境 でビルド テスト を 実 行 する GitHub/GitHub Enterpriseと 連 携 35
継 続 的 インテグレーション: 流 れ 開 発 者 push clone 結 果 drone build test notify deploy docker container 社 内 IRC rpm event serf 社 内 yumリポジトリ Copyright (c) 2014 Internet Initiative Japan Inc. 36
コンテナのクラスタリング 多 数 のDockerホスト 上 の 多 数 のコンテナ を 管 理 したい Host クラスタ1 Docker Daemon Docker Daemon Docker Daemon クラスタ2 空 き Container Container Container Container Container Container Container Container クラスタ3 Copyright (c) 2014 Internet Initiative Japan Inc. 37
クラスタ 管 理 ツール fig 開 発 環 境 用 ホスト1 台 のみ 対 象 Apache Mesos 複 数 ホストのリソース 管 理 Kubernetes Google Container Engineで 使 われている flynn, dokku PaaS 用 Copyright (c) 2014 Internet Initiative Japan Inc. 38
IIJ 内 製 docker manager 構 成 図 CLI, Web UI など API master request/response dockerホスト 群 slave Docker Remote API Docker Daemon 構 成 情 報 DB Container 使 用 可 能 ホスト リソース 空 き 情 報 IPアドレス 空 き 情 報 etc Container Container Copyright (c) 2014 Internet Initiative Japan Inc. 39
dockerコンテナのモニタリング 個 々のコンテナのメトリクスを 収 集 したいが コンテナ 毎 にsnmpdやその 他 エージェントを 入 れたくない dockerコンテナのメトリクス 収 集 http://blog.docker.com/2013/10/gathering lxc docker containers metrics/ cgroupsの 統 計 情 報 を 使 うことにより ホスト 上 で(コンテナの 外 から)メトリクスを 収 集 可 能 コンテナのNetwork Namespaceに 切 り 替 えて /proc/net/devを 参 照 することでネットワークの 統 計 情 報 を 得 られる Copyright (c) 2014 Internet Initiative Japan Inc. 40
docker metricsd 各 dockerホストに 常 駐 dockerコンテナの 情 報 (cgroupsの 統 計 情 報 等 )を 収 集 して 返 す 似 たようなもの Google cadvisor 等 インストール & 実 行 # docker run -v /usr/local/bin:/target maebashi/docker-metricsd # /usr/local/bin/docker-metricsd & Copyright (c) 2014 Internet Initiative Japan Inc. 41
docker metricsdはメトリクスをjson 形 式 で 返 す "memory": { "failcnt": 0, "stats": { "unevictable": 0, "total_unevictable": 0, "total_swap": 0, "total_rss": 380928, "total_pgpgout": 681084, "total_pgpgin": 697086, "total_mapped_file file": 1433600, "total_inactive_file": 38936576, "mapped_file": 1433600, "inactive_file": 38936576, "inactive_anon": 0, "hierarchical_ memsw_ limit": 9223372036854776000, "hierarchical_memory_limit": 9223372036854776000, "cache": 102838272, "active_file": 63901696, "active_anon": 380928, "pgpgin": 697086, "pgpgout": 681084, "rss": 380928, "swap": 0, "total_active_anon active anon": 380928, "total_active_file": 63901696, "total_cache": 102838272, "total_inactive_anon": 0 }, "inbytes.0": 8228044607, "indrop.0": 0, "inerrs.0": 0, "inpackets.0": 6429687, "name.0": "eth0", "outbytes.0": 199687042, "outdrop.0": 0, "outerrs.0": 0 }, "cpuacct": { "throlling_data": {}, "cpu_usage": { "usage_in_usermode": 2.668e+10, "usage_in_kernelmode": 8.181e+10, "percpu p _ usage": [ 22599918565, 987624379, 65146098, 36705600, 18221767943, 5890326, 22768005795, 4033968, 218211598, 4302652, 5437296326, 23781278563, 18992360915, 18712487134, 55742891, 18522722054 ] } } "max_ usage": 139268096, "usage": 104189952 }, "interfaces": { "outpackets.0": 3021223, Copyright (c) 2014 Internet Initiative Japan Inc. 42
定 期 的 にメトリクスを 収 集 してGrafana dockerホスト 群 でグラフ 化 docker-metricsd メトリクス 収 集 ツール( 内 製 ) Docker Daemon InfluxDB container container container Copyright (c) 2014 Internet Initiative Japan Inc. 43
CPU Accoun ng 結 果 Network traffic Memory Copyright (c) 2014 Internet Initiative Japan Inc. 44
まとめ dockerにより 実 行 環 境 を 高 速 に 再 現 でき る Docker HUB 便 利 コンテナは Linux 標 準 機 能 の Namespaces, Cgroups 等 を 使 用 して 実 現 IIJではコンテナ 関 連 ツールをいくつか 自 作 して 利 用 Copyright (c) 2014 Internet Initiative Japan Inc. 45