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

世界一わかりみの深いDocker&コンテナ入門/wakarimidocker

 世界一わかりみの深いDocker&コンテナ入門/wakarimidocker

D0f5daa7cc3a26140c06ea29e5e235cc?s=128

Noriyuki TAKEI

November 27, 2020
Tweet

Transcript

  1. © SIOS Technology, Inc. All rights Reserved. 世界⼀わかりみの深い Docker&コンテナ⼊⾨ 〜

    Dockerの基礎からネットワーク・ファイルシステムまで〜 Noriyuki TAKEI 2020年11⽉27⽇ 2020/11/27開催 サイオステクノロジーオンライン勉強会資料
  2. © SIOS Technology, Inc. All rights Reserved. About Me 2

    BCPVUNF Noriyuki TAKEI ෢Ҫ ٓߦ Information • サイオステクノロジー株式会社 • Microsoft MVP for Azure • VS Code Meetup Organizer Favorites • Azure • Squash • Sweets blog https://tech-lab.sios.jp/ core skill Azure Kubernetes Service Cloud Native, Serverless全般 Twitter @noriyukitakei
  3. © SIOS Technology, Inc. All rights Reserved. ⽬次 1. コンテナってなに︖

    2. Dockerってなに︖ 3. Dockerfileってなに︖ 4. docker-composeってなに︖ 5. Dockerのネットワークってどうなってるの︖ 6. Dockerのファイルシステムってどうなってるの︖ 3
  4. © SIOS Technology, Inc. All rights Reserved. コンテナってなに︖ 4

  5. © SIOS Technology, Inc. All rights Reserved. コンテナってなに︖ 5 コンテナってなに︖

    コンテナとは、 平たく⾔ってしまえば、 単なるプロセスです。 本セッションの ブログのURL
  6. © SIOS Technology, Inc. All rights Reserved. コンテナってなに︖ 6 OSの中にOSが⽴てられます。

    何が出来るの︖ 似たようなのに 仮想化ってあっ たような・・・。 $FOU04 ϗετ04 8FCαʔόʔ༻$FOU04 σʔλϕʔε༻$FOU04 ϑΝΠϧαʔόʔ༻$FOU04
  7. © SIOS Technology, Inc. All rights Reserved. コンテナってなに︖ 7 仮想化との違い

    コンテナはOSが 不要な分だけ ⾼速︕︕                    Ծ૝Խ ίϯςφ     本セッションの ブログのURL
  8. © SIOS Technology, Inc. All rights Reserved. コンテナってなに︖ 8 仮想化との違い

    Docker上のプロセスとホストOS上のプロセスはカーネルを共有します。                         本セッションの ブログのURL
  9. © SIOS Technology, Inc. All rights Reserved. コンテナってなに︖ 9 以下のような2つのアプリケーションを⼀つのホストOS上に構築する

    ことを考えてみます。     ( . ( ΞϓϦ ) ;< )3)      ( - .) ( ΞϓϦ ) ;< )3) 
  10. © SIOS Technology, Inc. All rights Reserved. コンテナってなに︖ 10 仮想化だったら簡単︕︕

               ( . ( ΞϓϦ ) ;< )3)       ( - .) ( ΞϓϦ ) ;< )3)  本セッションの ブログのURL
  11. © SIOS Technology, Inc. All rights Reserved. コンテナってなに︖ 11 コンテナではどうやるの︖

        ( . ( ΞϓϦ ) = > )3)      ( - .) ( ΞϓϦ ) = > )3)  ?;< ?;< 本セッションの ブログのURL
  12. © SIOS Technology, Inc. All rights Reserved. コンテナってなに︖ 12 そこで

    コンテナでは超重要な概念である の出番です。 namespace 本セッションの ブログのURL
  13. © SIOS Technology, Inc. All rights Reserved. コンテナってなに︖ 13 namespaceとは︖

    プロセス、ファイル構造、ユーザーID、グループIDなどを⼀つのOSの中で分 離する技術である。 プログラム⾔語の中ではよく登場する概念である。Javaのパッケージと⾔う概 念とにているものがあり、同⼀の名称を使いたい場合(例えばUser.java)、 namespace を分けると実現可能となる。 コンテナのコアテクノロジーであるnamespaceという技術は2006年あたりに Linuxカーネルに実装された技術であり、最新の技術ではない。 package jp.sios.funcA User.java package jp.sios.funcB User.java
  14. © SIOS Technology, Inc. All rights Reserved. コンテナってなに︖ 14 (

    )2) )2) )2) 2 / A 1 B 2 B 1) 32) )2) )2) )2) / B A 2 2 1) 32) 2 2 2 2   $! "  # 2 本セッションの ブログのURL
  15. © SIOS Technology, Inc. All rights Reserved. コンテナってなに︖ 15 (

    )2) )2) )2) 2 / A 1 B 2 B 1) 32) )2) )2) )2) / B A 2 2 2 1) 32) 2 2 2 2      本セッションの ブログのURL
  16. © SIOS Technology, Inc. All rights Reserved. コンテナってなに︖ 16 では

    namespace(コンテナ) を 作ってみよう 本セッションの ブログのURL
  17. © SIOS Technology, Inc. All rights Reserved. コンテナってなに︖ 17 #

    ps ax PID TTY STAT TIME COMMAND 1 ? Ss 0:03 /sbin/init 2 ? S 0:00 [kthreadd] 4 ? I< 0:00 [kworker/0:0H] 6 ? I< 0:00 [mm_percpu_wq] 7 ? S 0:00 [ksoftirqd/0] 8 ? I 0:01 [rcu_sched] ………… # unshare --mount-proc -p --fork /bin/bash # ps ax PID TTY TIME CMD 1 pts/0 00:00:00 bash 11 pts/0 00:00:00 ps namespaceを作成する前は、 プロセスがたくさんあります。 namespace作成にはunshareコマンドを使います。 namespaceを作成したあと は、プロセス空間が別になる ので、bashのプロセスしか ないです。
  18. © SIOS Technology, Inc. All rights Reserved. コンテナってなに︖ 18 参考︓コンテナ技術⼊⾨

    https://employment.en-japan.com/engineerhub/entry/2019/02/05/103000 $ ROOTFS=$(mktemp -d) $ CID=$(sudo docker container create centos:centos7) $ sudo docker container export $CID | tar -x -C $ROOTFS $ ln -s /usr/local/bin/bash $ROOTFS/bin/bash $ sudo docker container rm $CID $ UUID=$(uuidgen) $ sudo cgcreate -t $(id -un):$(id -gn) -a $(id -un):$(id -gn) -g cpu,memory:$UUID $ cgset -r memory.limit_in_bytes=10000000 $UUID $ cgset -r cpu.cfs_period_us=1000000 $UUID $ cgset -r cpu.cfs_quota_us=300000 $UUID $ CMD="/bin/sh" $ cgexec -g cpu,memory:$UUID \ unshare -muinpfr /bin/sh -c " mount -t proc proc $ROOTFS/proc && touch $ROOTFS$(tty); mount --bind $(tty) $ROOTFS$(tty) && touch $ROOTFS/dev/pts/ptmx; mount --bind /dev/pts/ptmx $ROOTFS/dev/pts/ptmx && ln -sf /dev/pts/ptmx $ROOTFS/dev/ptmx && touch $ROOTFS/dev/null && mount --bind /dev/null $ROOTFS/dev/null && /bin/hostname $UUID && exec capsh --chroot=$ROOTFS --drop=cap_sys_chroot -- -c 'exec $CMD' " ファイルシステムやユーザー空間まで分けた実⽤的なCentOS7のnamespace(コ ンテナ)を作ります。
  19. © SIOS Technology, Inc. All rights Reserved. コンテナってなに︖ 19 先のコマンドは、以下の2つのことを実施しています。

                       7 7 本セッションの ブログのURL
  20. © SIOS Technology, Inc. All rights Reserved. コンテナってなに︖ 20 こんなにたくさんの

    コマンド打つの めんどくさい・・・ 本セッションの ブログのURL
  21. © SIOS Technology, Inc. All rights Reserved. コンテナってなに︖ 21 Dockerを使えば解決

    たった1⾏のコマンドで、 先程のダラダラ⻑いコマンドと同じことが 実現出来ます。 $ docker run -it centos:centos7 /bin/bash
  22. © SIOS Technology, Inc. All rights Reserved. コンテナってなに︖ 22 namespaceの作成その他コンテナ作成に必要な

    もろもろのコマンドの簡略化 コンテナを作成するの必要なOSのイメージを Docker Hubからダウンロード つまりDockerで実現できることは主に以下の2つです。
  23. © SIOS Technology, Inc. All rights Reserved. コンテナってなに︖ 23 ところで

    Docker Hubって なに︖ 本セッションの ブログのURL
  24. © SIOS Technology, Inc. All rights Reserved. コンテナってなに︖ 24 Docker

    Hubとは︖ 本セッションの ブログのURL
  25. © SIOS Technology, Inc. All rights Reserved. コンテナってなに︖ 25 Dockefileを

    使うと コンテナをカスタマイズ できます︕︕ 本セッションの ブログのURL
  26. © SIOS Technology, Inc. All rights Reserved. コンテナってなに︖ 26 CentOS7のイメージにApacheをインストールしてみます。そのため

    のDockerfileは以下のとおりです。 Dockerfile FROM centos:centos7 RUN yum –y install httpd CentOS7のイメージをダウンロード Apacheをインストール
  27. © SIOS Technology, Inc. All rights Reserved. コンテナってなに︖ 27 Dockerfileを作成し、以下のコマンドを実⾏すると、CentOS7のイ

    メージ上にApacheがインストールされたコンテナが作成されます。 本セッションの ブログのURL
  28. © SIOS Technology, Inc. All rights Reserved. コンテナってなに︖ 28 さらに作成したコンテナをもとにプライベートリポジトリにオリジナ

    ルイメージとしてプッシュ出来ます。 本セッションの ブログのURL
  29. © SIOS Technology, Inc. All rights Reserved. コンテナってなに︖ 29 さらにプライベートリポジトリにプッシュしたイメージを他の開発者

    に配ることも出来ます。 本セッションの ブログのURL
  30. © SIOS Technology, Inc. All rights Reserved. コンテナってなに︖ 30 もっと複雑な環境を構築するためにDockerfileです。

    Dockerfile FROM centos:centos7 ENV idp_version=3.4.6 # Inatall the libraries neccesary for building Shibboleth IdP RUN yum -y update && \ yum -y install wget java-1.8.0-openjdk # Download Shibboleth IdP RUN wget -q https://shibboleth.net/downloads/identity-provider/$idp_version/shibboleth-identity-provider- $idp_version.tar.gz && \ tar -zxvf shibboleth-identity-provider-$idp_version.tar.gz -C /opt && \ ln -s /opt/shibboleth-identity-provider-$idp_version/ /opt/shibboleth-idp COPY bin/ /usr/local/bin/ RUN chmod 750 /usr/local/bin/init-idp.sh
  31. © SIOS Technology, Inc. All rights Reserved. コンテナってなに︖ 31 開発環境の構築を例に

    仮想化との違いを 考えてみます。 本セッションの ブログのURL
  32. © SIOS Technology, Inc. All rights Reserved. コンテナってなに︖ 32 仮想化の場合

    本セッションの ブログのURL
  33. © SIOS Technology, Inc. All rights Reserved. コンテナってなに︖ 33 仮想化の場合

    本セッションの ブログのURL
  34. © SIOS Technology, Inc. All rights Reserved. コンテナってなに︖ Dockerイメージダウ ンロード

    Dockerイメージから コンテナを⽣成 コンテナの場合 ϓϥΠϕʔτ ϦϙδτϦ システム管理者 システム構成が変更になっ たDockerイメージをレポジ トリからにプッシュ 開発環境
  35. © SIOS Technology, Inc. All rights Reserved. コンテナってなに︖ 35 コンテナを⽤いると開発環境の構築において以下のようなメリットが

    あります。 開発者のPCにDockerさえインストールされていれ ば、イメージをダウンロードするだけで環境ができ あがるので、ミスがない コンテナはカーネルを含まず軽量なのでダウンロー ドが速い。よって可搬性がよい。
  36. © SIOS Technology, Inc. All rights Reserved. Dockerってなに︖ 36

  37. © SIOS Technology, Inc. All rights Reserved. Dockerってなに︖ 37 前章でDockerの基礎を説明したので、ここでDockerのライフサイク

    ルを説明する中でDockerの操作を説明します。 本セッションの ブログのURL
  38. © SIOS Technology, Inc. All rights Reserved. Dockerってなに︖ 38 なにはともあれ、まずはDockerイメージのダウンロードをします。

    以下のコマンドは、Docker HubからCentOSというイ メージで、タグがCentOS7(CentOSのバージョンが7) のDockerイメージをダウンロードするものです。 $ docker pull centos:centos7
  39. © SIOS Technology, Inc. All rights Reserved. Dockerってなに︖ 39 次にDockerイメージを元にコンテナを起動します。

    $ docker run --name test centos:centos7 /bin/echo hoge hoge 以下のコマンドを実⾏します。
  40. © SIOS Technology, Inc. All rights Reserved. Dockerってなに︖ 40 次にDockerコンテナを停⽌します。

    $ docker stop test 以下のコマンドを実⾏します。
  41. © SIOS Technology, Inc. All rights Reserved. Dockerってなに︖ 41 先程停⽌したコンテナを再開します。

    $ docker start test 以下のコマンドを実⾏します。
  42. © SIOS Technology, Inc. All rights Reserved. Dockerってなに︖ 42 先程作成したコンテナをイメージ化します。

    以下のコマンドを実⾏します。 $ docker commit test hoge
  43. © SIOS Technology, Inc. All rights Reserved. Dockerってなに︖ 43 先程作成したDockerイメージをレポジトリへPushします。

    以下のコマンドを実⾏します。 $ docker login $ docker tag hoge noriyukitakei/hoge:1.0 $ docker push noriyukitakei/hoge:1.0
  44. © SIOS Technology, Inc. All rights Reserved. Dockerってなに︖ 44 実践︕︕

    Apacheのコンテナを 起動︕︕ 本セッションの ブログのURL
  45. © SIOS Technology, Inc. All rights Reserved. Dockerってなに︖ 45 こんな環境を作ります。

    本セッションの ブログのURL
  46. © SIOS Technology, Inc. All rights Reserved. Dockerってなに︖ 46 Docker

    Hub httpd Dockerイメージ お休み中のコンテナ 稼働中のコンテナ PC httpd pull Docker HubからApacheのイメージをpullします。 以下のコマンドを実⾏します。 $ docker pull httpd:2.4.46
  47. © SIOS Technology, Inc. All rights Reserved. Dockerってなに︖ 47 Docker

    Hub httpd Dockerイメージ お休み中のコンテナ 稼働中のコンテナ PC httpd run Apacheのイメージからコンテナを起動します。 以下のコマンドを実⾏します。 $ docker run -p 8080:80 --name testweb httpd:2.4.41 httpd
  48. © SIOS Technology, Inc. All rights Reserved. Dockerってなに︖ 48 $

    docker run -p 8080:80 --name testweb httpd:2.4.41 localhostの8080で受けて、 コンテナの80へ転送する。 testwebという名前のコンテ ナを作成する。コンテナの名 前は、削除したりするのに必 要。 httpd:2.4.41という名前の Dockerイメージからコンテナ を作成する。 先程のコマンドの詳細です。
  49. © SIOS Technology, Inc. All rights Reserved. Dockerってなに︖ 49 ブラウザを⽴ち上げてhttp://localhost:8080にアクセスして下さい。

    以下のような画⾯が表⽰されれば成功ですヮ(゚д゚)ォ! 本セッションの ブログのURL
  50. © SIOS Technology, Inc. All rights Reserved. Dockerfileってなに︖ 50

  51. © SIOS Technology, Inc. All rights Reserved. Dockerfileってなに︖ 51 Dockerfileとは、Dockerのイ

    メージを作成する際に実⾏する コマンドをコード化して、⼀つ のファイルにまとめたものです。 本セッションの ブログのURL
  52. © SIOS Technology, Inc. All rights Reserved. Dockerfileってなに︖ 52 Dockerfileを使わない場合と

    使った場合を⽐較してみるとわ かりやすいです。 本セッションの ブログのURL
  53. © SIOS Technology, Inc. All rights Reserved. Dockerfileってなに︖ 53 以下のユースケースをDockerfileを使わない場合と使った場合で⽐較

    してみます。 CentOSを構築する。 ApacheとPHPをインストールする。 簡単なPHPアプリを作成する。 本セッションの ブログのURL
  54. © SIOS Technology, Inc. All rights Reserved. Dockerfileってなに︖ 54 Dockerfileを使わない場合

    まずはCentOS7のイメージからtestwebというコンテナを作成してデーモンと して起動し、ローカルの8080にアクセスしたらコンテナの80にポートフォ ワードされるようにします。 $ docker run -d -it -p 8080:80 --name testweb centos:centos7 ※ PHPのOfficialイメージを利⽤すればラクチンで実現できますが、ここでは 説明のためにあえて、⾯倒な⽅法でやっていますm(_ _)m
  55. © SIOS Technology, Inc. All rights Reserved. Dockerfileってなに︖ 55 Dockerfileを使わない場合

    コンテナにログインします。 $ docker exec -it testweb /bin/bash Apacheをインストールします。 # yum install httpd 本セッションの ブログのURL
  56. © SIOS Technology, Inc. All rights Reserved. Dockerfileってなに︖ 56 Dockerfileを使わない場合

    phpをインストールします。 # yum install php Apacheを起動します。 # /usr/sbin/httpd 本セッションの ブログのURL
  57. © SIOS Technology, Inc. All rights Reserved. Dockerfileってなに︖ 57 Dockerfileを使わない場合

    コンテナから抜けます。 # exit 1 2 3 <?php echo "hoge"; ?> 以下のようなPHPファイルを作成します。 本セッションの ブログのURL
  58. © SIOS Technology, Inc. All rights Reserved. Dockerfileってなに︖ 58 Dockerfileを使わない場合

    コンテナにコピーします。 $ docker cp test.php testweb:/var/www/html http://localhost:8080/test.phpにアクセスして、以下ような画⾯が表⽰され れば成功です。 本セッションの ブログのURL
  59. © SIOS Technology, Inc. All rights Reserved. Dockerfileってなに︖ 59 まんどくさ

    本セッションの ブログのURL
  60. © SIOS Technology, Inc. All rights Reserved. Dockerfileってなに︖ 60 Dockerfile使う場合

    以下のDockerfileを作成します。ファイル名はDockerfileとして下さい。 1 2 3 4 5 6 7 FROM centos:centos7 RUN yum -y install httpd php COPY test.php /var/www/html/ CMD ["/usr/sbin/httpd","-DFOREGROUND"] 本セッションの ブログのURL
  61. © SIOS Technology, Inc. All rights Reserved. Dockerfileってなに︖ 61 Dockerfileを使う場合

    先程作成したDockerfileのあるディレクトリで以下のコマンドを実施して下さい。 $ docker build -t testphpimg . Sending build context to Docker daemon 3.072kB Step 1/4 : FROM centos:centos7 ---> 5e35e350aded Step 2/4 : RUN yum -y install httpd php ---> Running in afff37dc945e ... Successfully built 63fa8ae5a4b5 Successfully tagged testphpimg:latest 本セッションの ブログのURL
  62. © SIOS Technology, Inc. All rights Reserved. Dockerfileってなに︖ 62 Dockerfileを使う場合

    先程のイメージからコンテナを作成します。 $ docker run -d -p 8080:80 --name testphpimg testweb:latest http://localhost:8080/test.phpにアクセスしますと先程と同じ結果になる と思います。 本セッションの ブログのURL
  63. © SIOS Technology, Inc. All rights Reserved. Dockerfileってなに︖ 63 先のDockerfileを使うと、内部的には以下のようなことが起きていま

    す。 本セッションの ブログのURL
  64. © SIOS Technology, Inc. All rights Reserved. Dockerfileってなに︖ 64 Dockerfileを使ったコンテナの作成は以下の3つのプロセスで⾏われ

    ます。次ページからは、最初の例を元にそのプロセスを解説します。 Dockerfileを作成 docker buildコマンドで Dockerfileを元にイメージを作成 作成したイメージを元にコンテナを起動 本セッションの ブログのURL
  65. © SIOS Technology, Inc. All rights Reserved. Dockerfileってなに︖ 65 Dockerfileを作成

    Dockerfileとは、Docker Hubから取得したイメージに対して実施したいコマ ンドを書いたものです。先程作成したDockerfileを再び⾒てみましょう。 1 2 3 4 5 6 7 FROM centos:centos7 RUN yum -y install httpd php COPY test.php /var/www/html/ CMD ["/usr/sbin/httpd","-DFOREGROUND"] 次ページより1⾏ずつ解説します。 本セッションの ブログのURL
  66. © SIOS Technology, Inc. All rights Reserved. Dockerfileってなに︖ 66 Dockerfileを作成

    1 FROM centos:centos7 これは、FROMで指定したDockerイメージをベースに、これから記述するコ マンドを実施しますよという意味です。今回の例ではCentOS7のイメージを ベースに、様々なコマンドを実⾏するという意味になります。このFROMで指 定したイメージをベースイメージと呼びます。 本セッションの ブログのURL
  67. © SIOS Technology, Inc. All rights Reserved. Dockerfileってなに︖ 67 Dockerfileを作成

    3 RUN yum -y install httpd php FROMで指定したイメージに対してコマンドを実⾏するためにはRUNを使いま す。このケースでは、ApacheとPHPをインストールします。 5 COPY test.php /var/www/html/ COPYは、ローカルにあるファイルをイメージ上にコピーします。この場合は、 test.phpを/var/www/htmlディレクトリにコピーします。
  68. © SIOS Technology, Inc. All rights Reserved. Dockerfileってなに︖ 68 Dockerfileを作成

    7 CMD ["/usr/sbin/httpd","-DFOREGROUND"] CMDはコンテナ起動時に実⾏するコマンドを指定します。[]で囲って記述して、 その中に配列みたいに⼊れていきます。1つ⽬実⾏するコマンド、2つ⽬以降は コマンドの引数を⼊れていきます。この例ではApacheを起動しています。 本セッションの ブログのURL
  69. © SIOS Technology, Inc. All rights Reserved. Dockerfileってなに︖ 69 Dockerfileを作成

    RUNもCOPYもCMDもコマ ンドを実⾏するものです。 では、その違いはなんで しょうか︖それは実⾏タイ ミングの違いです。イメー ジにしてみました。
  70. © SIOS Technology, Inc. All rights Reserved. Dockerfileってなに︖ 70 docker

    buildコマンドでDockerfileを元にイメージを作成 次に1で作成したDockerfileを元にApache、PHPがインストールされ、実⾏し たPHPファイルtest.phpを含むイメージを作成します。そのためにはdocker buildコマンドを使います。 $ docker build -t testphpimg . ビルドした結果作成される Dockerイメージの名前を指定 する。 Dockerfileの場所を指定する。ドットだけ だと、このコマンドを実⾏したのと同じ ディレクトリにあるDockerfileという名前 のファイルが指定される。 本セッションの ブログのURL
  71. © SIOS Technology, Inc. All rights Reserved. Dockerfileってなに︖ 71 作成したイメージを元にコンテナを起動

    では、先程作成したイメージを元にコンテナを起動してみます。 $ docker run -d -p 8080:80 --name testweb testphpimg:latest http://localhost:8080/test.phpにアクセスしますと先程と同じ結果になる と思います。 本セッションの ブログのURL
  72. © SIOS Technology, Inc. All rights Reserved. docker-composeってなに︖ 72

  73. © SIOS Technology, Inc. All rights Reserved. docker-composeってなに︖ 73 docker-composeとは、複数のコンテナからなる⼀つのシステムの構築をラクチンにす

    るためのツールであり、⾮常に頻繁に使われるツールでもあります。この説明だけだと、 イマイチわかりにくいかと思いますので、以下のユースケースをもとに「docker- composeを使わない場合」「docker-composeを使う場合」で説明してみます。 PCのブラウザからは80番ポート(HTTPプロトコル)で WordPressのコンテナにアクセスします。 WordPressのコンテナからは3306番ポート(MySQLプ ロトコル)でMySQLにアクセスします。 WordPressもMySQLもDockerの公式イメージを使う こととします。
  74. © SIOS Technology, Inc. All rights Reserved. docker-composeってなに︖ 74 docker-composeを使わない場合

    まず、Dockerのネットワークを作成します。 $ docker network create wp-network 本セッションの ブログのURL
  75. © SIOS Technology, Inc. All rights Reserved. docker-composeってなに︖ 75 docker-composeを使わない場合

    次にMySQLのコンテナを起動します。Dockerの公式イメージを利⽤します。 $ docker run -d --name mysql \ # mysqlという名前のコンテナを作成し、デーモンで起動する --network wp-network \ # 先程作成したwp-networkをいうネットワークに所属させる -e MYSQL_ROOT_PASSWORD=wordpress \ # コンテナ内で利⽤する環境変数を定義する -e MYSQL_DATABASE=wordpress \ -e MYSQL_USER=wordpress \ -e MYSQL_PASSWORD=wordpress \ mysql:8.0.20 # MySQLのイメージ名を定義する 本セッションの ブログのURL
  76. © SIOS Technology, Inc. All rights Reserved. docker-composeってなに︖ 76 docker-composeを使わない場合

    WordPressのコンテナを起動します。Dockerの公式イメージを利⽤します。 $ docker run -d --name wordpress \ # wordpressという名前のコンテナを作成し、デーモンで 起動する --network wp-network \ # 先程作成したwp-networkをいうネットワークに所属させる -p 80:80 \ # localhostの80番宛のポートをコンテナの80番に転送する -e WORDPRESS_DB_HOST=mysql:3306 \ #コンテナ内で利⽤する環境変数を定義する -e WORDPRESS_DB_NAME=wordpress \ -e WORDPRESS_DB_USER=wordpress \ -e WORDPRESS_DB_PASSWORD=wordpress \ wordpress:php7.4-apache # WordPressのイメージ名を定義する 本セッションの ブログのURL
  77. © SIOS Technology, Inc. All rights Reserved. docker-composeってなに︖ 77 まんどくさ

    本セッションの ブログのURL
  78. © SIOS Technology, Inc. All rights Reserved. docker-composeってなに︖ 78 docker-composeを使う場合

    右のファイルをdocker- compose.ymlという ファイル名で作成します。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 version: '3' services: mysql: image: mysql:8.0.20 restart: always environment: MYSQL_ROOT_PASSWORD: wordpress MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress wordpress: depends_on: - mysql image: wordpress:php7.4-apache ports: - "80:80" restart: always environment: WORDPRESS_DB_HOST: mysql:3306 WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress 本セッションの ブログのURL
  79. © SIOS Technology, Inc. All rights Reserved. docker-composeってなに︖ 79 docker-composeを使う場合

    そして以下のコマンドを実⾏します。これだけ︕︕ $ docker-compose up -d ※ 事前に以下の⼿順でdocker-composeのインストールが必要です。1.25.5の部分は2020年6 ⽉3⽇時点での最新バージョンです。その時の最新バージョンはこちらのリンクから「Latest release」と記載のあるものをダウンロードして下さい。 $ sudo curl -L "https://github.com/docker/compose/releases/download/1.25.5/docker- compose-$(uname-m)" -o /usr/local/bin/docker-compose $ sudo chmod +x /usr/local/bin/docker-compose
  80. © SIOS Technology, Inc. All rights Reserved. docker-composeってなに︖ 80 docker-composeを使う場合

    先程のdocker-compose.ymlのファイルの詳細について説明します︕︕ 1 version: '3' docker-compose.ymlのファイルフォーマットのバージョンを表しています。本記事執筆時点で⼀ 番安定して利⽤できるのが3だと思いますので、3としています。 3 services: docker-composeではサービスという単位でコンテナを管理します。サービス=コンテナと考えて 差し⽀えありません。そして、このservicesの下にネストさせて、各コンテナをサービスとして記 述していきます。
  81. © SIOS Technology, Inc. All rights Reserved. docker-composeってなに︖ 81 docker-composeを使う場合

    4 5 mysql: image: mysql:8.0.20 ここでは、MySQLのサービス(コンテナ)の定義をしています。DockerHubからMySQLの公式イメー ジを取得します。 6 restart: always restartポリシーの定義です。これをalwaysにするとホストOSやDockerデーモン起動時にコンテナ が⾃動的に起動します。PCを⽴ち上げたらコンテナも合わせて起動したいときに便利です。
  82. © SIOS Technology, Inc. All rights Reserved. docker-composeってなに︖ 82 docker-composeを使う場合

    7 8 9 10 11 environment: MYSQL_ROOT_PASSWORD: wordpress MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress これは環境変数の定義です。docker-composeでは、environmentでコンテナに与える環境変数を定 義します。 例えば上記の記述の⼀番最上部の「MYSQL_ROOT_PASSWORD: wordpress」の意味は、 MYSQL_ROOT_PASSWORDという環境変数にwordpressという値を⼊れますよというものになりま す。 MySQLのコンテナは、データベース構築に必要な情報を環境変数で定義します。上記の定義では、そ れぞれ上から順にMySQLのROOTパスワード、MySQLに作成するデータベース名、データベースに接 続するためのユーザー、データベースに接続するためのパスワードにを表しています。
  83. © SIOS Technology, Inc. All rights Reserved. docker-composeってなに︖ 83 docker-composeを使う場合

    13 14 15 wordpress: depends_on: - mysql 次は、WordPressのサービス(コンテナ)の定義です。「depends_on」は起動順序を制御します。 WordPressはMySQLに接続するので、WordPressよりも先にMySQLを起動するよう順番を制御しま す。上記のように先に起動したいサービスのサービス名(ここではMySQL)を記述します。 ただし、ここで注意事項があります。これはあくまで起動順序を制御するものであり起動完了を保証 するものではありません。この定義を⾏うと、MySQL→WordPressの順に起動はしますが、MySQL の起動が完了するまえにWordPressが⽴ち上がってしまうことがあります。完全に起動順序を保証し たい場合には、起動スクリプトなどで、事前に⽴ち上がっていてほしいサービスが⽴ち上がっている がどうかをチェックする必要があります。
  84. © SIOS Technology, Inc. All rights Reserved. docker-composeってなに︖ 84 docker-composeを使う場合

    16 image: wordpress:php7.4-apache WordPressの公式イメージを取得する定義です。 17 18 ports: - "80:80" PCのlocalostの80番ポートあてにアクセスすると、コンテナの80番ポートあてに転送させるための定 義です。 19 restart: always 先程ご説明したrestartポリシーの定義です。
  85. © SIOS Technology, Inc. All rights Reserved. docker-composeってなに︖ 85 docker-composeを使う場合

    20 21 22 23 environment: WORDPRESS_DB_HOST: mysql:3306 WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress 先程ご説明した環境変数の定義です。環境変数の内容は、それぞれ上から順にWordPressが接続する MySQLのホスト名、データベース名、ユーザー名、パスワードになります。WordPressのコンテナで は、これらの環境変数を読み取り、MySQLへの接続に使っています。 ここでのポイントは、WORDPRESS_DB_HOSTの値です。mysql:3306となっています。同じ docker-conpose.yml内で定義したコンテナ同⼠は、サービス名でアクセスできるようになっていま す。
  86. © SIOS Technology, Inc. All rights Reserved. Dockerのネットワークってどうなってるの︖ 86

  87. © SIOS Technology, Inc. All rights Reserved. Dockerのネットワークってどうなってるの︖ 87 Dockerのネットワークは以下のようになっています。

    本セッションの ブログのURL
  88. © SIOS Technology, Inc. All rights Reserved. Dockerのネットワークってどうなってるの︖ 88 こう考えるとわかりやすい︖Dockerのネットワークを物理サーバー

    に置き換えてみました︕︕ 本セッションの ブログのURL
  89. © SIOS Technology, Inc. All rights Reserved. Dockerのネットワークってどうなってるの︖ 89 Dockerのネットワークを構成しているコアな技術は以下の3つ︕︕

    Network Namespace ルーティングテーブルなどネットワークを動作させるのに 必要な機能が完全に分離された環境を作るためのものです。 仮想スイッチ PC内で物理のL2スイッチと同じように振る舞うのが仮想 スイッチと⾔われるものです。これもカーネルが持ってい る機能で、ip linkコマンドで作成することができます。 仮想 ネットワーク インターフェース 仮想的なネットワークインターフェースで、ip link addコ マンドで作成することができます。
  90. © SIOS Technology, Inc. All rights Reserved. Dockerのネットワークってどうなってるの︖ 90 Netowork

    Namespaceってなに︖Network Namespaceがない状態 で仮想NICを2つ作ると。。。 本セッションの ブログのURL
  91. © SIOS Technology, Inc. All rights Reserved. Dockerのネットワークってどうなってるの︖ 91 Netowork

    Namespaceがあると。。。 本セッションの ブログのURL
  92. © SIOS Technology, Inc. All rights Reserved. Dockerのネットワークってどうなってるの︖ 92 実際にネットワークを作ってみましょう︕︕Dockerコマンドを使うとラクチンですが、あえてそれは使

    わないでやってみます。でもいまから説明することは、知らないうちにDockerコマンドが裏側でやって います。今回のゴールは以下のネットワークを作成することです。 本セッションの ブログのURL
  93. © SIOS Technology, Inc. All rights Reserved. Dockerのネットワークってどうなってるの︖ 93 最初はなにもない以下のような状態です。

    本セッションの ブログのURL
  94. © SIOS Technology, Inc. All rights Reserved. Dockerのネットワークってどうなってるの︖ 94 Network

    Namespaceを作成します。 # ip netns add ns1 # ip netns add ns2 Network Namespaceが出来 ました。 本セッションの ブログのURL
  95. © SIOS Technology, Inc. All rights Reserved. Dockerのネットワークってどうなってるの︖ 95 次に仮想スイッチを作成します。

    # ip link add br0 type bridge 仮想スイッチが出来ました。 本セッションの ブログのURL
  96. © SIOS Technology, Inc. All rights Reserved. Dockerのネットワークってどうなってるの︖ 96 以下の仮想ネットワークインターフェースを作成します。

    ns-veth1 先程作成したNetwork Namespaceであるns1の⽅に接続される 仮想NIC br-veth1 ns-veth1とペアで作成され、仮想スイッチに接続される仮想NIC ns-veth2 先程作成したNetwork Namespaceであるns2の⽅に接続される 仮想NIC br-veth2 ns-veth2とペアで作成され、仮想スイッチに接続される仮想NIC rt-veth 物理NICとルーティングされる仮想NIC br-veth3 rt-vethとペアで作成され、仮想スイッチに接続される仮想NIC
  97. © SIOS Technology, Inc. All rights Reserved. Dockerのネットワークってどうなってるの︖ 97 #

    ip link add name ns-veth1 type veth peer name br-veth1 # ip link add name ns-veth2 type veth peer name br-veth2 # ip link add name rt-veth type veth peer name br-veth3 仮想NICが出来ました。 本セッションの ブログのURL
  98. © SIOS Technology, Inc. All rights Reserved. Dockerのネットワークってどうなってるの︖ 98 Network

    Namespaceに仮想ネットワークインターフェースを接続 します。 # ip link set ns-veth1 netns ns1 # ip link set ns-veth2 netns ns2 接続出来ました。
  99. © SIOS Technology, Inc. All rights Reserved. Dockerのネットワークってどうなってるの︖ 99 仮想スイッチに仮想ネットワークインターフェースを接続します。

    # ip link set dev br-veth1 master br0 # ip link set dev br-veth2 master br0 # ip link set dev br-veth3 master br0 接続出来ました。
  100. © SIOS Technology, Inc. All rights Reserved. Dockerのネットワークってどうなってるの︖ 100 仮想NICと仮想スイッチをUpをしたり、IPアドレスを付与したりし

    ます。 # ip netns exec ns1 ip link set ns-veth1 up # ip netns exec ns2 ip link set ns-veth2 up # ip link set rt-veth up # ip link set br-veth1 up # ip link set br-veth2 up # ip link set br-veth3 up # ip link set br0 up # ip netns exec ns1 ip addr add 192.168.0.1/24 dev ns-veth1 # ip netns exec ns2 ip addr add 192.168.0.2/24 dev ns-veth2 # ip addr add 192.168.0.100/24 dev rt-veth ▪ 仮想NICと仮想スイッチのUp ▪ IPアドレスの付与
  101. © SIOS Technology, Inc. All rights Reserved. Dockerのネットワークってどうなってるの︖ 101 こうなります。

    本セッションの ブログのURL
  102. © SIOS Technology, Inc. All rights Reserved. Dockerのネットワークってどうなってるの︖ 102 動作確認します。

    # ip netns exec ns1 ping 192.168.0.2 64 bytes from 192.168.0.2: icmp_seq=1 ttl=64 time=0.071 ms ・・・以下略・・・ 本セッションの ブログのURL
  103. © SIOS Technology, Inc. All rights Reserved. Dockerのネットワークってどうなってるの︖ 103 GoogleのパブリックDNSにPing打ってみます。

    # ip netns exec ns1 ping 8.8.8.8 connect: Network is unreachable 本セッションの ブログのURL
  104. © SIOS Technology, Inc. All rights Reserved. Dockerのネットワークってどうなってるの︖ 104 原因は以下の3つ・・・

    IP転送が有効になっていない Network Namespace内で デフォルトゲートウェイが設定されてない NATされていない
  105. © SIOS Technology, Inc. All rights Reserved. Dockerのネットワークってどうなってるの︖ 105 IP転送が有効になっていない

    本セッションの ブログのURL
  106. © SIOS Technology, Inc. All rights Reserved. Dockerのネットワークってどうなってるの︖ 106 IP転送が有効になっていない

    → これで解決︕︕ # echo 1 > /proc/sys/net/ipv4/ip_forward 本セッションの ブログのURL
  107. © SIOS Technology, Inc. All rights Reserved. Dockerのネットワークってどうなってるの︖ 107 Network

    Namespace内でデフォルトゲートウェイが設定されてな い ここをns1とns2のデ フォゲにする必要がある。 本セッションの ブログのURL
  108. © SIOS Technology, Inc. All rights Reserved. Dockerのネットワークってどうなってるの︖ 108 Network

    Namespace内でデフォルトゲートウェイが設定されてな い → これで解決︕︕ # ip netns exec ns1 ip route add default via 192.168.0.100 # ip netns exec ns2 ip route add default via 192.168.0.100 本セッションの ブログのURL
  109. © SIOS Technology, Inc. All rights Reserved. Dockerのネットワークってどうなってるの︖ 109 NATされていない

    ns1というNetwork Namespaceから8.8.8.8あてのパケットの送信元IPアドレ スと宛先IPアドレスは以下のようになっています。 送信元IPアドレス 192.168.0.1 宛先IPアドレス 8.8.8.8 このアドレスでは外部ネットワークへは届きません。送信元IPアドレスがプライ ベートアドレスだからです。インターネットに出るときには、送信元を物理NIC のIPアドレスに変換する必要はあります。つまりNATする必要があります。 送信元IPアドレス 物理NICのIPアドレス 宛先IPアドレス 8.8.8.8
  110. © SIOS Technology, Inc. All rights Reserved. Dockerのネットワークってどうなってるの︖ 110 NATされない

    → これで解決︕︕ # iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE ルーティングが終わった後に、送信元が192.168.0.0/24で、かつeth0という ネットワークデバイスから出ていくパケットの送信元アドレスをeth0のアドレ ス、つまり物理NICのアドレスに変更するという内容です。 本セッションの ブログのURL
  111. © SIOS Technology, Inc. All rights Reserved. Dockerのネットワークってどうなってるの︖ 111 再び動作確認︕︕

    # ip netns exec ns1 ping 8.8.8.8 PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data. 64 bytes from 8.8.8.8: icmp_seq=1 ttl=127 time=12.9 ms ・・・以下略・・・ 本セッションの ブログのURL
  112. © SIOS Technology, Inc. All rights Reserved. Dockerのネットワークってどうなってるの︖ 112 ちなみに外部ネットワークへのパケットはこのように流れています。まずNetwork

    Namespaceのns1から出たパケットは、宛先が192.169.0.0/24宛ではないので、先程 設定したデフォルトゲートウェイの設定により、rt-veth(192.168.0.100)に向かいます。 本セッションの ブログのURL
  113. © SIOS Technology, Inc. All rights Reserved. Dockerのネットワークってどうなってるの︖ 113 IP転送の設定によるrt-vethから物理NICにルーティングされます。

    本セッションの ブログのURL
  114. © SIOS Technology, Inc. All rights Reserved. Dockerのネットワークってどうなってるの︖ 114 iptablesコマンドで⾏ったNATの設定により、送信元IPアドレスが物理NICのIPアドレス

    に変換されます。 本セッションの ブログのURL
  115. © SIOS Technology, Inc. All rights Reserved. Dockerのネットワークってどうなってるの︖ 115 パケットがインターネットに出ていきます。

    本セッションの ブログのURL
  116. © SIOS Technology, Inc. All rights Reserved. Dockerのネットワークってどうなってるの︖ 116 ちなみにDockerなら以下のコマンドで⼀発でネットワーク構築できる︕︕

    # docker run -it -d --name test01 centos:centos7 # docker run -it -d --name test02 centos:centos7 本セッションの ブログのURL
  117. © SIOS Technology, Inc. All rights Reserved. Dockerのネットワークってどうなってるの︖ 117 docker0というのは、Dockerをインストールしたときにデフォルトで作成される仮想ス

    イッチです。特に何も指定せずコンテナを作成すると、このdocker0に接続されます。新 しく2つのコンテナを作成したので、「veth9f0eb93」「veth7010a0b」という新たに2 つの仮想NICが出来上がっています。 # ip addr show ・・・略・・・ 5: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:be:19:a5:0e brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 valid_lft forever preferred_lft forever inet6 fe80::42:beff:fe19:a50e/64 scope link valid_lft forever preferred_lft forever 32: veth9f0eb93@if31: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default link/ether fa:43:35:64:5a:8b brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet6 fe80::f843:35ff:fe64:5a8b/64 scope link valid_lft forever preferred_lft forever 34: veth7010a0b@if33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default link/ether 2e:f1:f5:7d:0f:0e brd ff:ff:ff:ff:ff:ff link-netnsid 1 inet6 fe80::2cf1:f5ff:fe7d:f0e/64 scope link valid_lft forever preferred_lft forever
  118. © SIOS Technology, Inc. All rights Reserved. Dockerのネットワークってどうなってるの︖ 118 docker0の仮想スイッチに接続されている仮想NICを⾒てみます。確かに先程の

    「veth9f0eb93」「veth7010a0b」という仮想NICがdocker0という仮想スイッチに接 続されているのがわかります。 # ip link show master docker0 32: veth9f0eb93@if31: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP mode DEFAULT group default link/ether fa:43:35:64:5a:8b brd ff:ff:ff:ff:ff:ff link-netnsid 0 34: veth7010a0b@if33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP mode DEFAULT group default link/ether 2e:f1:f5:7d:0f:0e brd ff:ff:ff:ff:ff:ff link-netnsid 1
  119. © SIOS Technology, Inc. All rights Reserved. Dockerのネットワークってどうなってるの︖ 119 では、各コンテナのデフォルトゲートウェイも調べてみましょう。docker

    inspectコマ ンドでコンテナの詳細情報を⾒ることが出来ます。–formatオプションを使うと、出⼒ する情報を整形出来ます。デフォルトゲートウェイの情報のみを出すように整形してみ ます。 # docker inspect --format '{{.NetworkSettings.Gateway}}' test01 172.17.0.1 # docker inspect --format '{{.NetworkSettings.Gateway}}' test02 172.17.0.1 本セッションの ブログのURL
  120. © SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 120

  121. © SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 121 DockerはOverlayFSという、ちょっと特殊なファイルシステムを使って、劇的な容量の

    削減を⾏っています。ちょうどPhotoshopのレイヤーのイメージに近い感じです。 layer01〜layer03ディレクト リにあるファイルをマージし たものがmergedディレクトリ に表⽰される
  122. © SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 122 上位のレイヤーに同名のファイ

    ルがあった場合、それが mergedディレクトリに表⽰さ れる。この場合は、layer03 ディレクトリにあるファイルB がmergedディレクトリに表⽰ される。
  123. © SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 123 実際に⼿を動かして

    やってみよう︕︕ 本セッションの ブログのURL
  124. © SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 124 重ね合わせるレイヤーのベースとなるディレクトリです。先程のイメージ

    図で記載した「layer01〜layer03ディレクトリ」に相当します。 OverlayFSの仕組み上、このディレクトリのファイルに対して変更がされる ことはないので、基本的にこのディレクトリは読み込み専⽤でOKです。 lowerdir これからOverlayFSの実際の動きをご説明するとともに、実際にコマ ンド叩いて実践したいと思います。まず、その前にちょっと説明させ てください。OverlayFSには以下の4つのレイヤーの概念があります。 内部的に利⽤される作業⽤ディレクトリです。 upperdir mergeddirに対して変更をかけたファイルが保存されるディレクトリです。 workdir lowerdirとupperdirを結合したディレクトリです。ファイルに対して追 加・変更・削除などの操作を⾏うディレクトリでもあります。 mergeddir
  125. © SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 125 OverlayFSで右図のようなディレ

    クトリ構造を作成してみます。
  126. © SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 126 先の図のファイルシステム構成を実現するために以下のコマンドを実

    ⾏します。 # mkdir merged # mkdir upper # mkdir lower01 lower02 # echo "hoge" > lower01/hoge.txt # echo "fuga" > lower02/fuga.txt # mkdir work # mount -t overlay overlay \ –o lowerdir=lower02:lower01, \ upperdir=upper,\ workdir=work merged
  127. © SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 127 ⼀番気になるmountコマンドの説明です。

    # mount -t overlay overlay \ –o lowerdir=lower02:lower01, \ upperdir=upper,\ workdir=work merged mountのタイプです。 mountしたものに⼀意の名前を つけます。 lowerdirの指定です。 upperdirの指定です。 workdirの指定です。 mergeddirの指定です。
  128. © SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 128 期待通りの動作になっているかどうかを確認します。

    # ls merged fuga.txt hoge.txt # mergedディレクトリにlower01、02にあるファイルが表 ⽰されている # cat merged/hoge.txt # ファイルの中⾝は、lower01にあるhoge.txtと同じ hoge # cat merged/fuga.txt # ファイルの中⾝は、lower02にあるfuga.txtと同じ fuga
  129. © SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 129 では、次にlower02ディ

    レクトリにhoge2という 内容のhoge.txtを追加し てみます。lower02のほ うがlower01より上のレ イヤーなので、merged ディレクトリのhoge.txt の中⾝はhoge2になるは ずです。右図のような構 成ですね。
  130. © SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 130 期待通りの動作になっているかどうかを確認します。

    # umount overlay # 読み取り専⽤なので⼀度unmoutする # echo “hoge2” > lower02/hoge.txt # lower02にhoge2という内容の hoge.txtを追加する。 # mount -t overlay overlay -o lowerdir=lower02:lower01,upperdir=upper,workdir=work merged # ls merged fuga.txt hoge.txt # cat merged/hoge.txt # 確かにlower02にあるhoge.txtの内容が表⽰され る。 hoge2
  131. © SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 131 ここからは実際に発⽣する以下のユースケースを元にOverlayFSの動きを⾒てみます。

    ファイルを追加するときの動き ファイルを更新するときの動き ファイルを削除するときの動き
  132. © SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 132 ファイルを追加するときの動き

    ユーザーに⾒えるのはmergeddir であり、ユーザーはこのmerged ディレクトリにファイルを追加す るオペレーションをするわけです が、OverlayFS的にはpiyo.txtは upperディレクトリに追加されま す。そして、upperディレクトリ に書き込まれたファイルは lower01ディレクトリやlower02 ディレクトリに書き込まれたファ イルと同じように、mergedディ レクトリに⾒えるようになります。 図にすると以下のような感じです。 mergedディレクトリに追加・ 変更・削除したものは、必ずこ のupperディレクトリに反映さ れる。
  133. © SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 133 ファイルを追加するときの動き

    では実際にコマンドを実⾏して確認してみましょう。まずhoge.txt、fuga.txtを作成します。 # mkdir merged # mkdir upper # mkdir lower01 lower02 # echo "hoge" > lower01/hoge.txt # echo "fuga" > lower02/fuga.txt # mkdir work # mount -t overlay overlay -o lowerdir=lower02:lower01,upperdir=upper,workdir=work merged
  134. © SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 134 ファイルを追加するときの動き

    ここでmergeddirにpiyo.txtを追加してみましょう。確かにmergeddir ディレクトリにファイルが追加されていることがわかります。 # echo piyo > merged/piyo.txt # ls merged fuga.txt hoge.txt piyo.txt 本セッションの ブログのURL
  135. © SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 135 ファイルを追加するときの動き

    でも、実際に追加したファイルはuperdirディレクトリにあります。 # ls upperdir piyo.txt 本セッションの ブログのURL
  136. © SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 136 ファイルを更新するときの動き

    次にファイルを更新するときの動 きを説明します。「ファイルを追 加するときの動き」でご紹介した 右図の構成のfuga.txtというファ イルの内容をfugaからfuga2に変 更してみます。 まず、 ユーザーがmergedディレ クトリ内のfuga.txtをhogeから hoge2に変更するオペレーション をすると、ファイルシステム内部 の動きは、まずlower02の fuga.txtがupperディレクトリに コピーされます。
  137. © SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 137 ファイルを更新するときの動き

    次に、uperディレクトリ内の fuga.txtの内容がfugaからfuga2 に変更されます。
  138. © SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 138 ファイルを更新するときの動き

    そして、このfuga.txtというファ イル名のファイルは、lower02 ディレクトリとupperディレクト リの両⽅に存在してます。 OverlayFSの仕様では、より上位 の層のレイヤーのファイルがユー ザーに⾒えることとなるので、 mergedディレクトリには、 upperディレクトリにあるファイ ルが⾒えることとなります。つま り以下のような状態です。
  139. © SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 139 ファイルを更新するときの動き

    # echo fuga2 > merged/fuga.txt # cat merged/fuga.txt fuga2 では実践してみましょう。「ファイルを追加するときの動き」の状態で、 mergedディレクトリ内のhoge.txtの内容をhogeからhoge2に変更して みます。 本セッションの ブログのURL
  140. © SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 140 ファイルを更新するときの動き

    # cat upper/fuga.txt fuga2 mergedディレクトリ内のhoge.txtの内容はhoge2になっているわけで すが、upperディレクトリのhoge.txtも合わせてhoge2になっているこ とがわかります。 つまり、mergedディレクトリに加えた変更は、⼀旦 lower01ディレクトリもしくはlower02ディレクトリのファイルを upperディレクトリにコピーし、それからその内容を変更します。この 仕組をコピー・オン・ライトといいます。
  141. © SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 141 ファイルを削除するときの動き

    次にファイルを削除するときの動 きを⾒てみます。「ファイルを更 新するときの動き」でご紹介した 右図の構成から、hoge.txtを削除 してみます。
  142. © SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 142 ファイルを削除するときの動き

    hoge.txtを削除すると下図のよう になります。upperディレクトリ に何やら新しいファイルが出来て、 mergeddirディレクトリには hoge.txtは⾒えなくなりました。 upperディレクトリに出来たファイルは「ホワイトアウト ファイル」と呼ばれるもので、ファイルが削除されたこと を表すものです。OverlayFSでは、lowerdirの層にある ディレクトリには変更を加えることはしません。そういう 仕様だからです(この仕様のありがたみは、このあとの説 明でご説明します)。では、「ファイルが削除された」と いうことを表現する⽅法が難しいわけですが、そこで OverlayFSでは、先程のホワイトアウトファイルと呼ばれ るものを、削除対象と同名のファイル名でupperディレク トリに置くことで、ファイルシステム的に削除されたこと にしてしまうわけです。つまりmergeddirからは⾒えなく なるということになります。
  143. © SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 143 ファイルを削除するときの動き

    では実際にコマンドを実⾏して確認してみましょう。 # rm merged/hoge.txt # ls merged fuga.txt piyo.txt # 確かにpiyo.txtは削除されている。 本セッションの ブログのURL
  144. © SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 144 ファイルを削除するときの動き

    では、upperディレクトリを⾒てみましょう。 # ls upper fuga.txt hoge.txt piyo.txt [root@localhost test]# ls -la upper/hoge.txt c---------. 1 root root 0, 0 Aug 11 09:16 upper/hoge.txt あれ︖何やら新しいhoge.txtという新しいファイルが出来ていますね。しかも、先頭の⼀⽂字が「c」と なっています。これはキャラクタデバイスファイルです(ディレクトリだとd、シンボリックリンクだとlと かになっています)。このキャラクタデバイスファイルという特殊なファイルを使うことにより、「この ファイルは削除されたよ」というマーカーみたいな役割をしているのです。 本セッションの ブログのURL
  145. © SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 145 ファイルを削除するときの動き

    もちろん下位のレイヤー(lower01ディレクトリ、lower02ディレクトリ)には何ら変化は ありません。 # ls lower01 hoge.txt # ls lower02 fuga.txt 本セッションの ブログのURL
  146. © SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 146 OverlayFSを理解できたところで、

    Dockerで実際に試してみよう︕︕
  147. © SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 147 DockerでのOverlayFSの動きを確かめるために以下のDockerイメージを作成します。

    • ベースイメージはCentOS7 • hogeと書かれたテキストファイルを/root/hoge.txtに配置 • fugaと書かれたテキストファイルを/root/fuga.txtに配置 これを実現するためのDockerfileも作ります。 1 2 3 4 5 FROM centos:centos7 ADD hoge.txt /root/hoge.txt ADD fuga.txt /root/fuga.txt 本セッションの ブログのURL
  148. © SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 148 そして以下のコマンドを実⾏してDockerのイメージを作成します。

    # echo "hoge" > hoge.txt # echo "fuga" > fuga.txt # docker build -t testapp01 . 本セッションの ブログのURL
  149. © SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 149 先ほど作成したイメージでコンテナを起動します。

    # docker run -d -it testapp01 /bin/bash 本セッションの ブログのURL
  150. © SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 150 mountコマンドでファイルシステムのマウント状況を確認します。おっと、何やら

    Dockerコマンドがよしなに⾊々なディレクトリをOverlayFSでマウントしています。次 のページではその構造を図解してみます。 # mount | grep overlay overlay on /var/lib/docker/overlay2/1ed14519861b8d785d3265512917f70274b3f11192f184e0f025728c ad34317d/merged type overlay (rw,relatime,seclabel,lowerdir=/var/lib/docker/overlay2/l/677WTGQVA7IBOMGXUH7Z4DEXLS :/var/lib/docker/overlay2/l/NBS6NXIEXE65SYVIZ7D3HSREZY:/var/lib/docker/overlay2/l/BFQ S6YGZG6YK5HU5PPE3SLJ4NE:/var/lib/docker/overlay2/l/5CXN3KDXZ4VBENORX7ZLOHUAQU ,upperdir=/var/lib/dockeroverlay2/1ed14519861b8d785d3265512917f70274b3f11192f184e0 f025728cad34317d/diff,workdir=/var/lib/docker/overlay2/1ed14519861b8d785d3265512917 f70274b3f11192f184e0f025728cad34317d/work)
  151. © SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 151 前ページのmoutオプションで指定さ

    れていた、OverlayFSのmergeddir層 に相当する。 前ページのmoutオプションで指定さ れていたupperdirに相当する。 前ページの moutオプ ションで指定 されていた lowerdirに相 当する。 Dockerfileに記載されている⼀⾏ごと が、OverlayFSのlowerdirの1層に該 当します。ただし、LBAELコマンド などファイルシステムに影響のない コマンドは、OverlayFSの層は作成さ れません。
  152. © SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 152 ここでさらにOverlayFSのコンテナでの動きを確認するために、先程作成したコンテナ

    に新しいファイルを作成してみると、たしかにupperdirの層に新しくpiyo.txtというファ イルが追加されていました。 # docker exec -it trusting_lalande /bin/bash # echo "piyo" > /root/piyo.txt # exit # cat /var/lib/docker/overlay2/1ed14519861b8d785d3265512917f70274b3f11192f184e0f025728c ad34317d/diff/root/piyo.txt piyo
  153. © SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 153 イメージにすると右図のような感じで

    すね。
  154. © SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 154 OverlayFSを使⽤したDockerは以下のように同じCentOSから作られたDockerイメージ

    は、CentOSのファイルの部分はみんなで共有します。 CeontOSのDockerイメージ /root/hoge.txtを 追加したイメージ /root/fuga.txtを 追加したイメージ /root/piyo.txtを 追加したイメージ 共有 共有 共有 本セッションの ブログのURL
  155. © SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 155 OverlayFSを使⽤しない場合は、以下のように個別にCentOSの部分を⽤意しなければな

    らず、かなりファイルの容量に無駄が⽣まれます(´・ω・`)なのでOverlayFSはすごいの です。 CeontOSのDockerイメージ /root/hoge.txtを 追加したイメージ /root/fuga.txtを 追加したイメージ /root/piyo.txtを 追加したイメージ CeontOSのDockerイメージ CeontOSのDockerイメージ 本セッションの ブログのURL
  156. © SIOS Technology, Inc. All rights Reserved. 最後に︕︕ 156 【連載】世界⼀わかりみが深いコンテナ

    & Docker⼊⾨ 〜 その1:コンテナってなに︖ 〜 https://tech-lab.sios.jp/archives/18811 関連ブログ 【連載】世界⼀わかりみが深いコンテナ & Docker⼊⾨ 〜 その2:Dockerってなに︖ 〜 https://tech-lab.sios.jp/archives/19073 【連載】世界⼀わかりみが深いコンテナ & Docker⼊⾨ 〜 その3:Dockerfileってなに︖ 〜 https://tech-lab.sios.jp/archives/19191 【連載】世界⼀わかりみが深いコンテナ & Docker⼊⾨ 〜 その5:Dockerのネットワークってどう なってるの︖ 〜 https://tech-lab.sios.jp/archives/20179
  157. © SIOS Technology, Inc. All rights Reserved. 最後に︕︕ 157 関連ブログ

    【連載】世界⼀わかりみが深いコンテナ & Docker⼊⾨ 〜 その6:Dockerのファイルシステムって どうなってるの︖ 〜 https://tech-lab.sios.jp/archives/21103
  158. © SIOS Technology, Inc. All rights Reserved. 最後に︕︕ 158 ご清聴ありがとう

    ございました。