() translation by (you can also view the original English article)
Это вторая часть серии из двух частей о работе с контейнерами Docker. В первой части мы сосредоточили внимание на многих способах и вариантах запуска образа и способах взаимодействия хоста с контейнером Docker.
В этой части мы рассмотрим листинг, запуск, остановку и перезапуск контейнеров, а также выполнение команд по запуску контейнеров. В частности, вы узнаете разницу между запущенными и остановленными (выходящими) контейнерами и как точно контролировать информацию и отображать ее при отображении своих контейнеров путем фильтрации и форматирования.
Затем вы получите практический опыт остановки, запуска, перезапуска и прикрепления к вашим контейнерам. Наконец, вы будете запускать одноразовые команды, а также получать доступ к интерактивной оболочке в запущенном контейнере.
Прежде чем начать, убедитесь, что Docker установлен правильно в вашей среде. В зависимости от того, как он установлен, и вашего пользователя, вам может потребоваться запустить его как sudo. Я пропущу sudo.
Листинг контейнеров
При работе с контейнерами вам часто надо будет получить список, просмотреть и фильтровать свои контейнеры. Команда docker ps
- делает все это, и у нее есть несколько интересных вариантов.
Запуск контейнеров
Самая основная команда - docker ps
без аргументов, которая показывает все текущие контейнеры.
1 |
$ docker ps |
2 |
CONTAINER ID IMAGE COMMAND |
3 |
CREATED STATUS PORTS |
4 |
NAMES |
5 |
2f542e1cb88b nginx "nginx -g 'daemon ..." |
6 |
12 hours ago Up 12 hours 443/tcp, 0.0.0.0:9000->80/tcp |
7 |
nginx |
Вы получаете много информации о каждом контейнере, включая идентификатор контейнера, образ, команду, когда он была создан, его текущий статус, его порты и имена. Из-за объема данных тяжело тут разобраться. Мы увидим позже, как фильтровать и форматировать вывод. Обратите внимание, что команда усечена (а также идентификатор контейнера). Чтобы показать полную команду, добавьте --no-trunc
:
1 |
$ docker ps --no-trunc |
2 |
|
3 |
IMAGE COMMAND |
4 |
nginx "nginx -g 'daemon off;'" |
Теперь видна полная команда: nginx -g 'daemon off;'
Все контейнеры
Как вы помните, Docker продолжает останавливать контейнеры (если вы не запустили их с помощью --rm
). Добавление -a
показывает все контейнеры:
1 |
$ docker ps -a |
2 |
CONTAINER ID IMAGE STATUS NAMES |
3 |
cc797c61dc21 busybox Exited busybox |
4 |
67f3cb5a9647 busybox Exited ecstatic_jones |
5 |
898fb562e535 hello-world Exited hopeful_spence |
6 |
6dd210fda2d8 hello-world Created infallible_curie |
7 |
2f542e1cb88b nginx Up 12 hours nginx |
Форматирование
Вывод команды docker ps
может быть слишком подробным и часто показывает слишком много полей, которые не интересны. Вы можете использовать форматирование Go-шаблона, чтобы отображать только интересующие вас поля. Здесь отображается только имя и команда:
1 |
$ docker ps --no-trunc --format '{{.Names}}\t{{.Command}}' |
2 |
nginx "nginx -g 'daemon off;'" |
Это работает, но чтобы представить его с именами полей, добавьте «table» в начало строки формата:
1 |
$ docker ps -a --no-trunc --format 'table {{.Names}}\t{{.Command}}' |
2 |
NAMES COMMAND |
3 |
busybox "cat /data/1.txt" |
4 |
ecstatic_jones "cat /data/1.txt" |
5 |
hopeful_spence "/hello" |
6 |
infallible_curie "ls -la" |
7 |
nginx "nginx -g 'daemon off;'" |
Имя формата для идентификатора контейнера (не выбранного здесь) - {{.ID}}
.
Фильтрация
Команда docker ps
поддерживает множество фильтров. Они довольно просты в использовании. Синтаксис: -f "<filter> = <значение>"
. Поддерживаемые фильтры: id, label, name, exited, status, ancestor, before, since, isolation, network и health.
Здесь выполняется фильтрация по имени контейнера и отображается только контейнер busybox:
1 |
$ docker ps -a -f "name=busybox" \ |
2 |
--format 'table {{.ID}}\t{{.Status}}\t{{.Names}}' |
3 |
CONTAINER ID STATUS NAMES |
4 |
cc797c61dc21 Exited (0) 11 minutes ago busybox |
Флаг -q
Если все, что вам нужно, это идентификатор контейнера, используйте флаг -q
(тихий флаг). Это проще, чем --format 'table {{.ID}}'
. Это часто необходимо, когда вы хотите выполнять операции с несколькими контейнерами (вы увидите пример позже).
1 |
$ docker ps -aq |
2 |
cc797c61dc21 |
3 |
67f3cb5a9647 |
4 |
898fb562e535 |
5 |
6dd210fda2d8 |
6 |
2f542e1cb88b |
Остановка, запуск и перезапуск контейнеров
Вы можете остановить запуск контейнеров и запустить остановленный контейнер. Существует несколько различий между запуском остановленного контейнера и запуском нового экземпляра того же образа:
- Вы используете одни и те же переменные среды, тома, порты и другие аргументы исходной команды запуска.
- Вам не нужно создавать еще один контейнер.
- Если остановленный экземпляр изменил свою файловую систему, запущенный контейнер будет использовать то же самое.
Давайте остановим контейнер nginx, а затем запустим его. Когда вы ссылаетесь на контейнер, вы можете использовать его имя или однозначный префикс своего идентификатора. Обычно я называю свои контейнеры долгожители, поэтому у меня есть значащий дескриптор и не нужно иметь дело с автогенерируемыми именами Docker или префиксами идентификаторов контейнеров.
1 |
$ docker stop nginx |
2 |
nginx |
3 |
|
4 |
$ docker ps -a -f "name=nginx" --format 'table {{.Names}}\t{{.Status}}' |
5 |
NAMES STATUS |
6 |
nginx Exited (0) 2 minutes ago |
ОК. Nginx остановлен (статус « Exited»). Давайте начнем:
1 |
$ docker start nginx |
2 |
nginx |
3 |
|
4 |
$ docker ps -a -f "name=nginx" --format 'table {{.Names}}\t{{.Status}}' |
5 |
NAMES STATUS |
6 |
nginx Up 33 seconds |
Перезапуск работающего контейнера - это еще один вариант, который эквивалентен docker stop
, за которым следует docker start
.
$ docker restart nginx
1 |
nginx |
2 |
$ docker ps -a -f "name=nginx" --format 'table {{.Names}}\t{{.Status}}' |
3 |
NAMES STATUS |
4 |
nginx Up 2 seconds |
Присоединение к работающему контейнеру
Когда вы запускаете остановленный контейнер, или если вы запускаете свой контейнер в отсоединенном режиме (-d
аргумент командной строки), вы не можете видеть результат. Но вы можете присоединиться к нему.
1 |
$ docker attach nginx |
2 |
172.17.0.1 - - [19/Mar/2017:08:40:03 +0000] "HEAD / HTTP/1.1" 200 0 "-" |
3 |
"HTTPie/0.8.0" "-" |
Удаление контейнеров
Вы можете удалить остановленные контейнеры с помощью команды: docker rm <идентификатор контейнера или имя>
1 |
$ docker rm ecstatic_jones |
2 |
ecstatic_jones |
Если вы хотите удалить запущенный контейнер, вы можете сначала остановить его или использовать аргумент командной строки -f
(force):
1 |
$ docker rm -nginx |
2 |
Error response from daemon: You cannot remove a running container |
3 |
3dbffa955f906e427298fbeb3eadfd229d64365dd880c9771a31b0aedb879d6d. |
4 |
Stop the container before attempting removal or use -f |
5 |
|
6 |
$ docker rm -f -nginx |
7 |
nginx |
Если вы хотите удалить все контейнеры, вот удобный фрагмент команды:
docker rm -f $ (docker ps -aq)
Если вы хотите удалить только остановленный контейнер, удалите флаг -f
(force).
Выполнение команды внутри исполняемого контейнера
Docker запускает один процесс внутри контейнера, но вы можете выполнять дополнительные команды в запущенном контейнере. Это очень похоже на предоставление пользовательской команды команде docker run
, за исключением того, что в этом случае она работает бок о бок с командой запуска.
Простые команды
Выполнение простой команды выполняется через docker exec
. Вы предоставляете идентификатор или имя запускаемого контейнера и команду, которую вы хотите выполнить. Посмотрим файл nginx.conf внутри контейнера nginx и посмотрим, сколько рабочих процессов настроено.
1 |
$ docker exec nginx cat /etc/nginx/nginx.conf | grep worker_processes |
2 |
worker_processes 1; |
Интерактивная оболочка
Одним из лучших методов устранения неполадок с контейнерами Docker является подключение к интерактивной оболочке и просто просмотр внутренней файловой системы. Чтобы прикрепить stdin и иметь tty, вам необходимо предоставить аргументы командной строки -i -t
(можно сгруппировать как -it
), а затем имя исполняемого файла оболочки (обычно bash).
Вы получаете доступ к оболочке вашего контейнера. Ниже приведен пример проверки рабочих процессов в интерактивном режиме из «внутри» контейнера.
1 |
$ docker exec -it nginx bash |
2 |
root@b010e854bb98:/# cat /etc/nginx/nginx.conf | grep worker_processes |
3 |
worker_processes 1; |
4 |
root@b010e854bb98:/# |
Вывод
Docker - мощная платформа, и поскольку контейнер является его подразделением, он предоставляет множество инструментов для управления и работы с контейнерами. Я описал большинство важных аспектов работы с контейнерами, но есть множество дополнительных функций, опций и нюансов для команд, которые я рассмотрел, а также некоторые дополнительные команды.
Если вы тесно работаете с контейнерами Docker, найдите время, чтобы погрузиться и узнать все о них. Это будет очень интересно и полезно.