Перейти к основному содержимому

Присоединение и отсоединение от контейнера Docker

· 4 мин. чтения

1. Обзор

При работе с докер-контейнером нам часто приходится запускать его в интерактивном режиме. Здесь мы присоединяем стандартный ввод, вывод или потоки ошибок нашего терминала к контейнеру.

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

В этой короткой статье мы познакомимся с некоторыми полезными командами для достижения этих целей. Мы также увидим различные способы отключения от сеанса без остановки контейнера.

2. Запустите контейнер в подключенном/отключенном режиме

Давайте посмотрим, как запустить контейнер в подключенном или отсоединенном режиме.

2.1. Режим по умолчанию

По умолчанию Docker запускает контейнер на переднем плане:

$ docker run --name test_redis -p 6379:6379 redis

Это означает, что мы не можем вернуться к приглашению нашей оболочки, пока процесс не завершится.

Приведенная выше команда связывает стандартный вывод ( stdout ) и стандартные потоки ошибок ( stderr ) с нашим терминалом. Итак, мы можем видеть консольный вывод контейнера в нашем терминале.

Параметр –name дает контейнеру имя. Позже мы можем использовать это имя для ссылки на этот контейнер в других командах. В качестве альтернативы мы можем обратиться к нему по идентификатору контейнера, который мы получаем, выполняя команду docker ps .

Мы также можем использовать параметр -a , чтобы выбрать определенные потоки из stdin, stdout и stderr для подключения:

$ docker run --name test_redis -a STDERR -p 6379:6379 redis

Приведенная выше команда означает, что мы видим только сообщения об ошибках из контейнера .

2.2. Интерактивный режим

Мы запускаем контейнер в интерактивном режиме с параметрами -i и -t вместе :

$ docker run -it ubuntu /bin/bash

Здесь параметр -i подключает стандартный входной поток ( stdin ) оболочки bash в контейнере, а параметр -t выделяет процессу псевдотерминал . Это позволяет нам взаимодействовать с контейнером из нашего терминала.

2.3. Отдельный режим

Запускаем контейнер в отсоединенном режиме с опцией -d :

$ docker run -d --name test_redis -p 6379:6379 redis

Эта команда запускает контейнер, печатает его идентификатор, а затем возвращается в приглашение оболочки. Таким образом, мы можем продолжать выполнять другие задачи, пока контейнер продолжает работать в фоновом режиме.

Мы можем подключиться к этому контейнеру позже, используя либо его имя, либо идентификатор контейнера.

3. Взаимодействие с работающим контейнером

3.1. Выполнить команду

Команда execute позволяет нам выполнять команды внутри уже запущенного контейнера :

$ docker exec -it test_redis redis-cli

Эта команда открывает сеанс redis-cli в контейнере Redis с именем test_redis , который уже запущен. Мы также можем использовать идентификатор контейнера вместо имени. Опция -it , как описано в разделе 2.2, включает интерактивный режим.

Однако мы можем захотеть получить значение только по ключу:

$ docker exec test_redis redis-cli get mykey

Это выполняет команду get в redis-cli , возвращает значение для ключа mykey и закрывает сеанс.

Также возможно выполнение команды в фоновом режиме:

$ docker exec -d test_redis redis-cli set anotherkey 100

Здесь мы используем -d для этой цели. Он устанавливает значение 100 для ключа AnotherKey , но не отображает вывод команды.

3.2. Присоединение сеанса

Команда attach подключает наш терминал к запущенному контейнеру :

$ docker attach test_redis

По умолчанию команда связывает стандартный ввод, вывод или потоки ошибок с оболочкой хоста.

Чтобы видеть только выходные данные и сообщения об ошибках, мы можем опустить стандартный ввод , используя параметр –no-stdin :

$ docker attach --no-stdin test_redis

4. Отсоединиться от контейнера

Способ отсоединения от контейнера докеров зависит от режима его работы.

4.1. Режим по умолчанию

Нажатие CTRL-c — это обычный способ завершения сеанса. Но если мы запустили наш контейнер без опции -d или -it , команда CTRL-c останавливает контейнер, а не отключается от него . Сеанс передает контейнеру сигнал CTRL-c , т . е. сигнал SIGINT , и завершает его основной процесс.

Давайте переопределим передачу поведения –sig-proxy=false :

$ docker run --name test_redis --sig-proxy=false -p 6379:6379 redis

Теперь мы можем нажать CTRL-c , чтобы отключить только текущий сеанс, в то время как контейнер продолжает работать в фоновом режиме.

4.2. Интерактивный режим

В этом режиме CTRL-c действует как команда для интерактивного сеанса и поэтому не работает как клавиша отсоединения. Здесь мы должны использовать CTRL-p CTRL-q для завершения сеанса .

4.3. Фоновый режим

В этом случае нам нужно переопределить значение –sig-proxy при подключении сеанса :

$ docker attach --sig-proxy=false test_redis

Мы также можем определить отдельный ключ с помощью параметра --detach-keys :

$ docker attach --detach-keys="ctrl-x" test_redis

Это отсоединяет контейнер и возвращает приглашение, когда мы нажимаем CTRL-x .

5. Вывод

В этой статье мы увидели, как запустить док-контейнер как в подключенном, так и в автономном режиме.

Затем мы рассмотрели некоторые команды для запуска или завершения сеанса с активным контейнером.