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. Вывод
В этой статье мы увидели, как запустить док-контейнер как в подключенном, так и в автономном режиме.
Затем мы рассмотрели некоторые команды для запуска или завершения сеанса с активным контейнером.