Управление контейнерами с помощью клиента Docker: добавьте эти команды в свой набор инструментов

Опубликовано: 16 Апреля, 2023
Управление контейнерами с помощью клиента Docker: добавьте эти команды в свой набор инструментов

Иногда управление контейнерами может быть немного пугающим для ИТ-специалиста, не привыкшего к этой технологии. Я надеюсь внести больше ясности — и немного меньше страха — в эту тему, объяснив, как мы можем управлять и выполнять некоторые задачи, связанные с управлением контейнерами.

Традиционно при управлении физическим сервером или виртуальной машиной нам достаточно подключиться по RDP (при работе под Windows) или SSH при работе под Linux, чтобы получить доступ к консоли, и оттуда мы выполняем свои задачи. Однако контейнеры были спроектированы так, чтобы быть готовыми к производству. Теоретически мы не должны, поскольку ИТ-специалисты ежедневно подключают и управляют ими. Но важно понимать, как выполнять такого рода задачи по устранению неполадок и разбираться в технологии.

Запуск контейнеров

Первая ошибка, которую может совершить ИТ-специалист при создании контейнера, — забыть о взаимосвязи образа и контейнера. Существует связь, при которой один образ позволяет создавать N контейнеров. Имейте в виду, что образ доступен только для чтения, и когда мы создаем контейнер, у нас есть тонкий слой для чтения и записи, который позволяет нам записывать данные в контейнер, и эти данные будут сохраняться в течение всего срока службы контейнера.

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

К чему я все это говорю? Давайте рассмотрим простой пример: мы выполняем docker run alpine, и контейнер сразу же закрывается, поэтому мы использовали -it, что делает его интерактивным и использует текущий терминал. Поскольку я хочу, чтобы этот сеанс работал в фоновом режиме, я буду использовать последовательность клавиш Ctrl + p, а затем Ctrl + q. Я сделаю это четыре раза, как показано на изображении ниже.

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

Если мы скопируем файл в первый контейнер (например, cranky_pike), файл будет только в этом контейнере, и я предполагаю, что вы не запомните имя или идентификатор контейнера, поэтому лучшим решением всегда будет использование switch –name <name> для соответствующей маркировки вашего контейнера, и такой переключатель можно использовать во время создания контейнера.

Поскольку мы находимся в текущем сценарии, если нам нужно вернуться к этой оболочке любого данного контейнера, мы можем воспользоваться командой docker container attach <container-name>.

Примечание. Вы можете использовать имя контейнера или любую строку для уникальной идентификации контейнера. Нам не нужно вводить весь идентификатор контейнера. В этом случае я мог бы использовать только букву «f», потому что этот контейнер — единственный, который начинается с «f».

Мой текущий список контейнеров пуст. Почему?

В списке контейнеров Docker клиентской команды Docker будут перечислены только активные контейнеры. Чтобы получить список всех контейнеров, просто добавьте переключатель -all в конце той же команды клиента Docker (как показано на изображении ниже).

Большой! Но я хочу вернуться к определенному контейнеру, потому что мне нужно что-то проверить или взять файл. Не проблема. Сначала нужно запустить контейнер, а затем вернуться к сеансу. Прелесть в том, что та же самая команда, которую мы использовали для создания, используется для запуска контейнера (что имеет смысл), поэтому нет необходимости передавать дополнительные параметры. Используя следующие клиентские команды Docker, мы сможем запустить любой остановленный контейнер.

запуск контейнера докеров <имя-или-идентификатор-контейнера>
docker container attach <имя-или-идентификатор-контейнера>

Есть ли способ автоматически очищать неиспользуемые контейнеры?

Да и нет. Если мы используем ключ –rm при создании контейнера, мы устанавливаем на нем флаг, что как только контейнер выйдет, он будет удален. Пожалуйста, будьте очень осторожны при использовании этой опции.

docker run -it –name <имя-контейнера> –hostname <имя-контейнера> –rm alpine

Если вы хотите удалить все контейнеры в одной строке, вот одна строка для этого (первые две строки и последняя просто показывают логику создания одной строки). Имейте в виду, что мы удаляем все контейнеры, поэтому используйте его на свой страх и риск.

список контейнеров докеров
список контейнеров докеров -aq
контейнер докеров rm $(список контейнеров докеров -aq) -f
список контейнеров докеров

Переключатель –name помогает, но имя внутри виртуальной машины не определяется

Вот как это исправить. Использование параметра –name определит метку для данного контейнера. Если мы хотим настроить имя внутри контейнера, нам нужен дополнительный параметр (—hostname). Пример синтаксиса, используемого для контейнера, выделен ниже. Мы подключились к оболочке данного контейнера и проверили имя, которое используется в контейнере Linux.

docker run -it –hostname container002 –name container002 alpine

Выполнение команд в контейнере

Иногда при управлении контейнерами было бы намного проще запустить команду в контейнере, чтобы сэкономить время на устранение неполадок в другом месте, верно? Это не проблема. Мы можем использовать команду docker container exec для запуска определенных команд в любом заданном контейнере.

Для наглядности первые две команды ( и ipconfig) выполняются на хосте. Никаких сюрпризов. Однако, чтобы получить информацию из контейнера напрямую, мы можем использовать следующую команду:

docker container exec <имя-контейнера> <команда>

Подключение к консоли (Linux и Windows)

При использовании контейнера Windows (операционная система Windows) мы можем выполнить команду cmd, которая откроет нам командную строку контейнера. Следующая команда открывает консоль контейнера, помеченного как webserver.

docker container exec -it веб-сервер cmd

Если вы хотите использовать Linux, нам просто нужно изменить инструкцию команды. В контейнерах Linux можно использовать следующую команду:

docker container exec -it <имя-контейнера> /bin/sh

Если мы используем PowerShell при выполнении команды Docker, первое, что мы заметим, — это черный фон, созданный CMD. Все остальные команды, выполняемые на изображении ниже, выполняются на уровне контейнера. Если вы не уверены, имя машины является хорошим показателем, а также количество процессов, которые можно получить с помощью списка задач.

Управление контейнерами: поверхностное знакомство

Все ли мы знаем об управлении контейнерами после прочтения этой статьи? Точно нет! Мы только начинаем! Если вы хотите продолжать исследовать и пробовать новые вещи, эти две клиентские команды Docker:

докер-контейнер – помощь
запуск контейнера докеров – помощь

Теперь вы на пути к тому, чтобы стать экспертом в управлении контейнерами.