Начиная с версии Docker 1.10, с введением адресного хранилища содержимого, Docker полностью изменил способ обработки данных изображений на диске. Я так понимаю, что теперь слои и изображения разделены. Слои просто становятся коллекциями файлов и каталогов, которые не имеют представления об изображениях и могут свободно использоваться совместно с изображениями. См. обновление и blog с лучшим объяснением.
Во время docker push
и docker pull
через стандартный вывод можно увидеть, что слои переносятся, хотя результирующие хэши SHA полностью регенерируются в месте назначения.
С локально созданным образом из базы ubuntu:14.04
, когда я использую команду docker history
, я могу увидеть цепочку промежуточных образов, используемых в процессе сборки, и использование дискового пространства, которое они внесли.
root@ruifeng-VirtualBox:/var/lib/docker/aufs/diff# docker history image_size
IMAGE CREATED CREATED BY SIZE COMMENT
9ae1f372d83c 11 weeks ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin/ 0 B
aaf66e9fa85b 11 weeks ago /bin/sh -c chown -R martian /home/martian 6.299 MB
9568768134c1 11 weeks ago /bin/sh -c rm -rf /home/martian/potatoes 0 B
2f40f3f58306 11 weeks ago /bin/sh -c mv /home/martian/water_tanks /home 6.289 MB
062e2702ffa2 11 weeks ago /bin/sh -c mv /home/martian/potatoes /home/ma 5.394 kB
7b2d8b4c1dd0 11 weeks ago /bin/sh -c chown -R martian /home/martian 6.299 MB
8fd47fed98d6 11 weeks ago /bin/sh -c #(nop) COPY dir:421da6c71a1f252881 6.289 MB
...
И я могу использовать команду docker inspect
, чтобы получить нижележащие слои.
root@ruifeng-VirtualBox:/var/lib/docker/aufs/diff# docker inspect image_size | jq -r '.[].RootFS'
{
"Layers": [
"sha256:a85f35566a268e6f4411c5157ffcffe4f5918b068b04d79fdd80003901ca39da",
"sha256:eaaf7298332642da0f8190fa4b96ad46c04b9c1d1682bc3a35d77bded2b1e0a9",
"sha256:33a212e8aa5642d3a2ddead146e85912407fc5bbb2a896dab11fcf329177a999",
"sha256:f1f25d8c6e56dc4891df147a77f57e756873b57f33ce95e6a0acbe47117c0c8a",
"sha256:67852b7d2cf5f0885293fa9df91ebfd8ef0c42ba11a5155f94806f3a96c5e916",
"sha256:480d48b7e2864a44c1b2fca0c7e32fbab505f7526ccb25bbfed191c04a9bb7b0",
"sha256:18d270fe64aa423e0ffdf24faf0103432027da3d5c12f4505e7daedad9fe2195",
"sha256:a73c3f5eb83790bc6d03381a43a20aef7d0d9d97de0cff4b040e8e4c01a3aee5",
"sha256:e8d1b67ace73cb92cc00725354e84024153bedae4280149c03fcb52f34d83757",
"sha256:19a4b80afc677825fec94adf8b6a45a866f42a38675f87f86e50171ff5e0a280",
"sha256:77d412270fbdd9baba1fe73028b786c3a1709feefa9b03be74b8e9f9ce148635",
"sha256:2ad21e37389addd577161c981d0c69ab60aa47945172f41f9ec71ada1c1dd4ee",
"sha256:771d1e47ca8d8dcf55069786e4c499894fba86f704c808413df00f4f980564e1",
"sha256:f9c02c6fa436213c0f220d49c4ee1b913372081010d4506757ec75d3e788847c"
],
"Type": "layers"
}
Мой вопрос: как мне связать эти слои, помеченные хешами SHA, с изображениями, перечисленными в столбце IMAGE предыдущего вывода команды? И есть ли способ узнать фактическое расположение и размер этих слоев на диске?
Если я не ошибаюсь, слои должны оставаться на уровне /var/lib/docker/aufs/diff
, если в драйвере хранилища выбран aufs
. Но содержимое в этой папке именуется случайно сгенерированными идентификаторами, которые буквально не соответствуют ни одному из слоев. Похоже, совпадение хранится только в Docker Engine из соображений безопасности.