Slide 1

Slide 1 text

© SIOS Technology, Inc. All rights Reserved. 世界⼀わかりみの深い Docker&コンテナ⼊⾨ 〜 Dockerの基礎からネットワーク・ファイルシステムまで〜 Noriyuki TAKEI 2020年11⽉27⽇ 2020/11/27開催 サイオステクノロジーオンライン勉強会資料

Slide 2

Slide 2 text

© 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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

© SIOS Technology, Inc. All rights Reserved. コンテナってなに︖ 8 仮想化との違い Docker上のプロセスとホストOS上のプロセスはカーネルを共有します。 本セッションの ブログのURL

Slide 9

Slide 9 text

© SIOS Technology, Inc. All rights Reserved. コンテナってなに︖ 9 以下のような2つのアプリケーションを⼀つのホストOS上に構築する ことを考えてみます。 ( . ( ΞϓϦ ) ;< )3) ( - .) ( ΞϓϦ ) ;< )3)

Slide 10

Slide 10 text

© SIOS Technology, Inc. All rights Reserved. コンテナってなに︖ 10 仮想化だったら簡単︕︕ ( . ( ΞϓϦ ) ;< )3) ( - .) ( ΞϓϦ ) ;< )3) 本セッションの ブログのURL

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

© 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

Slide 14

Slide 14 text

© 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

Slide 15

Slide 15 text

© 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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

© 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のプロセスしか ないです。

Slide 18

Slide 18 text

© 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(コ ンテナ)を作ります。

Slide 19

Slide 19 text

© SIOS Technology, Inc. All rights Reserved. コンテナってなに︖ 19 先のコマンドは、以下の2つのことを実施しています。 7 7 本セッションの ブログのURL

Slide 20

Slide 20 text

© SIOS Technology, Inc. All rights Reserved. コンテナってなに︖ 20 こんなにたくさんの コマンド打つの めんどくさい・・・ 本セッションの ブログのURL

Slide 21

Slide 21 text

© SIOS Technology, Inc. All rights Reserved. コンテナってなに︖ 21 Dockerを使えば解決 たった1⾏のコマンドで、 先程のダラダラ⻑いコマンドと同じことが 実現出来ます。 $ docker run -it centos:centos7 /bin/bash

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

© SIOS Technology, Inc. All rights Reserved. コンテナってなに︖ 25 Dockefileを 使うと コンテナをカスタマイズ できます︕︕ 本セッションの ブログのURL

Slide 26

Slide 26 text

© SIOS Technology, Inc. All rights Reserved. コンテナってなに︖ 26 CentOS7のイメージにApacheをインストールしてみます。そのため のDockerfileは以下のとおりです。 Dockerfile FROM centos:centos7 RUN yum –y install httpd CentOS7のイメージをダウンロード Apacheをインストール

Slide 27

Slide 27 text

© SIOS Technology, Inc. All rights Reserved. コンテナってなに︖ 27 Dockerfileを作成し、以下のコマンドを実⾏すると、CentOS7のイ メージ上にApacheがインストールされたコンテナが作成されます。 本セッションの ブログのURL

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

© 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

Slide 31

Slide 31 text

© SIOS Technology, Inc. All rights Reserved. コンテナってなに︖ 31 開発環境の構築を例に 仮想化との違いを 考えてみます。 本セッションの ブログのURL

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

© SIOS Technology, Inc. All rights Reserved. Dockerってなに︖ 36

Slide 37

Slide 37 text

© SIOS Technology, Inc. All rights Reserved. Dockerってなに︖ 37 前章でDockerの基礎を説明したので、ここでDockerのライフサイク ルを説明する中でDockerの操作を説明します。 本セッションの ブログのURL

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

© 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

Slide 44

Slide 44 text

© SIOS Technology, Inc. All rights Reserved. Dockerってなに︖ 44 実践︕︕ Apacheのコンテナを 起動︕︕ 本セッションの ブログのURL

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

© 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

Slide 47

Slide 47 text

© 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

Slide 48

Slide 48 text

© 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イメージからコンテナ を作成する。 先程のコマンドの詳細です。

Slide 49

Slide 49 text

© SIOS Technology, Inc. All rights Reserved. Dockerってなに︖ 49 ブラウザを⽴ち上げてhttp://localhost:8080にアクセスして下さい。 以下のような画⾯が表⽰されれば成功ですヮ(゚д゚)ォ! 本セッションの ブログのURL

Slide 50

Slide 50 text

© SIOS Technology, Inc. All rights Reserved. Dockerfileってなに︖ 50

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

© 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

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

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

Slide 59

Slide 59 text

© SIOS Technology, Inc. All rights Reserved. Dockerfileってなに︖ 59 まんどくさ 本セッションの ブログのURL

Slide 60

Slide 60 text

© 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

Slide 61

Slide 61 text

© 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

Slide 62

Slide 62 text

© 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

Slide 63

Slide 63 text

© SIOS Technology, Inc. All rights Reserved. Dockerfileってなに︖ 63 先のDockerfileを使うと、内部的には以下のようなことが起きていま す。 本セッションの ブログのURL

Slide 64

Slide 64 text

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

Slide 65

Slide 65 text

© 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

Slide 66

Slide 66 text

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

Slide 67

Slide 67 text

© 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ディレクトリにコピーします。

Slide 68

Slide 68 text

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

Slide 69

Slide 69 text

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

Slide 70

Slide 70 text

© 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

Slide 71

Slide 71 text

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

Slide 72

Slide 72 text

© SIOS Technology, Inc. All rights Reserved. docker-composeってなに︖ 72

Slide 73

Slide 73 text

© 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の公式イメージを使う こととします。

Slide 74

Slide 74 text

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

Slide 75

Slide 75 text

© 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

Slide 76

Slide 76 text

© 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

Slide 77

Slide 77 text

© SIOS Technology, Inc. All rights Reserved. docker-composeってなに︖ 77 まんどくさ 本セッションの ブログのURL

Slide 78

Slide 78 text

© 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

Slide 79

Slide 79 text

© 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

Slide 80

Slide 80 text

© 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の下にネストさせて、各コンテナをサービスとして記 述していきます。

Slide 81

Slide 81 text

© 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を⽴ち上げたらコンテナも合わせて起動したいときに便利です。

Slide 82

Slide 82 text

© 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に作成するデータベース名、データベースに接 続するためのユーザー、データベースに接続するためのパスワードにを表しています。

Slide 83

Slide 83 text

© 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が⽴ち上がってしまうことがあります。完全に起動順序を保証し たい場合には、起動スクリプトなどで、事前に⽴ち上がっていてほしいサービスが⽴ち上がっている がどうかをチェックする必要があります。

Slide 84

Slide 84 text

© 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ポリシーの定義です。

Slide 85

Slide 85 text

© 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内で定義したコンテナ同⼠は、サービス名でアクセスできるようになっていま す。

Slide 86

Slide 86 text

© SIOS Technology, Inc. All rights Reserved. Dockerのネットワークってどうなってるの︖ 86

Slide 87

Slide 87 text

© SIOS Technology, Inc. All rights Reserved. Dockerのネットワークってどうなってるの︖ 87 Dockerのネットワークは以下のようになっています。 本セッションの ブログのURL

Slide 88

Slide 88 text

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

Slide 89

Slide 89 text

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

Slide 90

Slide 90 text

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

Slide 91

Slide 91 text

© SIOS Technology, Inc. All rights Reserved. Dockerのネットワークってどうなってるの︖ 91 Netowork Namespaceがあると。。。 本セッションの ブログのURL

Slide 92

Slide 92 text

© SIOS Technology, Inc. All rights Reserved. Dockerのネットワークってどうなってるの︖ 92 実際にネットワークを作ってみましょう︕︕Dockerコマンドを使うとラクチンですが、あえてそれは使 わないでやってみます。でもいまから説明することは、知らないうちにDockerコマンドが裏側でやって います。今回のゴールは以下のネットワークを作成することです。 本セッションの ブログのURL

Slide 93

Slide 93 text

© SIOS Technology, Inc. All rights Reserved. Dockerのネットワークってどうなってるの︖ 93 最初はなにもない以下のような状態です。 本セッションの ブログのURL

Slide 94

Slide 94 text

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

Slide 95

Slide 95 text

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

Slide 96

Slide 96 text

© 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

Slide 97

Slide 97 text

© 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

Slide 98

Slide 98 text

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

Slide 99

Slide 99 text

© 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 接続出来ました。

Slide 100

Slide 100 text

© 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アドレスの付与

Slide 101

Slide 101 text

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

Slide 102

Slide 102 text

© 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

Slide 103

Slide 103 text

© 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

Slide 104

Slide 104 text

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

Slide 105

Slide 105 text

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

Slide 106

Slide 106 text

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

Slide 107

Slide 107 text

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

Slide 108

Slide 108 text

© 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

Slide 109

Slide 109 text

© 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

Slide 110

Slide 110 text

© 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

Slide 111

Slide 111 text

© 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

Slide 112

Slide 112 text

© SIOS Technology, Inc. All rights Reserved. Dockerのネットワークってどうなってるの︖ 112 ちなみに外部ネットワークへのパケットはこのように流れています。まずNetwork Namespaceのns1から出たパケットは、宛先が192.169.0.0/24宛ではないので、先程 設定したデフォルトゲートウェイの設定により、rt-veth(192.168.0.100)に向かいます。 本セッションの ブログのURL

Slide 113

Slide 113 text

© SIOS Technology, Inc. All rights Reserved. Dockerのネットワークってどうなってるの︖ 113 IP転送の設定によるrt-vethから物理NICにルーティングされます。 本セッションの ブログのURL

Slide 114

Slide 114 text

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

Slide 115

Slide 115 text

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

Slide 116

Slide 116 text

© 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

Slide 117

Slide 117 text

© SIOS Technology, Inc. All rights Reserved. Dockerのネットワークってどうなってるの︖ 117 docker0というのは、Dockerをインストールしたときにデフォルトで作成される仮想ス イッチです。特に何も指定せずコンテナを作成すると、このdocker0に接続されます。新 しく2つのコンテナを作成したので、「veth9f0eb93」「veth7010a0b」という新たに2 つの仮想NICが出来上がっています。 # ip addr show ・・・略・・・ 5: docker0: 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: 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: 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

Slide 118

Slide 118 text

© SIOS Technology, Inc. All rights Reserved. Dockerのネットワークってどうなってるの︖ 118 docker0の仮想スイッチに接続されている仮想NICを⾒てみます。確かに先程の 「veth9f0eb93」「veth7010a0b」という仮想NICがdocker0という仮想スイッチに接 続されているのがわかります。 # ip link show master docker0 32: veth9f0eb93@if31: 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: 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

Slide 119

Slide 119 text

© 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

Slide 120

Slide 120 text

© SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 120

Slide 121

Slide 121 text

© SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 121 DockerはOverlayFSという、ちょっと特殊なファイルシステムを使って、劇的な容量の 削減を⾏っています。ちょうどPhotoshopのレイヤーのイメージに近い感じです。 layer01〜layer03ディレクト リにあるファイルをマージし たものがmergedディレクトリ に表⽰される

Slide 122

Slide 122 text

© SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 122 上位のレイヤーに同名のファイ ルがあった場合、それが mergedディレクトリに表⽰さ れる。この場合は、layer03 ディレクトリにあるファイルB がmergedディレクトリに表⽰ される。

Slide 123

Slide 123 text

© SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 123 実際に⼿を動かして やってみよう︕︕ 本セッションの ブログのURL

Slide 124

Slide 124 text

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

Slide 125

Slide 125 text

© SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 125 OverlayFSで右図のようなディレ クトリ構造を作成してみます。

Slide 126

Slide 126 text

© 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

Slide 127

Slide 127 text

© 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の指定です。

Slide 128

Slide 128 text

© 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

Slide 129

Slide 129 text

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

Slide 130

Slide 130 text

© 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

Slide 131

Slide 131 text

© SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 131 ここからは実際に発⽣する以下のユースケースを元にOverlayFSの動きを⾒てみます。 ファイルを追加するときの動き ファイルを更新するときの動き ファイルを削除するときの動き

Slide 132

Slide 132 text

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

Slide 133

Slide 133 text

© 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

Slide 134

Slide 134 text

© 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

Slide 135

Slide 135 text

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

Slide 136

Slide 136 text

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

Slide 137

Slide 137 text

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

Slide 138

Slide 138 text

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

Slide 139

Slide 139 text

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

Slide 140

Slide 140 text

© 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ディレクトリにコピーし、それからその内容を変更します。この 仕組をコピー・オン・ライトといいます。

Slide 141

Slide 141 text

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

Slide 142

Slide 142 text

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

Slide 143

Slide 143 text

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

Slide 144

Slide 144 text

© 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

Slide 145

Slide 145 text

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

Slide 146

Slide 146 text

© SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 146 OverlayFSを理解できたところで、 Dockerで実際に試してみよう︕︕

Slide 147

Slide 147 text

© 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

Slide 148

Slide 148 text

© SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 148 そして以下のコマンドを実⾏してDockerのイメージを作成します。 # echo "hoge" > hoge.txt # echo "fuga" > fuga.txt # docker build -t testapp01 . 本セッションの ブログのURL

Slide 149

Slide 149 text

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

Slide 150

Slide 150 text

© 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)

Slide 151

Slide 151 text

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

Slide 152

Slide 152 text

© 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

Slide 153

Slide 153 text

© SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 153 イメージにすると右図のような感じで すね。

Slide 154

Slide 154 text

© 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

Slide 155

Slide 155 text

© 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

Slide 156

Slide 156 text

© 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

Slide 157

Slide 157 text

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

Slide 158

Slide 158 text

© SIOS Technology, Inc. All rights Reserved. 最後に︕︕ 158 ご清聴ありがとう ございました。