Остановка 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'.

Обратите внимание: если вы хотите хранить данные между контейнерами, предпочтительнее использовать том. А если вы хотите просмотреть журналы удаленных контейнеров, потребуется перенести эти журналы во внешнюю систему, например в эластичную.

Другие вопросы по тегам