Остановка Docker-контейнера - это то же самое, что удаление Docker-контейнера?
Если Docker "эфемерный", чем остановка контейнера отличается от удаления контейнера? Когда я останавливаюсь и начинаю, это не значит, что я могу сохранить информацию в этом контейнере, не так ли? Я думал, что это то, что вы не хотите делать (сохранить данные в контейнере.)
3 ответа
Если Docker "эфемерный", чем остановка контейнера отличается от удаления контейнера?
Остановленные контейнеры видны через docker ps -a
, Если контейнеры запускаются с --rm
вариант, они уберут себя после остановки.
Когда я останавливаюсь и начинаю, это не значит, что я могу сохранить информацию в этом контейнере, не так ли? Я думал, что это то, что вы не хотите делать (сохранить данные в контейнере.)
Вы абсолютно правы. Состояние никогда не должно быть сохранено внутри контейнера.
При остановке контейнера его можно перезапустить позже снова с помощьюdocker start <ID|name>
. Если контейнер не запускался с какими-то специальными опциями, внутренние данные сохраняются и его можно продолжать использовать. Можете ли вы самостоятельно проверить это поведение с помощью реестра докеров:
docker run -d -p 5000:5000 --name registry registry:2
# deploy a local docker image
curl -X GET http://<youthostname>:5000/v2/_catalog
docker stop registry
docker start registry
curl -X GET http://<youthostname>:5000/v2/_catalog
# the content is still there
Когда контейнер запускается, такие инструменты, как docker, создают каталог с:
- конфигурация (имя, монтирование томов, опубликованные порты и т. д.)
- слой файловой системы, специфичный для контейнера, и собранная файловая система из слоя контейнера, объединенная со слоями изображения
- вывод журнала при использовании драйверов json или локального журнала
Когда контейнер останавливается, работающая среда с различными пространствами имен и контрольными группами уничтожается, но ее можно перезапустить с предыдущим состоянием файловой системы и той же конфигурацией.
Когда контейнер будет удален, вы сможете создать его заново, но изменения файловой системы, журналы и любые другие данные конфигурации будут потеряны.
Вот краткий пример, показывающий постоянство файловой системы:
$ docker run -it --name stop-test busybox /bin/sh
/ # cat /hello.txt
cat: can't open '/hello.txt': No such file or directory
/ # echo "hello world" > /hello.txt
/ # cat /hello.txt
hello world
/ # exit
$ docker container inspect stop-test --format '{{json .State}}' | jq .
{
"Status": "exited",
"Running": false,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 0,
"ExitCode": 0,
"Error": "",
"StartedAt": "2023-08-16T14:52:49.810997424Z",
"FinishedAt": "2023-08-16T14:53:09.900172563Z"
}
$ docker start stop-test
stop-test
$ docker attach stop-test
/ # cat /hello.txt
hello world
/ # exit
$ docker rm stop-test
stop-test
$ docker run -it --name stop-test busybox /bin/sh
/ # cat /hello.txt
cat: can't open '/hello.txt': No such file or directory
/ # exit
$ docker run -it --name stop-test busybox /bin/sh
docker: Error response from daemon: Conflict. The container name "/stop-test" is already in use by container "caaad3a5287431dc6a9a924c658723580298d182d4b27bd8ed3fcd6c3690b2ad". You have to remove (or rename) that container to be able to reuse that name.
See 'docker run --help'.
Обратите внимание: если вы хотите хранить данные между контейнерами, предпочтительнее использовать том. А если вы хотите просмотреть журналы удаленных контейнеров, потребуется перенести эти журналы во внешнюю систему, например в эластичную.