Контейнеры 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, выполняемая в терминале, запускает контейнер и запускает в нем оболочку bash.
Доступ к контейнеру с помощью Docker Run.

Как и зачем использовать docker Attach

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

Чтобы использовать его, запустите свой контейнер, используя docker run. Затем отсоедините его, нажав Ctrl+П и 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) и код>docker Compose (версия 2). Синтаксис версии 2 более гибкий и мощный, поэтому рекомендуется использовать его всякий раз, когда это возможно.

Команды docker compose run и docker compose exec, выполняемые в терминале для доступа к контейнерам.
Использование 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"]

Команда SSH, выполняемая в терминале для доступа к контейнеру.
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-контейнер. Используйте -d для запуска контейнера в отключенном режиме. Затем сопоставьте порт 22 внутри контейнера с портом 2222 на хост-компьютере с помощью -p.

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

Посетите Kinsta для размещения ваших приложений, веб-сайтов WordPress или баз данных. С Kinsta у вас есть быстрый и безопасный хост, а ваши проекты развернуты в инфраструктуре, построенной на сети премиум-уровня Google Cloud Platform и машинах C2. Выбирайте между 35 центрами обработки данных и CDN с поддержкой HTTP/3 и более чем 260 точками доступа. Обеспечьте безопасность благодаря технологии изолированного контейнера, двум надежным межсетевым экранам и усовершенствованной защите от DDoS-атак на базе Cloudflare. И вы можете интегрировать приложения или автоматизировать рабочие процессы с помощью Kinsta API.