Должен ли я беспокоиться о лишних, не работающих Docker-контейнерах?
Каждый docker run
команда, или каждый RUN
Команда внутри Dockerfile, создает контейнер. Если контейнер больше не работает, его все еще можно увидеть с помощью docker ps -a
,
Должен ли я быть обеспокоен наличием огромного списка неработающих контейнеров? Должен ли я выдавать docker rm
на неработающих контейнерах?
Я не уверен, какую производительность или штрафы памяти / хранилища несут эти неработающие контейнеры.
4 ответа
Контейнеры, которые не запущены, не занимают никаких системных ресурсов, кроме дискового пространства.
Обычно хорошо убирать за собой, но если у вас их много, это вовсе не должно снижать производительность.
Если вы заметили замедление при запуске команд Docker с большим количеством остановленных контейнеров, это может быть ошибкой в Docker, и вы должны отправить ошибку.
docker run
Документация описывает, как автоматически очистить контейнер и удалить файловую систему при выходе из контейнера:
--rm=false: Automatically remove the container when it exits (incompatible with -d)
Выше показано, что по умолчанию контейнеры не удаляются, а добавляются --rm=true
или просто короткая рука --rm
будет работать так:
sudo docker run -i -t --rm ubuntu /bin/bash
Когда вы выходите из контейнера, он будет автоматически удален.
Вы можете проверить это, перечислив ваши док-контейнеры в одном окне терминала:
watch -n1 'sudo ls -c /var/lib/docker/containers'
А затем в другом окне запустите эту команду, чтобы запустить несколько док-контейнеров, которые автоматически выйдут из режима сна после 10 секунд.
for i in {1..10}; do sudo docker run --rm ubuntu /bin/sleep $i & done
Если вы запускаете контейнер с томом и не используете docker rm -v для его удаления, то после удаления контейнера том не удаляется. Также существует проблема с драйвером хранилища vfs. Если вы забудете очистить, тома будут занимать ваше дисковое пространство.
Я не уверен, какую производительность или штрафы памяти / хранилища несут эти неработающие контейнеры.
Чтобы оценить, сколько хранилищ неиспользуемые контейнеры Docker используют, вы можете запустить:
docker ps --size --filter "status=exited"
--size
: показать общие размеры файлов (для справки: объясните столбец SIZE в "docker ps -s" и что означает ключевое слово "virtual" # 1520).--filter "status=exited"
: список только остановленных контейнеров.
Эквивалентно, вы можете запустить: docker container ls --filter "status=exited"
Вы также можете использовать команду docker system df
(введено в Docker 1.13.0), чтобы увидеть использование диска Docker, например:
username@server:~$ docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 44 28 114.7GB 84.84GB (73%)
Containers 86 7 62.43GB 41.67GB (66%)
Local Volumes 2 1 0B 0B
Build Cache 0B 0B
Образ - это моментальный снимок файловой системы и зависимостей или определенный набор каталогов определенного приложения / программного обеспечения. Под моментальным снимком я подразумеваю копию только тех файлов, которые необходимы для запуска этого программного обеспечения (например, mysql, redis и т. Д.) С базовыми конфигурациями в среде контейнера.
Когда вы создаете контейнер с помощью изображения, небольшая часть ресурсов вашей системы изолируется с помощью пространства имен и контрольных групп, а затем файлы внутри изображения копируются в эту изолированную среду ресурсов.
Следовательно, контейнеры занимают только дисковое пространство. Если есть неиспользуемые контейнеры, вы должны удалить их, но не изображение, поскольку они всегда могут использоваться повторно.