Сегодня мы продолжим говорить про управление контейнерами Docker и в этой статье я хочу рассказать о том как подключиться к контейнеру. Это можно сделать двумя способами. Либо при создании контейнера передав специальные опции команде docker run или к уже работающему контейнеру с помощью команды docker attach.
Если контейнер уже создан, но в нём есть ошибка и он не запускается, подключится к нему не получится. Нельзя запустить существующий контейнер и сразу же к нему подключится потому что в контейнере должна быть одна основная команда, пока она выполняется контейнер будет работать. При создании можно заменить эту команду на /bin/bash и спокойно с ним работать. При запуске контейнера ничего менять нельзя.
Как подключиться к контейнеру Docker
Дальше мы рассмотрим оба способа, но давайте начнём с создания контейнера. Подробнее об этом рассказано здесь. Чтобы сразу же после создания контейнера подключится к нему надо передать опции -it, а также указать основную программу контейнера, для работы в терминале нам понадобится /bin/bash. Опция -i указывает что надо работать интерактивно, а -t привязывает к контейнеру псевдоконсоль:
docker run -it ubuntu /bin/bash
Теперь вы находитесь в командной оболочке контейнера и он будет запущен пока будет запущена эта оболочка. Если вы выполните команду exit, контейнер завершится. При создании контейнера можно указать его имя чтобы к нему было легче обращаться:
docker run --name losst_ubuntu -it ubuntu /bin/bash
Теперь вы можете отключится от этого контейнера выполнив команду exit, а затем запустить его:
docker start losst_ubuntu
По умолчанию контейнер запускается в фоновом режиме, чтобы как и в предыдущем случае получить доступ к выводу основной программы используйте опцию -i:
docker start -i losst_ubuntu
Если контейнер уже запущен и вы хотите подключится к терминалу, в который выводится вывод основной команды, используйте команду attach:
docker attach -i losst_ubuntu
Обратите внимание, что это не всегда будет командная строка, в которой можно выполнять команды. Так будет только если при создании контейнера главной программой была выбрана командная оболочка. Например, при запуске mysql вы увидите только вывод сервиса mysql:
docker run --name losst_mysql -e MYSQL_ROOT_PASSWORD=password -it mysql
Как вы понимаете, к такому контейнеру не получится подключится для выполнения команд выше описанным способом. Если мы переопределим основную программу mysql больше не будет выполняться и нам от контейнера будет мало толку. Для таких случаев существует команда exec. Она позволяет создать новую сессию и выполнить в ней любую команду, например, ту же командную оболочку. Если вы не знаете имя контейнера, его можно посмотреть командой docker ps:
docker ps
Если нужный вам контейнер сейчас не запущен используйте опцию -a. Обращаться к контейнеру можно по его имени, например, losst_mysql или по его идентификатору, например, ee81e6ea7373. К тому же если вы не задали имя вручную, то контейнер получит автоматически сгенерированное имя и оно тоже вполне читаемо. Например, пока контейнер losst_mysql работает мы можем к нему подключится:
docker exec -it losst_mysql /bin/bash
Если вы закроете эту сессию, с контейнером ничего не произойдёт, он не завершится, просто закроется текущая сессия. Так что это самый верный способ подключится к контейнеру Docker.
Выводы
В этой статье мы рассмотрели как подключится к контейнеру Docker для выполнения команд внутри контейнера или для того чтобы посмотреть вывод основной команды. Как видите, всё просто.