Контейнеры Docker представляют собой изолированные среды для запуска приложений, обеспечивающие согласованность и переносимость. При работе с контейнерами Docker очень важно иметь возможность просматривать их оболочки и подключаться к ним. Это позволяет выполнять команды, устранять неполадки и следить за поведением контейнеров в режиме реального времени.
В этой статье мы рассмотрим, как получить доступ к локальным и удаленным контейнерам Docker для их обслуживания и обновления.
Оглавление
Зачем нужен доступ к контейнерам
Доступ к контейнерам необходим для эффективного управления и устранения неполадок в контейнерных средах. Он позволяет анализировать журналы и информацию о времени выполнения контейнера, легко выявлять и устранять ошибки.
Доступ к контейнерам также позволяет выполнять команды для быстрого обновления конфигурации, установки пакетов и других административных задач. При отсутствии доступа пришлось бы перестраивать весь образ контейнера с обновленной конфигурацией, что может занять много времени и быть неэффективным.
Контейнеры также должны иметь возможность взаимодействовать друг с другом в распределенной экосистеме приложений. Поэтому необходим доступ к контейнерам для выполнения диагностических команд и обеспечения нормальной связи между контейнерами.
Хотя доступ к контейнерам можно получить и через традиционный протокол Secure Shell (SSH), Docker предоставляет несколько встроенных методов, позволяющих сэкономить время и повысить эффективность. К ним относятся:
- docker exec
- docker run
- docker attach
- docker compose exec
- docker compose run
Каждый метод имеет свои особенности и преимущества. Знание того, какая команда подходит для конкретного случая, поможет оптимизировать подход.
Как и зачем использовать команду docker exec
Команда docker exec позволяет получить доступ к сеансу оболочки работающего контейнера и выполнять команды без необходимости запуска нового экземпляра. Обратите внимание, что эта команда не является постоянной, то есть она не будет повторно выполнена, если контейнер выключится или перезапустится.
Чтобы получить доступ к запущенному контейнеру, необходимо знать его имя или идентификатор (его можно получить, выполнив команду docker ps -a). Затем введите его в следующую команду:
docker exec -it /bin/bash
Доступ к контейнеру с помощью docker exec
Как и зачем использовать команду docker run
Команда docker run позволяет запустить новый контейнер и сразу же получить доступ к его оболочке. По умолчанию этот контейнер не прикрепляется к текущему сеансу оболочки, но его можно прикрепить с помощью опции -it.
Следующая команда позволяет запустить новый контейнер, присоединить его к текущему сеансу оболочки и вызвать оболочку bash:
docker run -it /bin/bash
Доступ к контейнеру при помощи docker run.
Как и зачем использовать команду docker attach
Команда docker attach полезна для мониторинга и отладки работы контейнеров. Она позволяет подключаться к работающему контейнеру и просматривать его стандартные потоки ввода, вывода и ошибок в режиме реального времени.
Для ее использования запустите контейнер с помощью команды docker run. Затем отсоединитесь от него, нажав Ctrl+P и Ctrl+Q. Вместо этого можно установить флаг -d для данного контейнера.
После запуска контейнера в фоновом режиме доступ к нему можно получить с помощью следующей команды:
docker attach
Использование docker attach для доступа к контейнеру.
Как и зачем использовать Docker Compose
Docker Compose позволяет создавать и исполнять многоконтейнерные Docker-приложения. С его помощью можно определить сервисы, из которых состоит приложение, в YAML-файле, а затем использовать этот файл для запуска и управления всеми контейнерами вместе. Он подходит для сред разработки и тестирования, где необходимо быстро запускать сложные среды.
Чтобы получить доступ к конкретному уже запущенному контейнеру, выполните следующую команду docker compose, после которой укажите имя сервиса и команду, которую необходимо запустить:
docker compose exec app /bin/bash
Эта команда запускает новый процесс внутри контейнера, выполняющий указанную команду. С ее помощью можно запустить любую команду внутри контейнера, включая интерактивные оболочки типа bash.
Аналогично, если вы хотите запустить новый контейнер с помощью Docker Compose и получить к нему немедленный доступ, выполните следующую команду:
docker compose run app /bin/bash
Обратите внимание, что docker compose имеет два различных синтаксиса: docker-compose (версия 1) и code>docker compose (версия 2). Синтаксис версии 2 является более гибким и мощным, поэтому рекомендуется использовать его при любой возможности.
Использование Docker Compose для доступа к контейнерам
Как добавить SSH-сервер в контейнер Docker
Добавление SSH-сервера к контейнеру Docker помогает управлять контейнерными приложениями и устранять их неисправности. SSH-сервер позволяет удаленно получать доступ к контейнерам, управлять ими, выполнять команды и просматривать журналы из любого места.
Добавить SSH-сервер можно, включив его в Dockerfile перед сборкой контейнера, а затем подключив его с помощью SSH-клиента. Также можно добавить временный доступ к SSH, породив оболочку внутри работающего контейнера и установив в ней SSH-сервер.
Включение SSH-сервера при сборке контейнера Docker
При сборке контейнера Docker включение SSH-сервера внутрь контейнера может быть полезно, если требуется постоянный SSH-доступ к нему. Это позволяет получить удаленный доступ к контейнеру и отладить его в процессе разработки или устранения неполадок. Также включение SSH-сервера позволяет безопасно передавать файлы в контейнер и из него.
Чтобы включить SSH-сервер во время сборки, внесите несколько изменений в Dockerfile контейнера. Вот пример Dockerfile, включающего SSH-сервер:
FROM debian:latest
RUN apt-get update && apt-get install -y openssh-server
RUN mkdir /var/run/sshd
RUN echo 'root:root123' | chpasswd
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
Контейнер Docker, построенный с использованием SSH-сервера
Этот код собирает контейнер с последним образом Debian и устанавливает SSH-сервер. Он также создает новый каталог для SSH-сервера, устанавливает пароль root и включает вход root через конфигурацию SSH.
Наконец, он открывает порт 22, порт по умолчанию SSH.
Для использования этого Dockerfile необходимо собрать контейнер с помощью команды docker build, а затем запустить его с помощью docker run. Вот пример:
docker build . -t ssh-container
docker run -d -p 2222:22 ssh-container
Эта команда создает контейнер с помощью Dockerfile и помечает его именем ssh-container. Для запуска контейнера в отсоединенном режиме используйте команду -d. Далее с помощью команды -p пропишите порт 22 внутри контейнера на порт 2222 на хост-машине.
После запуска контейнера можно подключиться к нему по SSH с помощью команды ssh:
ssh root@localhost-p 2222
Когда появится запрос на ввод пароля, введите пароль, заданный в файле YAML. В данном случае это “root123”. Теперь вы подключены к SSH-серверу, запущенному внутри контейнера. Это означает, что вы можете выполнять удаленную отладку или передавать файлы в контейнер и из него.
Временное добавление SSH-сервера к запущенному контейнеру Docker
Также можно добавить SSH-сервер в работающий контейнер с помощью команды docker exec:
docker exec <container_name_or_id> /bin/bash
Получив доступ к контейнеру, установите сервер OpenSSH и запустите демон SSH:
apt update && apt install openssh-server && /usr/sbin/openssh -D
Это открывает новый экземпляр SSH-сервера внутри контейнера. Теперь вы можете подключиться к нему с помощью SSH-клиента на своей локальной машине.
Обратите внимание, что подключиться к контейнеру по SSH можно только в том случае, если вы или ваша команда открыли порт SSH на этапе выполнения или сборки.
Подключение к SSH-серверу контейнера
Начните с определения IP-адреса или имени хоста контейнера с помощью платформы или сервиса управления контейнерами.
Для подключения к IP-адресу используйте команду ssh:
ssh [username]@[container-ip-address]
В ответ на запрос введите пароль для указанного имени пользователя. Вместо пароля некоторые SSH-серверы могут использовать защиту на основе ключей.
Теперь вы должны иметь удаленный терминальный сеанс, подключенный к контейнеру.
Резюме
По мере роста популярности Docker важно иметь возможность проверять контейнеры, работающие в вашей среде. Такая возможность позволяет диагностировать и устранять проблемы в процессе разработки.
Docker также предоставляет универсальный набор встроенных команд для решения различных задач разработки. С помощью этих команд можно оптимизировать рабочий процесс, не прибегая к традиционным методам SSH.