Здесь — где контейнер хранит то, что пишет его процесс, и почему docker rm это удаляет.
Слои образа только читаются: из одного образа запускают много контейнеров, и ни один не может их поменять. Поэтому docker, создавая контейнер, кладёт поверх слоёв образа ещё один, пустой, — слой контейнера. Всё, что процесс создаёт, меняет или удаляет, попадает в него. Что в нём набралось, показывает docker diff:
A — файл добавлен, C — изменён, D — удалён. Каталог /data пришёл из образа, а notes.txt появился уже в контейнере.
Слой контейнера живёт столько же, сколько контейнер. docker stop, docker start и docker restart его не трогают: заметки после них на месте. docker rm удаляет контейнер вместе со слоем, а docker run создаёт новый контейнер с новым пустым слоем поверх того же образа. Поэтому /data и оказался пуст.
Контейнер web отдаёт страницу из образа site:2. Ты поправил её прямо внутри — sudo docker exec web sh -c 'echo fixed > /www/index.html', — потом пересоздал web из site:2. Что отдаст сайт?
-
index.html лежит в слое образа site:2, его
docker rmне трогает. Удалилась только правка поверх него. -
Образ только читается:
docker execпоменял слой контейнера, а site:2 остался прежним. -
Он записан в слой контейнера, а
docker rmудалил этот слой. Новый контейнер получил /www/index.html из образа.
Правка через docker exec легла в слой контейнера и удалилась вместе с ним. Новый контейнер из site:2 отдаёт страницу из образа — постоянная правка делается в Dockerfile и новом образе.
Главное в шаге
- Слои образа только читаются; всё, что пишет процесс, ложится в слой контейнера.
-
docker stop,startиrestartслой сохраняют,docker rmудаляет его вместе с контейнером. -
docker diffпоказывает, что контейнер изменил поверх образа.