More Related Content
Similar to Dockerイメージ管理の内部構造 (20)
More from Etsuji Nakai (20)
Dockerイメージ管理の内部構造
- 2. 2
Dockerイメージ管理の内部構造
自己紹介
中井悦司(なかいえつじ)
– Twitter @enakai00
日々の仕事
– Senior Solution Architect and
Cloud Evangelist at Red Hat K.K.
企業システムでオープンソースの活用を希望される
お客様を全力でご支援させていただきます。
昔とった杵柄
– 素粒子論の研究(超弦理論とか)
– 予備校講師(物理担当)
– インフラエンジニア(Unix/Linux専門)
好評発売中!
- 6. 6
Dockerイメージ管理の内部構造
RHEL Atomic Hostとは?
Red Hat Enterprise Linux 7をベースに、Dockerの実行環境として最適化
したLinuxディストリビューション
– Kubernetesで管理するための前提パッケージを追加
– Docker用に最適化したディスク構成でインストール
• Dockerイメージ保存領域を専用の論理ボリュームで構成
– Docker用のtunedプロファイル提供
– rpm-ostreeによる一括アップデート機能
• RPMパッケージの個別管理が不要
• アップデート後のロールバック(以前のバージョンへの復帰)が可能
アップストリームの開発プロジェクトは「PROJECT ATOMIC」
– http://www.projectatomic.io/
- 13. 13
Dockerイメージ管理の内部構造
論理デバイスの管理情報は、下記のJSONファイルに記録されています。
– /var/lib/docker/devicemapper/metadata/<Image ID>
– 特に、デバイスID「0」の論理デバイスは、最初にDockerサービスを起動した際に10GBで作成され、
ファイルシステムとしてフォーマットされます。Docker Hubからイメージをダウンロードすると、こ
の論理デバイスのスナップショットを作成して、空のファイルシステムを用意して、その中にダウン
ロードファイルを展開します。(そのため、すべての論理デバイスのサイズは10GBになります。)
DockerにおけるThin Povisioningの利用方式
# docker images enakai/httpd
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
enakai/httpd ver1.0 d3d92adfcafb 36 hours ago 206.6 MB
# cat /var/lib/docker/devicemapper/metadata/d3d92adfcafb* | python -mjson.tool
{
"device_id": 72,
"initialized": false,
"size": 10737418240,
"transaction_id": 99
}
# cat /var/lib/docker/devicemapper/metadata/base | python -mjson.tool
{
"device_id": 0,
"initialized": true,
"size": 10737418240,
"transaction_id": 1
}
- 15. 15
Dockerイメージ管理の内部構造
– 次のコマンドで論理デバイスを有効化して、マウントします。下記の「rootfs」以下がコンテナから
みえるルートファイルシステムになります。
– 最後に次のコマンドでアンマウントして、論理デバイスを無効化しておきます。
※ この手順でイメージ内のファイルを修正することは、Docker的には想定外の使い方ですので、
予想外の問題が起きる可能性はあるかも知れません。
– 参考:https://www.kernel.org/doc/Documentation/device-mapper/thin-provisioning.txt
Dockerのディスクイメージを直接操作する方法 (2)
# dmsetup create myvol --table "0 $(($size / 512)) thin /dev/mapper/$pool $device_id"
# lsblk
...
loop0 7:0 0 100G 0 loop
└─docker-252:3-130516-pool 253:0 0 100G 0 dm
└─myvol 253:1 0 10G 0 dm
loop1 7:1 0 2G 0 loop
└─docker-252:3-130516-pool 253:0 0 100G 0 dm
└─myvol 253:1 0 10G 0 dm
# mount /dev/mapper/myvol /mnt
# ls /mnt
id lost+found rootfs
# cat /mnt/rootfs/var/www/html/index.html
Hello, World!
# umount /mnt
# dmsetup remove myvol
- 17. 17
Dockerイメージ管理の内部構造
(参考)データ用デバイスの構成例 (2)
RHEL Atomic Hostでは、ルートファイルシステム(3G)、スワップ領域などを除いた残り
が、すべてデータ用デバイスとして利用されます。
– ディスクイメージファイルではなく、専用の論理ボリュームをデータ用デバイスとして使用します。
-bash-4.2# lvs
LV VG Attr LSize Pool Origin Data% Move Log Cpy%Sync Convert
docker-data rah_atomic01 -wi-ao---- 26.64g
docker-meta rah_atomic01 -wi-ao---- 36.00m
root rah_atomic01 -wi-ao---- 3.00g
swap rah_atomic01 -wi-ao---- 2.03g
-bash-4.2# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 252:0 0 32G 0 disk
|-vda1 252:1 0 300M 0 part /boot
`-vda2 252:2 0 31.7G 0 part
|-rah_atomic01-swap 253:0 0 2G 0 lvm [SWAP]
|-rah_atomic01-root 253:1 0 3G 0 lvm /sysroot
|-rah_atomic01-docker--meta 253:2 0 36M 0 lvm
| `-docker-253:1-5320663-pool 253:4 0 26.7G 0 dm
`-rah_atomic02-docker--data 253:3 0 26.7G 0 lvm
`-docker-253:1-5320663-pool 253:4 0 26.7G 0 dm
データ用デバイス
メタデータ用デバイス
- 26. 26
Dockerイメージ管理の内部構造
saveイメージは「親子関係を再現可能な分割tarファイル」
saveイメージの内容を実際に確認した例です。
– layer.tarは、そのレイヤーのコンテンツを含むアーカイブファイルです。
– jsonは、そのレイヤーの親子関係やメタデータを記載したファイルです。
# docker save hoge > hoge.tar
# tar -tvf hoge.tar
drwx------ 0/0 0 2014-08-02 14:49 ./
drwxr-xr-x 0/0 0 2014-08-02 14:49 34e94e67e63a0f079d9336b3c2a52e814d138e5b3f1f614a0cfe273814ed7c0a/
-rw-r--r-- 0/0 3 2014-08-02 14:49 34e94e67e63a0f079d9336b3c2a52e814d138e5b3f1f614a0cfe273814ed7c0a/VERSION
-rw-r--r-- 0/0 1565 2014-08-02 14:49 34e94e67e63a0f079d9336b3c2a52e814d138e5b3f1f614a0cfe273814ed7c0a/json
-rw-r--r-- 0/0 1024 2014-08-02 14:49 34e94e67e63a0f079d9336b3c2a52e814d138e5b3f1f614a0cfe273814ed7c0a/layer.tar
drwxr-xr-x 0/0 0 2014-08-02 14:49 511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158/
-rw-r--r-- 0/0 3 2014-08-02 14:49 511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158/VERSION
-rw-r--r-- 0/0 585 2014-08-02 14:49 511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158/json
-rw-r--r-- 0/0 1536 2014-08-02 14:49 511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158/layer.tar
drwxr-xr-x 0/0 0 2014-08-02 14:49 aff9664bf7d8eed96731fffc05a2002306e09ca5e22290354eeca6fa577fe8b2/
-rw-r--r-- 0/0 3 2014-08-02 14:49 aff9664bf7d8eed96731fffc05a2002306e09ca5e22290354eeca6fa577fe8b2/VERSION
-rw-r--r-- 0/0 1285 2014-08-02 14:49 aff9664bf7d8eed96731fffc05a2002306e09ca5e22290354eeca6fa577fe8b2/json
-rw-r--r-- 0/0 3584 2014-08-02 14:49 aff9664bf7d8eed96731fffc05a2002306e09ca5e22290354eeca6fa577fe8b2/layer.tar
drwxr-xr-x 0/0 0 2014-08-02 14:49 b1bd49907d559b703c2b7c1b0d6f120b5182440f7ac5f08636625d328e96f1ef/
-rw-r--r-- 0/0 3 2014-08-02 14:49 b1bd49907d559b703c2b7c1b0d6f120b5182440f7ac5f08636625d328e96f1ef/VERSION
-rw-r--r-- 0/0 1574 2014-08-02 14:49 b1bd49907d559b703c2b7c1b0d6f120b5182440f7ac5f08636625d328e96f1ef/json
-rw-r--r-- 0/0 222638592 2014-08-02 14:49 b1bd49907d559b703c2b7c1b0d6f120b5182440f7ac5f08636625d328e96f1ef/layer.tar
-rw-r--r-- 0/0 86 2014-08-02 14:49 repositories
ベースイメージなのでサイズが大きい
差分イメージなのでサイズが小さい
- 27. 27
Dockerイメージ管理の内部構造
CentOS6
+ httpd
saveイメージからの論理デバイスの復元
saveイメージを「docker load」で読み込むと、次のような流れで、最初と同じ論理デバイス
の状態が再現されます。
– 空の論理デバイス「CentOS6」を作成して、ベースイメージのアーカイブを書き出します。
– 「CentOS6」のスナップショットコピー「CentOS6+httpd」を作成して、差分ファイルのアーカイ
ブを上書きで書き出します。
それぞれのイメージには、固有のUUIDが割り当てられているので、共通のベースイメージを
持つ複数のsaveイメージを復元した場合、同じベースイメージが重複して再現されることは
ありません。
CentOS6
httpd.tarbase_image.tar
save_image.tar
① 復元
② スナップショット作成
③ 差分を上書き
- 28. 28
Dockerイメージ管理の内部構造
Docker Hubのイメージ保存形式
Docker Hubにイメージをアップロードすると、次のような処理が行われます。
– saveイメージの作成と同じ流れで、それぞれのレイヤーの「差分tarファイル」を作成します。
– それぞれの「差分tarファイル」を固有のUUIDと共にDocker Hubにアップロードして登録します。
– Docker Hubにすでに存在するファイル(UUIDで識別)は、アップロードをスキップします。
つまり、Docker Hubは「差分tarファイル」の巨大な保管庫として機能しています。
– 複数のユーザーが、Docker Hubから取得した「CentOS6」のベースイメージをもとにさまざまな派生
イメージを作って、Docker Hubにアップロードした場合、「CentOS6」のベースイメージは、あくま
で1つだけ存在することになります。
CentOS6
(ベースイメージ)
httpd
(差分tarファイル)
mysql
(差分tarファイル)
# docker pull
CentOS6
CentOS6
+httpd
# docker push
# docker pull
CentOS6
CentOS6
+mysql
# docker push
Docker HubユーザーA ユーザーB