Advertisement
  1. Code
  2. DevOps

Докер с нуля: работа с контейнерами, часть 2

Scroll to top
Read Time: 6 min
This post is part of a series called Docker from the Ground Up: Working with Containers.
Docker From the Ground Up: Working With Containers, Part 1

() 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, найдите время, чтобы погрузиться и узнать все о них. Это будет очень интересно и полезно.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.