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

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

Takeru Ichii
December 07, 2015

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

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

Takeru Ichii

December 07, 2015
Tweet

More Decks by Takeru Ichii

Other Decks in Programming

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

  6. 仮想化技術今昔物語
    Type-­2 Hypervisor型VM
    2015/11/30
    6
    VMの数だけ普通のマシンと同じ分だけメモリ消費

    ホストOSのメモリ搭載量には限界がある

    VMが確保できるメモリが小さくなる
    (しかも動作中は変更不可)

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  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やライブラリを
    共有するので、展開が早く、オーバーヘッドは小さく、
    簡単に移行できて、再起動も早い

    View Slide

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

    View Slide

  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からも見える
    (プロセスは分離)

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  19. 2015/11/30
    19

    View Slide

  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/

    View Slide

  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

    View Slide

  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
    $

    View Slide

  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

    View Slide

  24. 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

    View Slide

  25. 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)

    View Slide

  26. 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の作者情報

    View Slide

  27. 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コマンドを指定する

    View Slide

  28. 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コマンドでイメージ作成時に実行する
    コンテナ内部の環境変数を設定する

    View Slide

  29. 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できないようにリスト削除

    View Slide

  30. 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
    外部のコンテナ等からマウントするための
    ポジションを設定

    View Slide

  31. 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を指定

    View Slide

  32. 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コマンドは一つしかかけない

    View Slide

  33. 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/

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

  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レンジを選択し、決定します

    View Slide

  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で行われます。

    View Slide

  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
    コンテナが立ち上がると…

    View Slide

  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が
    ペアで作成され、接続されます。

    View Slide

  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アドレスを書き込んでます。

    View Slide

  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コマンドで指定されたポートがある場合は
    そのポートは自動で開放されます。(後述)

    View Slide

  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のペアは
    コンテナの数だけ作成されます。

    View Slide

  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が指定されている場合

    View Slide

  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に
    アクセスできる

    View Slide

  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にアクセスするために
    ポート フォ ワー ディング の設 定 を介して
    接続することができる

    View Slide

  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を
    マッピングする)

    View Slide

  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

    View Slide

  55. 2015/11/30
    55

    View Slide