Slide 1

Slide 1 text

でドッカンドッカン する話 Takeru Ichii 2015/11/30 勉強会

Slide 2

Slide 2 text

おしながき • 仮想化技術今昔物語 • Dockerとは • Vagrantと何が違うの? • 立ててみる • Dockerfile • 生死判定 • ファイルシステム • ネットワーキング 2015/11/30 2 ※注意   内容に間違いがある可能性はあります。この情報で不利益を被った場合に当方は 一切保証をいたしません。心優しい方は修正点をお送りください。多分直します。

Slide 3

Slide 3 text

仮想化2大勢力といえば 仮想化技術今昔物語 2015/11/30 3 (感想には個人差があります)

Slide 4

Slide 4 text

仮想化技術今昔物語 Type-­2  Hypervisor型VM App A Hypervisor  (Type  2) Host  OS Server Guest OS Bins/ Libs App A’ Guest OS Bins/ Libs App B Guest OS Bins/ Libs VM Guest OS Guest OS 2015/11/30 4 http://www.slideshare.net/dotCloud/docker-­intro-­nov ember

Slide 5

Slide 5 text

仮想化技術今昔物語 Type-­2  Hypervisor型VM ホストOSと分離はできるが… 無駄が多い 2015/11/30 5

Slide 6

Slide 6 text

仮想化技術今昔物語 Type-­2 Hypervisor型VM 2015/11/30 6 VMの数だけ普通のマシンと同じ分だけメモリ消費 ↓ ホストOSのメモリ搭載量には限界がある ↓ VMが確保できるメモリが小さくなる (しかも動作中は変更不可)

Slide 7

Slide 7 text

仮想化技術今昔物語 Type-­2 Hypervisor型VM 2015/11/30 7 O S あとCPUとか ストレージとかも辛い

Slide 8

Slide 8 text

Dockerとは コンテナ型仮想化 (と言うかホストOS上のプロセス) 2015/11/30 8 App  A’ Docker Host  OS Server Bins/Libs App  A Bins/Libs App  B App  B’ App  B’ App  B’ Container http://www.slideshare.net/dotCloud/docker-­intro-­november

Slide 9

Slide 9 text

Dockerとは 2015/11/30 9 App  A’ Docker Host  OS Server Bins/Libs App  A Bins/Libs App  B App  B’ App  B’ App  B’ Container App A Hypervisor  (Type  2) Host  OS Server Guest OS Bins/ Libs App A’ Guest OS Bins/ Libs App B Guest OS Bins/ Libs VM Guest OS Guest OS 必要リソース少なそう… http://www.slideshare.net/dotCloud/docker-­intro-­november

Slide 10

Slide 10 text

Dockerとは 2015/11/30 10 App  A’ Docker Host  OS Server Bins/Libs App  A Bins/Libs App  B App  B’ App  B’ App  B’ Container App A Hypervisor  (Type  2) Host  OS Server Guest OS Bins/ Libs App A’ Guest OS Bins/ Libs App B Guest OS Bins/ Libs VM Guest OS Guest OS http://www.slideshare.net/dotCloud/docker-­intro-­november 曰く、 コンテナは分離されているが、 必要に応じてOSやBinaryやライブラリを 共有するので、展開が早く、オーバーヘッドは小さく、 簡単に移行できて、再起動も早い

Slide 11

Slide 11 text

Dockerとは 2015/11/30 11 $  cat  /proc/meminfo MemTotal:                2050296  kB #  cat  /proc/meminfo MemTotal:                2050296  kB コンテナ ホストOS(boot2docker) ホストOSとコンテナはメモリを共有している

Slide 12

Slide 12 text

Dockerとは 2015/11/30 12 $  ps ax  –forest ……… 853  ?                 Sl 0:00  /usr/local/bin/docker daemon 1117  ?                Sl 0:00    ¥_  docker-­‐proxy  -­‐proto  tcp 1125  pts/2        Ss+        0:00    ¥_  bash 1275  pts/2        T            0:00            ¥_  top ……… #  ps ax -­‐-­‐forest PID  TTY            STAT      TIME  COMMAND 1  ?                Ss          0:00  bash 19  ?                T            0:00  top 22  ?                R+          0:00  ps ax  -­‐-­‐forest コンテナ ホストOS (boot2docker) Dockerコンテナ内プロセスは ホストOSからも見える (プロセスは分離)

Slide 13

Slide 13 text

Dockerとは Dockerコンテナ内のプロセスは殆ど無い! (本来VMならあるカーネルプロセスも無い) 2015/11/30 13 #  ps aux                 USER              PID  %CPU  %MEM        VSZ      RSS  TTY            STAT  START      TIME  COMMAND root                  1    0.0    0.1    18264    3328  ?                Ss      09:45      0:00  bash root                19    0.0    0.0    11052    2024  ?                T        10:02      0:00  top root                28    0.0    0.1    15572    2148  ?                R+      10:42      0:00  ps aux In  docker container

Slide 14

Slide 14 text

Dockerとは • DockerはVMではなくプロセスである • ホストOSとプロセスレベルの分離を行う(cgroups/Namespaces) • ただしメモリ・CPUはホストOS内で共有される • コンテナ↔ホストOS間でファイルシステムの分離を行う(後述) • ネットワークも分離する(後述) 2015/11/30 14

Slide 15

Slide 15 text

Vagrantと何が違うの? なにかとよく一緒に出される印象のVagrantですが…(俺だけ?) • VagrantはVirtualBox/Chef等を一緒にした感じのツール • なので実際にはType-­2  Hypervisor型のVM • VirtualBoxはVMの構成管理をやってくれない • Vagrantなら構成管理をやってくれるのでスパっとVMを作ってくれる • DockerはVMではなくコンテナでプロセスを分離してくれるすごい奴 2015/11/30 15

Slide 16

Slide 16 text

2015/11/30 16 \ワイのほうが軽いんやで(ドヤァ)/

Slide 17

Slide 17 text

立ててみる • Linux • Linuxカーネルの機能を使うので、Dockerをインストールすれば 利用可能 • Windows/Mac • Linuxカーネルが無いのでboot2dockerでLinuxVMをbootし、 その中でdockerを動かす 2015/11/30 17 #  wget -­‐qO-­‐ https://get.docker.com/  |  sh

Slide 18

Slide 18 text

立ててみる • Linux • Linuxカーネルの機能を使うので、Dockerをインストールすれば 利用可能 • Windows/Mac • Linuxカーネルが無いのでboot2dockerでLinuxVMをbootし、 その中でdockerを動かす 2015/11/30 18 #  wget -­‐qO-­‐ https://get.docker.com/  |  sh

Slide 19

Slide 19 text

2015/11/30 19

Slide 20

Slide 20 text

立ててみる Boot2dockerとは • Tiny  Core  Linuxベースの軽量Linuxディストリビューションを中心とした DockerをWindows/Macから直接(風)扱うソフト • 曰く、 • 本体は27MB以内 • 5秒以内にboot • Windows/MacのCLI端末にdockerコマンドを提供する • Windows/Macユーザーはまずboot2docker経由でVMをupしてから dockerコマンドでdockerコンテナを操作することになる 2015/11/30 20 http://boot2docker.io/ http://www.tinycorelinux.net/

Slide 21

Slide 21 text

立ててみる Windows/Mac準備編 • Virtualboxをインストール • https://www.virtualbox.org/wiki/Downloads • boot2dockerとDockerをインストール • http://boot2docker.io/ • boot2dockerで初期化処理 • Win  :  デスクトップにあるであろう[Boot2Docker  Start]を実行 • Mac  :  $  boot2docker  init &&  eval "$(boot2docker   shellinit)" • boot2dockerのVMの中にsshで入る(Winは初期化と同時にやってくれる) • Mac:  $  boot2docker  up  &&  boot2docker  ssh 2015/11/30 21

Slide 22

Slide 22 text

立ててみる 2015/11/30 22 $  #dockerの公式イメージをDL $  docker pull  ubuntu:latest $  #dockerコンテナを立てる $  docker run  ubuntu:latest #  #コンテナのbashに切り替わるのでubuntuのapt-­‐get試してみる #  apt-­‐get  upgrade #  うまく言ったらexitしてコンテナのプロセスを終了させる #  exit $

Slide 23

Slide 23 text

Dockerfile コンテナの構成管理を行う • docker runしただけでは構成自体は別の環境で再現できない • ただし、イメージ(後述)は更新されているので、docker commitとか docker exportすれば新しいイメージとして他の環境で再現可能 • イメージは最初作られた時点最新のパッケージ等で構成されているので、 時間が経て ばパッケ ージ アップ デートが でき なくなるな どの不具 合が あったりする(ex: Ubuntuのapt-­‐getできなかったことがあった) • Dockerfileはdocker imageの素で、イメージを構成するための手順を 記載するファイル(ChefのRecipe的なアレ) • docker buildでDockerfileを指定すると、その手順でイメージが作成され、 runできる状態になる(docker imagesで確認可能) 2015/11/30 23

Slide 24

Slide 24 text

Dockerfile コンテナの構成管理を行う 2015/11/30 24 FROM  debian:jessie MAINTAINER  NGINX  Docker Maintainers  "docker-­‐[email protected]" RUN  apt-­‐key  adv -­‐-­‐keyserver hkp://pgp.mit.edu:80  -­‐-­‐recv-­‐keys  573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 RUN  echo  "deb  http://nginx.org/packages/mainline/debian/  jessie nginx"  >>  /etc/apt/sources.list ENV  NGINX_VERSION  1.9.7-­‐1~jessie RUN  apt-­‐get  update  &&  ¥ apt-­‐get  install  -­‐y  ca-­‐certificates  nginx=${NGINX_VERSION}  &&  ¥ rm -­‐rf /var/lib/apt/lists/* #  forward  request  and  error  logs  to  docker log  collector RUN  ln  -­‐sf  /dev/stdout /var/log/nginx/access.log RUN  ln  -­‐sf  /dev/stderr /var/log/nginx/error.log VOLUME  ["/var/cache/nginx"] EXPOSE  80  443 CMD  ["nginx",  "-­‐g",  "daemon  off;"] https://github.com/nginxinc/docker-­nginx/blob/master/Dockerfile

Slide 25

Slide 25 text

Dockerfile コンテナの構成管理を行う 25 FROM  debian:jessie MAINTAINER  NGINX  Docker Maintainers  "docker-­‐[email protected]" RUN  apt-­‐key  adv -­‐-­‐keyserver hkp://pgp.mit.edu:80  -­‐-­‐recv-­‐keys  573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 RUN  echo  "deb  http://nginx.org/packages/mainline/debian/  jessie nginx"  >>  /etc/apt/sources.list ENV  NGINX_VERSION  1.9.7-­‐1~jessie RUN  apt-­‐get  update  &&  ¥ apt-­‐get  install  -­‐y  ca-­‐certificates  nginx=${NGINX_VERSION}  &&  ¥ rm -­‐rf /var/lib/apt/lists/* #  forward  request  and  error  logs  to  docker log  collector RUN  ln  -­‐sf  /dev/stdout /var/log/nginx/access.log RUN  ln  -­‐sf  /dev/stderr /var/log/nginx/error.log VOLUME  ["/var/cache/nginx"] EXPOSE  80  443 CMD  ["nginx",  "-­‐g",  "daemon  off;"] https://github.com/nginxinc/docker-­nginx/blob/master/Dockerfile Docker imageのベースになるOSの指定 これの場合はDebian Jessie(v8.2)

Slide 26

Slide 26 text

Dockerfile コンテナの構成管理を行う 26 FROM  debian:jessie MAINTAINER  NGINX  Docker Maintainers  "docker-­‐[email protected]" RUN  apt-­‐key  adv -­‐-­‐keyserver hkp://pgp.mit.edu:80  -­‐-­‐recv-­‐keys  573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 RUN  echo  "deb  http://nginx.org/packages/mainline/debian/  jessie nginx"  >>  /etc/apt/sources.list ENV  NGINX_VERSION  1.9.7-­‐1~jessie RUN  apt-­‐get  update  &&  ¥ apt-­‐get  install  -­‐y  ca-­‐certificates  nginx=${NGINX_VERSION}  &&  ¥ rm -­‐rf /var/lib/apt/lists/* #  forward  request  and  error  logs  to  docker log  collector RUN  ln  -­‐sf  /dev/stdout /var/log/nginx/access.log RUN  ln  -­‐sf  /dev/stderr /var/log/nginx/error.log VOLUME  ["/var/cache/nginx"] EXPOSE  80  443 CMD  ["nginx",  "-­‐g",  "daemon  off;"] https://github.com/nginxinc/docker-­nginx/blob/master/Dockerfile Dockerfileの作者情報

Slide 27

Slide 27 text

Dockerfile コンテナの構成管理を行う 27 FROM  debian:jessie MAINTAINER  NGINX  Docker Maintainers  "docker-­‐[email protected]" RUN  apt-­‐key  adv -­‐-­‐keyserver hkp://pgp.mit.edu:80  -­‐-­‐recv-­‐keys  573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 RUN  echo  "deb  http://nginx.org/packages/mainline/debian/  jessie nginx"  >>  /etc/apt/sources.list ENV  NGINX_VERSION  1.9.7-­‐1~jessie RUN  apt-­‐get  update  &&  ¥ apt-­‐get  install  -­‐y  ca-­‐certificates  nginx=${NGINX_VERSION}  &&  ¥ rm -­‐rf /var/lib/apt/lists/* #  forward  request  and  error  logs  to  docker log  collector RUN  ln  -­‐sf  /dev/stdout /var/log/nginx/access.log RUN  ln  -­‐sf  /dev/stderr /var/log/nginx/error.log VOLUME  ["/var/cache/nginx"] EXPOSE  80  443 CMD  ["nginx",  "-­‐g",  "daemon  off;"] https://github.com/nginxinc/docker-­nginx/blob/master/Dockerfile RUNコマンドでイメージ作成時に 実行するbashコマンドを指定する

Slide 28

Slide 28 text

Dockerfile コンテナの構成管理を行う 2015/11/30 28 FROM  debian:jessie MAINTAINER  NGINX  Docker Maintainers  "docker-­‐[email protected]" RUN  apt-­‐key  adv -­‐-­‐keyserver hkp://pgp.mit.edu:80  -­‐-­‐recv-­‐keys  573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 RUN  echo  "deb  http://nginx.org/packages/mainline/debian/  jessie nginx"  >>  /etc/apt/sources.list ENV  NGINX_VERSION  1.9.7-­‐1~jessie RUN  apt-­‐get  update  &&  ¥ apt-­‐get  install  -­‐y  ca-­‐certificates  nginx=${NGINX_VERSION}  &&  ¥ rm -­‐rf /var/lib/apt/lists/* #  forward  request  and  error  logs  to  docker log  collector RUN  ln  -­‐sf  /dev/stdout /var/log/nginx/access.log RUN  ln  -­‐sf  /dev/stderr /var/log/nginx/error.log VOLUME  ["/var/cache/nginx"] EXPOSE  80  443 CMD  ["nginx",  "-­‐g",  "daemon  off;"] https://github.com/nginxinc/docker-­nginx/blob/master/Dockerfile ENVコマンドでイメージ作成時に実行する コンテナ内部の環境変数を設定する

Slide 29

Slide 29 text

Dockerfile コンテナの構成管理を行う 2015/11/30 29 FROM  debian:jessie MAINTAINER  NGINX  Docker Maintainers  "docker-­‐[email protected]" RUN  apt-­‐key  adv -­‐-­‐keyserver hkp://pgp.mit.edu:80  -­‐-­‐recv-­‐keys  573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 RUN  echo  "deb  http://nginx.org/packages/mainline/debian/  jessie nginx"  >>  /etc/apt/sources.list ENV  NGINX_VERSION  1.9.7-­‐1~jessie RUN  apt-­‐get  update  &&  ¥ apt-­‐get  install  -­‐y  ca-­‐certificates  nginx=${NGINX_VERSION}  &&  ¥ rm -­‐rf /var/lib/apt/lists/* #  forward  request  and  error  logs  to  docker log  collector RUN  ln  -­‐sf  /dev/stdout /var/log/nginx/access.log RUN  ln  -­‐sf  /dev/stderr /var/log/nginx/error.log VOLUME  ["/var/cache/nginx"] EXPOSE  80  443 CMD  ["nginx",  "-­‐g",  "daemon  off;"] https://github.com/nginxinc/docker-­nginx/blob/master/Dockerfile パッケージアップデートして、nginx install。 完了したらapt-­getできないようにリスト削除

Slide 30

Slide 30 text

Dockerfile コンテナの構成管理を行う 2015/11/30 30 FROM  debian:jessie MAINTAINER  NGINX  Docker Maintainers  "docker-­‐[email protected]" RUN  apt-­‐key  adv -­‐-­‐keyserver hkp://pgp.mit.edu:80  -­‐-­‐recv-­‐keys  573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 RUN  echo  "deb  http://nginx.org/packages/mainline/debian/  jessie nginx"  >>  /etc/apt/sources.list ENV  NGINX_VERSION  1.9.7-­‐1~jessie RUN  apt-­‐get  update  &&  ¥ apt-­‐get  install  -­‐y  ca-­‐certificates  nginx=${NGINX_VERSION}  &&  ¥ rm -­‐rf /var/lib/apt/lists/* #  forward  request  and  error  logs  to  docker log  collector RUN  ln  -­‐sf  /dev/stdout /var/log/nginx/access.log RUN  ln  -­‐sf  /dev/stderr /var/log/nginx/error.log VOLUME  ["/var/cache/nginx"] EXPOSE  80  443 CMD  ["nginx",  "-­‐g",  "daemon  off;"] https://github.com/nginxinc/docker-­nginx/blob/master/Dockerfile 外部のコンテナ等からマウントするための ポジションを設定

Slide 31

Slide 31 text

Dockerfile コンテナの構成管理を行う 2015/11/30 31 FROM  debian:jessie MAINTAINER  NGINX  Docker Maintainers  "docker-­‐[email protected]" RUN  apt-­‐key  adv -­‐-­‐keyserver hkp://pgp.mit.edu:80  -­‐-­‐recv-­‐keys  573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 RUN  echo  "deb  http://nginx.org/packages/mainline/debian/  jessie nginx"  >>  /etc/apt/sources.list ENV  NGINX_VERSION  1.9.7-­‐1~jessie RUN  apt-­‐get  update  &&  ¥ apt-­‐get  install  -­‐y  ca-­‐certificates  nginx=${NGINX_VERSION}  &&  ¥ rm -­‐rf /var/lib/apt/lists/* #  forward  request  and  error  logs  to  docker log  collector RUN  ln  -­‐sf  /dev/stdout /var/log/nginx/access.log RUN  ln  -­‐sf  /dev/stderr /var/log/nginx/error.log VOLUME  ["/var/cache/nginx"] EXPOSE  80  443 CMD  ["nginx",  "-­‐g",  "daemon  off;"] https://github.com/nginxinc/docker-­nginx/blob/master/Dockerfile EXPOSEコマンドは docker run時にコンテナ内部から リッスンするNIC  portを指定

Slide 32

Slide 32 text

Dockerfile コンテナの構成管理を行う 2015/11/30 32 FROM  debian:jessie MAINTAINER  NGINX  Docker Maintainers  "docker-­‐[email protected]" RUN  apt-­‐key  adv -­‐-­‐keyserver hkp://pgp.mit.edu:80  -­‐-­‐recv-­‐keys  573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 RUN  echo  "deb  http://nginx.org/packages/mainline/debian/  jessie nginx"  >>  /etc/apt/sources.list ENV  NGINX_VERSION  1.9.7-­‐1~jessie RUN  apt-­‐get  update  &&  ¥ apt-­‐get  install  -­‐y  ca-­‐certificates  nginx=${NGINX_VERSION}  &&  ¥ rm -­‐rf /var/lib/apt/lists/* #  forward  request  and  error  logs  to  docker log  collector RUN  ln  -­‐sf  /dev/stdout /var/log/nginx/access.log RUN  ln  -­‐sf  /dev/stderr /var/log/nginx/error.log VOLUME  ["/var/cache/nginx"] EXPOSE  80  443 CMD  ["nginx",  "-­‐g",  "daemon  off;"] https://github.com/nginxinc/docker-­nginx/blob/master/Dockerfile CMDコマンドはdocker run時に実行するbash コマンドを指定する(PID1?)。 ここで実行したプロセスが終了するとコンテナは Exitする。 DockerfileにCMDコマンドは一つしかかけない

Slide 33

Slide 33 text

Dockerfile コンテナの構成管理を行う 2015/11/30 33 FROM  debian:jessie MAINTAINER  NGINX  Docker Maintainers  "docker-­‐[email protected]" RUN  apt-­‐key  adv -­‐-­‐keyserver hkp://pgp.mit.edu:80  -­‐-­‐recv-­‐keys  573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 RUN  echo  "deb  http://nginx.org/packages/mainline/debian/  jessie nginx"  >>  /etc/apt/sources.list ENV  NGINX_VERSION  1.9.7-­‐1~jessie RUN  apt-­‐get  update  &&  ¥ apt-­‐get  install  -­‐y  ca-­‐certificates  nginx=${NGINX_VERSION}  &&  ¥ rm -­‐rf /var/lib/apt/lists/* #  forward  request  and  error  logs  to  docker log  collector RUN  ln  -­‐sf  /dev/stdout /var/log/nginx/access.log RUN  ln  -­‐sf  /dev/stderr /var/log/nginx/error.log VOLUME  ["/var/cache/nginx"] EXPOSE  80  443 CMD  ["nginx",  "-­‐g",  "daemon  off;"] https://github.com/nginxinc/docker-­nginx/blob/master/Dockerfile Dockerfileのことを知りたい方は公式リファレンスを見てください (Engですが長くない) https://docs.docker.com/v1.8/reference/builder/

Slide 34

Slide 34 text

Docker image • Dockerfileからコンテナを実行するためには一度buildしてイメー ジを作成する必要があります • docker build  [  -­‐t  {イメージ名} [  :{タグ名} ]  ]   {Dockerfileのあるディレクトリ} • Build時にどのようなことが起こっているか軽く説明します。 2015/11/30 34

Slide 35

Slide 35 text

Docker image 2015/11/30 35 FROM  debian:jessie Container  debian:jessie

Slide 36

Slide 36 text

Docker image 2015/11/30 36 FROM  debian:jessie RUN  apt-­‐key  adv -­‐-­‐keyserver hkp://pgp.mit.edu:80  -­‐-­‐recv-­‐keys   573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 RUN  echo  "deb  http://nginx.org/packages/mainline/debian/   jessie nginx"  >>  /etc/apt/sources.list ENV  NGINX_VERSION  1.9.7-­‐1~jessie ……… docker buildで Dockerfileから作られるimage Container  library/nginx

Slide 37

Slide 37 text

Docker image 2015/11/30 37 FROM  debian:jessie RUN  apt-­‐key  adv -­‐-­‐keyserver hkp://pgp.mit.edu:80  -­‐-­‐recv-­‐keys   573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 RUN  echo  "deb  http://nginx.org/packages/mainline/debian/   jessie nginx"  >>  /etc/apt/sources.list ENV  NGINX_VERSION  1.9.7-­‐1~jessie ……… docker buildで Dockerfileから作られるimage (run時ReadOnly) Docker run後に変更されたイメージ領域 (run時Rewritable) Container  library/nginx

Slide 38

Slide 38 text

Docker commit 2015/11/30 38 FROM  debian:jessie RUN  apt-­‐key  adv -­‐-­‐keyserver hkp://pgp.mit.edu:80  -­‐-­‐recv-­‐keys   573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 RUN  echo  "deb  http://nginx.org/packages/mainline/debian/   jessie nginx"  >>  /etc/apt/sources.list ENV  NGINX_VERSION  1.9.7-­‐1~jessie ……… Container  library/nginx

Slide 39

Slide 39 text

Docker commit 2015/11/30 39 FROM  debian:jessie RUN  apt-­‐key  adv -­‐-­‐keyserver hkp://pgp.mit.edu:80  -­‐-­‐recv-­‐keys   573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 RUN  echo  "deb  http://nginx.org/packages/mainline/debian/   jessie nginx"  >>  /etc/apt/sources.list ENV  NGINX_VERSION  1.9.7-­‐1~jessie ……… FROM  my_container Container  my_container docker commit Container  library/nginx

Slide 40

Slide 40 text

生死判定 • Dockerはプロセス(重要) • DockerfileのCMDま たはdocker runコマンドで指定した親プロセス (PID1?)がkillされると死亡扱いになりdocker psで出てこなくなる • イメージは生きてるのでdocker ps –aで確認可能 • bashとかnginxみたいなデーモンプロセスを指定する必要がある • なので cat /proc/meminfo みたいなプロセスはdocker runした 瞬間に落ちるように見える(このあたりすげーハマった) • 複数のデーモ ンプ ロ セス(Webサー バー とDBMS)があ る場合は supervisordみたいなプロセス管理ツールを挟んで使ったりしましょう。 2015/11/30 40

Slide 41

Slide 41 text

ファイルシステム • 基本的にDocker imageの中で閉じている • ただし、以下の方法でホストOSや他のコンテナと共有するマウント ポジションを用意することができる • DockerfileのVOLUMEコマンド • docker runの-­‐vオプション 2015/11/30 41

Slide 42

Slide 42 text

ネットワーキング 2015/11/30 42 1.2.3.4 192.168.1.0/24 eth0 192.168.1.2/24 Dockerのホストマシンにはすでにeth0があるとします

Slide 43

Slide 43 text

ネットワーキング 2015/11/30 43 1.2.3.4 192.168.1.0/24 eth0 192.168.1.2/24 docker0 172.17.42.1/16 Dockerがインストールされるとdocker0という仮想 ブリッジアダプタが作成されます。 仮想ブリッジのIPアドレスはeth0のIPアドレス設定を 見て重複しないIPレンジを選択し、決定します

Slide 44

Slide 44 text

ネットワーキング 2015/11/30 44 1.2.3.4 192.168.1.0/24 eth0 192.168.1.2/24 docker0 172.17.42.1/16 NAP T docker0 は ホ ス ト マ シ ン の eth0 に NAPT を 介 し て 接続し、外部ネットワークに接続されます。 この設定はiptablesで行われます。

Slide 45

Slide 45 text

ネットワーキング 2015/11/30 45 1.2.3.4 192.168.1.0/24 eth0 192.168.1.2/24 docker0 172.17.42.1/16 NAP T コンテナが立ち上がると…

Slide 46

Slide 46 text

ネットワーキング 2015/11/30 46 1.2.3.4 192.168.1.0/24 eth0 192.168.1.2/24 docker0 172.17.42.1/16 NAP T veth eth0 172.17.0.1/16 docker0にveth(仮想EthernetAdapter)とコンテナのeth0が ペアで作成され、接続されます。

Slide 47

Slide 47 text

ネットワーキング 2015/11/30 47 1.2.3.4 192.168.1.0/24 eth0 192.168.1.2/24 docker0 172.17.42.1/16 NAP T veth eth0 172.17.0.1/16 Default Gatewayをdocker0として、IPアドレスはランダムに 決定されます。 コンテナのIPアドレスはDHCPではなく、dockerがコンテナ 内部に入って直接IPアドレスを書き込んでます。

Slide 48

Slide 48 text

ネットワーキング 2015/11/30 48 1.2.3.4 192.168.1.0/24 eth0 192.168.1.2/24 docker0 172.17.42.1/16 NAP T veth eth0 172.17.0.1/16 DockerfileのEXPOSEコマンドで指定されたポートがある場合は そのポートは自動で開放されます。(後述)

Slide 49

Slide 49 text

ネットワーキング 2015/11/30 49 1.2.3.4 192.168.1.0/24 eth0 192.168.1.2/24 docker0 172.17.42.1/16 NAP T veth veth veth eth0 172.17.0.1/16 eth0 172.17.0.2/16 eth0 172.17.0.3/16 veth(仮想EthernetAdapter)とコンテナのeth0のペアは コンテナの数だけ作成されます。

Slide 50

Slide 50 text

ネットワーキング ポート開放 2015/11/30 50 1.2.3.4 192.168.1.0/24 eth0 192.168.1.2/24 docker0 172.17.42.1/16 NAP T veth eth0 172.17.0.1/16 DockerfileのEXPOSEコマンドでport80が指定されている場合

Slide 51

Slide 51 text

ネットワーキング ポート開放 2015/11/30 51 1.2.3.4 192.168.1.0/24 eth0 192.168.1.2/24 docker0 172.17.42.1/16 NAP T veth eth0 172.17.0.1/16 docker0は172.17.0.1:80に アクセスできる

Slide 52

Slide 52 text

ネットワーキング ポート開放 2015/11/30 52 1.2.3.4 192.168.1.0/24 eth0 192.168.1.2/24 docker0 172.17.42.1/16 NAP T veth eth0 172.17.0.1/16 eht0は172.17.0.1:80にアクセスするために ポート フォ ワー ディング の設 定 を介して 接続することができる

Slide 53

Slide 53 text

ネットワーキング ポート開放 2015/11/30 53 1.2.3.4 192.168.1.0/24 eth0 192.168.1.2/24 docker0 172.17.42.1/16 NAP T veth eth0 172.17.0.1/16 docker run時に-­‐pオプションをつけること でコンテナの開放ポートとのマッピングを制 御可能 (ex: eth0のport8080とコンテナのport80を マッピングする)

Slide 54

Slide 54 text

もっといっぱい知りたい方は • 公式reference  v1.8(Eng) • https://docs.docker.com/v1.8/ • 前佛さんのスライド(Jpn) • http://www.slideshare.net/zembutsu/introduction-­to-­docker-­ management-­and-­operations-­2nd • Docker Introduction(Eng) • http://www.slideshare.net/dotCloud/docker-­intro-­november 2015/11/30 54

Slide 55

Slide 55 text

2015/11/30 55