Red Hat System Administration II 8.2

Расширенное управление контейнерами

Задачи

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

Администрирование контейнеров с помощью Podman

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

Настройка контейнеров

Вы использовали команду podman run для запуска контейнеров из образов контейнеров в другом упражнении. Когда вы запускаете контейнер, он запускает процесс внутри нового контейнера. Процесс может быть приложением, например веб-сервером или сервером базы данных. Этому приложению может потребоваться взаимодействовать с другими системами по сети и, следовательно, может потребоваться его настройка.

Чтобы получить сетевой доступ к контейнеру, клиенты должны подключаться к портам на хосте контейнеров, передающим сетевой трафик на порты контейнера. Для настройки контейнера, как правило, можно передать контейнеру некоторые переменные окружения с пользовательскими параметрами вместо изменения образа контейнера.

Сопоставление портов хоста контейнеров с портами контейнера

Когда сетевой порт на хосте контейнеров сопоставляется с портом контейнера, контейнер получает сетевой трафик, отправляемый на сетевой порт хоста.

Например, можно сопоставить порт 8000 хоста контейнеров с портом 8080 контейнера. В контейнере может быть запущен процесс httpd, прослушивающий порт 8080. Поэтому трафик, отправляемый на порт 8000 хоста контейнеров, будет получен веб-сервером, запущенным в контейнере.

Для настройки сопоставления портов используется команда podman run с опцией -p. Она принимает два номера портов, разделенных двоеточием: порт хоста контейнеров, за которым следует порт контейнера.

В приведенном далее примере используется опция -d для запуска контейнера в отсоединенном режиме (в виде демона). При использовании опции -d команда podman выводит на экран только идентификатор контейнера. Опция -p 8000:8080 сопоставляет порт 8000 хоста контейнеров с портом 8080 контейнера. Образ контейнера registry.redhat.io/rhel8/httpd-24 запускает HTTP-сервер Apache, который прослушивает подключения на порту 8080.

[user@host ~]$ podman run -d -p 8000:8080 registry.redhat.io/rhel8/httpd-24
4a24ee199b909cc7900f2cd73c07e6fce9bd3f53b14e6757e91368c561a8edf4
[user@host ~]$ 

Вы можете использовать команду podman port с идентификатором или именем контейнера, чтобы отобразить его сопоставления портов, или с опцией -a, чтобы отобразить все используемые сопоставления портов. В следующем примере показаны все сопоставления портов, заданные на хосте контейнеров. Вывод указывает, что порт 8000 хоста контейнеров сопоставлен с портом 8080/tcp контейнера с идентификатором, начинающимся на 4a24ee199b90.

[user@host ~]$ podman port -a
4a24ee199b90    8080/tcp -> 0.0.0.0:8000

Кроме того, необходимо убедиться, что брандмауэр на хосте контейнеров позволяет внешним клиентам подключаться к сопоставленному порту. В предыдущем примере также может потребоваться добавить порт 8000/tcp в текущие правила брандмауэра на хосте контейнеров.

[root@host ~]# firewall-cmd --add-port=8000/tcp
success

Важно

Контейнер без прав root не может открыть на хосте контейнеров порт с номером меньше 1024 («привилегированные порты»). То есть опция -p 80:8080 не будет работать для контейнера, который запускается пользователем, отличным от root. Это ограничение для пользователей, отличных от root, в системе Linux. Чтобы сопоставить порт ниже 1024 на хосте контейнеров с портом контейнера, необходимо выполнить команду podman как пользователь root или внести другие изменения в систему.

Вы можете сопоставить порт выше 1024 на хосте контейнеров с привилегированным портом контейнера, даже если вы работаете с контейнером без прав root. Сопоставление -p 8080:80 работает, если контейнер предоставляет службу, которая прослушивает порт 80.

Передача переменных окружения для настройки контейнера

Настройка контейнера может быть сложной задачей, так как обычно вы не изменяете образ контейнера для настройки. Однако вы можете передать контейнеру переменные окружения, а контейнер может использовать значения этих переменных для настройки приложения.

Чтобы узнать, какие переменные доступны и что они делают, используйте команду podman inspect для просмотра сведений об образе контейнера. Например, ниже приведен образ контейнера из одного из реестров Red Hat.

[user@host ~]$ podman inspect registry.redhat.io/rhel8/mariadb-103:1-102
[
  {
...output omitted...
    "Labels": {
...output omitted...
      "name": "rhel8/mariadb-103",
      "release": "102",
      "summary": "MariaDB 10.3 SQL database server",
      "url": "https://access.redhat.com/containers/#/registry.access.redhat.com/rhel8/mariadb-103/images/1-102",
      "usage": "podman run -d -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -e MYSQL_DATABASE=db -p 3306:3306 rhel8/mariadb-103",
      "vcs-ref": "ab3c3f15b6180b967a312c93e82743e842a4ac7c",
      "vcs-type": "git",
      "vendor": "Red Hat, Inc.",
      "version": "1"
  },
...output omitted...

Метка url указывает на веб-страницу в Red Hat Container Catalog, на которой описываются переменные среды и приведены другие сведения об использовании образа контейнера. Метка usage предоставляет пример обычной команды podman для запуска образа.

На странице, указанной в метке url для этого образа, показано, что контейнер использует порт 3306 для сервера базы данных и доступны следующие переменные окружения для настройки службы базы данных:

MYSQL_USER

Имя пользователя для создаваемой учетной записи MySQL.

MYSQL_PASSWORD

Пароль для учетной записи пользователя.

MYSQL_DATABASE

Имя базы данных.

MYSQL_ROOT_PASSWORD

Пароль пользователя root (необязательно).

Используйте команду podman run с опцией -e для передачи переменных окружения процессу внутри контейнера. В следующем примере опции окружения и портов применяют параметры конфигурации к контейнеру.

[user@host ~]$ podman run -d --name container_name -e MYSQL_USER=user_name -e MYSQL_PASSWORD=user_password -e MYSQL_DATABASE=database_name -⁠e MYSQL_ROOT_PASSWORD=mysql_root_password -p 3306:3306 registry.redhat.io/⁠rhel8/⁠mariadb-103:1-102
abcb42ef2ff1b85a50e3cd9bc15877ef823979c8166d0076ce5ebc5ea19c0815

Опция --name назначает контейнеру указанное имя, что упрощает идентификацию данного контейнера. Если вы не зададите имя контейнера, podman назначит произвольное имя.

Управление контейнерами

Создание и запуск контейнера ― это только первый шаг в жизненном цикле контейнера. Этот жизненный цикл также включает остановку, повторный запуск и удаление контейнера. Кроме того, пользователи могут просматривать состояние и метаданные контейнера с целью отладки, обновления или создания отчетов.

Команда podman ps отображает список запущенных контейнеров.

[user@host ~]$ podman ps
CONTAINER ID     IMAGE                                              COMMAND
89dd9b6354ba1   registry.redhat.io/rhel8/mariadb-103:1-1022       run-mysqld3

CREATED          STATUS                   PORTS                     NAMES
10 minutes ago4 Up 10 seconds5          0.0.0.0:3306->3306/tcp6  my-database7

1

Каждому создаваемому контейнеру назначается уникальный шестнадцатеричный идентификатор. Идентификатор контейнера не связан с идентификатором образа.

2

Образ контейнера, который использовался для запуска контейнера.

3

Команда, которая была выполнена при запуске контейнера.

4

Дата и время запуска контейнера.

5

Общее время работы контейнера (если он еще работает) или время после завершения.

6

Порты, которые контейнер сделал доступными, или переадресация портов, если она была настроена.

7

Имя контейнера.

По умолчанию утилита Podman не удаляет сразу остановленные контейнеры, а хранит их локальные файловые системы и другие состояния для облегчения анализа после завершения работы, если только вы не запустите контейнер повторно. Если вы запустите контейнер, используя команду podman run с опцией --rm, контейнер будет автоматически удален после завершения работы.

Команда podman ps -a отображает все контейнеры, включая остановленные.

[user@host ~]$ podman ps -a
CONTAINER ID     IMAGE                                            COMMAND
30b743973e98     registry.redhat.io/rhel8/httpd-24:1-105          /bin/bash

CREATED          STATUS                    PORTS                  NAMES
17 minutes ago   Exited (0) 18 minutes ago 80/tcp                 my-httpd

Примечание

При создании контейнера утилита podman прерывает работу, если имя контейнера уже используется, даже если контейнер находится в остановленном состоянии. Такая мера защиты предотвращает дублирование имен контейнеров.

Команда podman stop останавливает запущенный контейнер безопасным образом. Команда stop отправляет сигнал SIGTERM для завершения работы запущенного контейнера. Если контейнер не останавливается после периода отсрочки (по умолчанию 10 секунд), Podman отправляет сигнал SIGKILL.

[user@host ~]$ podman stop my-httpd-container
77d4b7b8ed1fd57449163bcb0b78d205e70d2314273263ab941c0c371ad56412

Важно

Если образ контейнера используется остановленным контейнером, для его удаления с помощью команды podman rmi или podman image rm необходимо включить опцию -f, которая сначала удаляет все контейнеры, использующие этот образ.

Команда podman rm удаляет контейнер с хоста. Контейнер должен быть остановлен. В противном случае необходимо включить опцию -f, которая также удаляет запущенные контейнеры. Команда podman rm -a удаляет все остановленные контейнеры с хоста. Идентификаторы всех удаляемых контейнеров выводятся на экран.

[user@host ~]$ podman rm my-database
abcb42ef2ff1b85a50e3cd9bc15877ef823979c8166d0076ce5ebc5ea19c0815

Команда podman restart повторно запускает остановленный контейнер. Команда создает новый контейнер с идентификатором остановленного контейнера, используя его состояние и файловую систему.

[user@host ~]$ podman restart my-httpd-container
77d4b7b8ed1fd57449163bcb0b78d205e70d2314273263ab941c0c371ad56412

Команда podman kill отправляет сигналы UNIX главному процессу в контейнере. Это те же сигналы, которые используются командой kill.

Это может быть полезно, если главный процесс в контейнере может выполнять действия при получении определенных сигналов, а также для устранения проблем. Если сигнал не указан, команда podman kill отправляет сигнал SIGKILL, завершающий главный процесс и контейнер.

[user@host ~]$ podman kill my-httpd-container
77d4b7b8ed1fd57449163bcb0b78d205e70d2314273263ab941c0c371ad56412

Сигнал можно указать с помощью опции -s.

[user@host ~]$ podman kill -s SIGKILL my-httpd-container
77d4b7b8ed1fd57449163bcb0b78d205e70d2314273263ab941c0c371ad56412

Любой сигнал UNIX может быть отправлен в главный процесс. Команда podman kill принимает имя или номер сигнала.

Примечание

Команда podman stop пытается выполнить команду stop для образа контейнера и в случае неудачи отправляет контейнеру сигналы SIGTERM и SIGKILL.

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

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

Команда podman exec запускает дополнительный процесс внутри запущенного контейнера.

[user@host ~]$ podman exec 7ed6e671a600 cat /etc/redhat-release
Red Hat Enterprise Linux release 8.2 (Ootpa)
[user@host ~]$ 

В предыдущем примере для выполнения команды используется идентификатор контейнера. Часто проще использовать вместо него имя контейнера. Если требуется присоединить интерактивную командную оболочку, необходимо указать опции -i и -t, чтобы открыть интерактивный сеанс и выделить псевдотерминал для оболочки.

[user@host ~]$ podman exec -it my_webserver /bin/bash
bash-4.4$ hostname
7ed6e671a600
bash-4.4$ exit
[user@host ~]$ 

Podman запоминает последний контейнер, использовавшийся в любой команде. Можно указать опцию -l, чтобы использовать идентификатор или имя контейнера из предыдущей команды Podman в новой команде.

[user@host ~]$ podman exec -l cat /etc/redhat-release
Red Hat Enterprise Linux release 8.2 (Ootpa)
[user@host ~]$ 

Ссылки

Man-страницы podman-run(1), podman-exec(1), podman-ps(1), podman-stop(1), podman-restart(1), podman-kill(1), podman-rm(1), podman-rmi(1), podman-images(1) и podman-port(1)

Дополнительные сведения см. в главе Working With Containers руководства Red Hat Enterprise Linux 8 Building, Running, and Managing Containers: https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html-single/building_running_and_managing_containers/index#working-with-containers_building-running-and-managing-containers