[[ Образ состоит из слоев ]]

Docker

Образ состоит из слоев

Docker version 18.09.8, build 00dd43dd

Общая информация

Докер образ состоит из последовательности слоев наложенный друг на друга

Каждая команда типа COPY и RUN создает новый слой при сборке образа

Каждый слой в процессе сборке кешируется и может быть использован при повторной сборке, поэтому для скорости команды выгодно разбивать

Каждый слой сохраняется как часть контейнера, что приводит к росту размера образа, поэтому для оптимизации размера выгодно объединять в одну команду

Будем экспериментировать на контейнере ubuntu:18.04

ubuntu                                        18.04                549b9b86cb8d        31 hours ago        64.2MB
$ docker run --rm -it ubuntu:test bash
$ du -chx /
70M     total

Размер образа 64.2MB, размер данных внутри контейнера 70MB

На сегодняшний день, в образе ubuntu есть настройка apt менеджера, которая сама удаляет кеш после установки пакетов, для эксперимента она нам будет мешать

/etc/apt/apt.conf.d/docker-clean

Сборка #1

Dockerfile

FROM ubuntu:18.04
RUN rm -f /etc/apt/apt.conf.d/docker-clean

RUN apt-get update
RUN apt-get install curl

ubuntu                                        test                 853a1c2b7ca5        3 seconds ago       213MB

$ docker run --rm -it ubuntu:test bash
$ du -ch /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin /var/lib/apt/lists/*.*
97M     total
$ du -chx /
180M     total
Размер образа 213MB (+148.8), размер данных внутри контейнера 180MB (+110), кеша 97MB

Сборка #2

Dockerfile

FROM ubuntu:18.04
RUN rm -f /etc/apt/apt.conf.d/docker-clean

RUN apt-get update
RUN apt-get install curl
RUN rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin /var/lib/apt/lists/*.*

ubuntu                                        test                 d35d7a6be3a2        13 seconds ago      213MB

$ docker run --rm -it ubuntu:test bash
$ du -ch /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin /var/lib/apt/lists/*.*
0       total
$ du -chx /
84M     total

Размер образа 213MB (+148.8), размер данных внутри контейнера 84MB (+14), кеша 0MB

Образ хранит слои созданные двумя предыдущими командами RUN, а в них все еще есть файлы кеша

Сборка #3

Dockerfile

FROM ubuntu:18.04
RUN rm -f /etc/apt/apt.conf.d/docker-clean

RUN apt-get update && \
    apt-get install -y curl && \
    rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin /var/lib/apt/lists/*.*

ubuntu                                        test                 9e767a2936a4        About a minute ago   78.5MB

$ docker run --rm -it ubuntu:test bash
$ du -chx /
84M     total

Размер образа 78.5MB (+14.3), размер данных внутри контейнера 84MB (+14), кеша 0MB

Все действия выполнялись в одной команде RUN (в одном слое) - это трюк который используется повсеместно

Вот теперь прирост размера образа соответствует приросту данным






Обсуждение

Ваш комментарий. Вики-синтаксис разрешён:
227 +14 = 
 
howto/docker/docker_layers.txt · Последние изменения: 2019/12/20 17:29 — lexa
Gentoo Linux Gentoo Linux Driven by DokuWiki