はじめに
前回は、OverlayFSがどういった動きをするのか確認しました。今回は、実際にDockerを触りながら、OverlayFSがどのように使用されているのかを確認します。
コンテナ起動して確認する
ubuntuをベースとしたDockerfileを記述します。
FROM ubuntu:latest
ADD hoge.txt /root/hoge.txt
ADD fuga.txt /root/fuga.txt
必要なファイルを作成し、imageをbuildし、コンテナを起動します。
echo "hoge" > hoge.txt
echo "fuga" > fuga.txt
docker build -t app .
docker run -d -it app /bin/bash
コンテナが立ち上がったら、マウントの状況を確認してみます。
$ mount | grep overlay
overlay on /var/lib/docker/overlay2/9b283e2cf604e5151429b85d6280f1809bbb62cd4c5c6247eeaa81206e11ff7d/merged type overlay (rw,relatime,lowerdir=/var/lib/docker/overlay2/l/TG5CQPGYRSJ6EHYDNF75TXNVO2:/var/lib/docker/overlay2/l/6SAUQGTQ23GRLYH4OQGACI6TRV:/var/lib/docker/overlay2/l/G3M62SSZB7N64I7PDWFZIUM6TL:/var/lib/docker/overlay2/l/XWWSQDBBRW6ND7XXXV3FB5GB2U,upperdir=/var/lib/docker/overlay2/9b283e2cf604e5151429b85d6280f1809bbb62cd4c5c6247eeaa81206e11ff7d/diff,workdir=/var/lib/docker/overlay2/9b283e2cf604e5151429b85d6280f1809bbb62cd4c5c6247eeaa81206e11ff7d/work)
ごちゃごちゃしていますが関係性を図にすると以下のようになります。Dockerfileに記述したように順番にレイヤを積み重ねていき、最終的にmergedとして見せていることが分かります。
├── /var/lib/docker/overlay2/xxx/merged
│ └── root
│ ├── fuga.txt(fuga)
│ └── hoge.txt(hoge)
├── /var/lib/docker/overlay2/xxx/diff
├── /var/lib/docker/overlay2/l/6SAUQGTQ23GRLYH4OQGACI6TRV
│ └── root
│ └── fuga.txt(fuga)
├── /var/lib/docker/overlay2/l/G3M62SSZB7N64I7PDWFZIUM6TL
│ └── root
│ └── hoge.txt(hoge)
└── /var/lib/docker/overlay2/l/XWWSQDBBRW6ND7XXXV3FB5GB2U
└── bin boot dev etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var
lowerdirオプションで指定されている一番最初のレイヤ(lowerの一番上のレイヤ)は、コンテナかどうか識別したりなど、システム的な用途に使うレイヤで、どのコンテナを立ち上げた際にも存在します。
追記
発展として、docker push
、build
した際の動きなどは以下の記事がとても参考になりました。
さいごに
DockerでOverlayFSがどのように用いられているのか確認しました。次回は、namespaceやcgroupsを使ってコンテナ別のリソース管理について書きたいと思います。