Upgrade to Pro — share decks privately, control downloads, hide ads and more …

2015-11-30_dockerでドッカンドッカンする話

E4e1d6606bf31abb6272ee6764c7b388?s=47 Takeru Ichii
December 07, 2015

 2015-11-30_dockerでドッカンドッカンする話

初めてのDockerネタ。間違ってたら優しく教えて下さい。
いろいろまずければ削除します。

E4e1d6606bf31abb6272ee6764c7b388?s=128

Takeru Ichii

December 07, 2015
Tweet

Transcript

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

  2. おしながき • 仮想化技術今昔物語 • Dockerとは • Vagrantと何が違うの? • 立ててみる •

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

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

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

    (しかも動作中は変更不可)
  7. 仮想化技術今昔物語 Type-­2 Hypervisor型VM 2015/11/30 7 O S あとCPUとか ストレージとかも辛い

  8. 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
  9. 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
  10. 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やライブラリを 共有するので、展開が早く、オーバーヘッドは小さく、 簡単に移行できて、再起動も早い
  11. Dockerとは 2015/11/30 11 $  cat  /proc/meminfo MemTotal:      

             2050296  kB #  cat  /proc/meminfo MemTotal:                2050296  kB コンテナ ホストOS(boot2docker) ホストOSとコンテナはメモリを共有している
  12. 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からも見える (プロセスは分離)
  13. 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
  14. Dockerとは • DockerはVMではなくプロセスである • ホストOSとプロセスレベルの分離を行う(cgroups/Namespaces) • ただしメモリ・CPUはホストOS内で共有される • コンテナ↔ホストOS間でファイルシステムの分離を行う(後述) •

    ネットワークも分離する(後述) 2015/11/30 14
  15. Vagrantと何が違うの? なにかとよく一緒に出される印象のVagrantですが…(俺だけ?) • VagrantはVirtualBox/Chef等を一緒にした感じのツール • なので実際にはType-­2  Hypervisor型のVM • VirtualBoxはVMの構成管理をやってくれない •

    Vagrantなら構成管理をやってくれるのでスパっとVMを作ってくれる • DockerはVMではなくコンテナでプロセスを分離してくれるすごい奴 2015/11/30 15
  16. 2015/11/30 16 \ワイのほうが軽いんやで(ドヤァ)/

  17. 立ててみる • Linux • Linuxカーネルの機能を使うので、Dockerをインストールすれば 利用可能 • Windows/Mac • Linuxカーネルが無いのでboot2dockerでLinuxVMをbootし、

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

    その中でdockerを動かす 2015/11/30 18 #  wget -­‐qO-­‐ https://get.docker.com/  |  sh
  19. 2015/11/30 19

  20. 立ててみる 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/
  21. 立ててみる 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
  22. 立ててみる 2015/11/30 22 $  #dockerの公式イメージをDL $  docker pull  ubuntu:latest $

     #dockerコンテナを立てる $  docker run  ubuntu:latest #  #コンテナのbashに切り替わるのでubuntuのapt-­‐get試してみる #  apt-­‐get  upgrade #  うまく言ったらexitしてコンテナのプロセスを終了させる #  exit $
  23. 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
  24. Dockerfile コンテナの構成管理を行う 2015/11/30 24 FROM  debian:jessie MAINTAINER  NGINX  Docker Maintainers

     "docker-­‐maint@nginx.com" 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
  25. Dockerfile コンテナの構成管理を行う 25 FROM  debian:jessie MAINTAINER  NGINX  Docker Maintainers  "docker-­‐maint@nginx.com"

    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)
  26. Dockerfile コンテナの構成管理を行う 26 FROM  debian:jessie MAINTAINER  NGINX  Docker Maintainers  "docker-­‐maint@nginx.com"

    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の作者情報
  27. Dockerfile コンテナの構成管理を行う 27 FROM  debian:jessie MAINTAINER  NGINX  Docker Maintainers  "docker-­‐maint@nginx.com"

    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コマンドを指定する
  28. Dockerfile コンテナの構成管理を行う 2015/11/30 28 FROM  debian:jessie MAINTAINER  NGINX  Docker Maintainers

     "docker-­‐maint@nginx.com" 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コマンドでイメージ作成時に実行する コンテナ内部の環境変数を設定する
  29. Dockerfile コンテナの構成管理を行う 2015/11/30 29 FROM  debian:jessie MAINTAINER  NGINX  Docker Maintainers

     "docker-­‐maint@nginx.com" 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できないようにリスト削除
  30. Dockerfile コンテナの構成管理を行う 2015/11/30 30 FROM  debian:jessie MAINTAINER  NGINX  Docker Maintainers

     "docker-­‐maint@nginx.com" 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 外部のコンテナ等からマウントするための ポジションを設定
  31. Dockerfile コンテナの構成管理を行う 2015/11/30 31 FROM  debian:jessie MAINTAINER  NGINX  Docker Maintainers

     "docker-­‐maint@nginx.com" 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を指定
  32. Dockerfile コンテナの構成管理を行う 2015/11/30 32 FROM  debian:jessie MAINTAINER  NGINX  Docker Maintainers

     "docker-­‐maint@nginx.com" 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コマンドは一つしかかけない
  33. Dockerfile コンテナの構成管理を行う 2015/11/30 33 FROM  debian:jessie MAINTAINER  NGINX  Docker Maintainers

     "docker-­‐maint@nginx.com" 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/
  34. Docker image • Dockerfileからコンテナを実行するためには一度buildしてイメー ジを作成する必要があります • docker build  [  -­‐t

     {イメージ名} [  :{タグ名} ]  ]   {Dockerfileのあるディレクトリ} • Build時にどのようなことが起こっているか軽く説明します。 2015/11/30 34
  35. Docker image 2015/11/30 35 FROM  debian:jessie Container  debian:jessie

  36. 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
  37. 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
  38. 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
  39. 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
  40. 生死判定 • 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
  41. ファイルシステム • 基本的にDocker imageの中で閉じている • ただし、以下の方法でホストOSや他のコンテナと共有するマウント ポジションを用意することができる • DockerfileのVOLUMEコマンド •

    docker runの-­‐vオプション 2015/11/30 41
  42. ネットワーキング 2015/11/30 42 1.2.3.4 192.168.1.0/24 eth0 192.168.1.2/24 Dockerのホストマシンにはすでにeth0があるとします

  43. ネットワーキング 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レンジを選択し、決定します
  44. ネットワーキング 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で行われます。
  45. ネットワーキング 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 コンテナが立ち上がると…
  46. ネットワーキング 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が ペアで作成され、接続されます。
  47. ネットワーキング 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アドレスを書き込んでます。
  48. ネットワーキング 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コマンドで指定されたポートがある場合は そのポートは自動で開放されます。(後述)
  49. ネットワーキング 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のペアは コンテナの数だけ作成されます。
  50. ネットワーキング ポート開放 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が指定されている場合
  51. ネットワーキング ポート開放 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に アクセスできる
  52. ネットワーキング ポート開放 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にアクセスするために ポート フォ ワー ディング の設 定 を介して 接続することができる
  53. ネットワーキング ポート開放 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を マッピングする)
  54. もっといっぱい知りたい方は • 公式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
  55. 2015/11/30 55