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

世界一わかりみの深い Docker&コンテナ入門 〜 Dockerのファイルシステムってどうなってるの? 〜/wakarimidocker_filesystem

世界一わかりみの深い Docker&コンテナ入門 〜 Dockerのファイルシステムってどうなってるの? 〜/wakarimidocker_filesystem

D0f5daa7cc3a26140c06ea29e5e235cc?s=128

Noriyuki TAKEI

February 25, 2021
Tweet

Transcript

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

    Dockerのファイルシステムってどうなってるの︖ 〜 Noriyuki TAKEI 2021年2⽉25⽇ Kubernetes Meetup Tokyo #39
  2. © SIOS Technology, Inc. All rights Reserved. About Me 2

    BCPVUNF Noriyuki TAKEI ෢Ҫ ٓߦ Information • サイオステクノロジー株式会社 • Microsoft MVP for Azure Favorites • Azure • Squash • Sweets blog https://tech-lab.sios.jp/ core skill Azure、Cloud Native、 Serverless全般 Twitter @noriyukitakei
  3. © SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 3 DockerはOverlayFSという、ちょっと特殊なファイルシステムを使って、劇的な容量の

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

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

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

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

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

    ⾏します。 # 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
  9. © SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 9 ⼀番気になるmountコマンドの説明です。

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

    # 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
  11. © SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 11 では、次にlower02ディ

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

    # 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
  13. © SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 13 ここからは実際に発⽣する以下のユースケースを元にOverlayFSの動きを⾒てみます。

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

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

    では実際にコマンドを実⾏して確認してみましょう。まず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
  16. © SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 16 ファイルを追加するときの動き

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

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

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

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

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

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

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

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

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

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

    では、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
  27. © SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 27 ファイルを削除するときの動き

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

    Dockerで実際に試してみよう︕︕
  29. © SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 29 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
  30. © SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 30 そして以下のコマンドを実⾏してDockerのイメージを作成します。

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

    # docker run -d -it testapp01 /bin/bash 本セッションの ブログのURL
  32. © SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 32 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)
  33. © SIOS Technology, Inc. All rights Reserved. Dockerのファイルシステムってどうなってるの︖ 33 前ページのmoutオプションで指定さ

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

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

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

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

    & 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
  39. © SIOS Technology, Inc. All rights Reserved. 最後に︕︕ 39 関連ブログ

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

    ございました。