Контейнерные движки, такие как Podman или Docker, не были наделены способностью / возможностью управлять системными службами, такими как остановка служб, порядок запуска, проверка зависимостей и восстановление сбойных служб.
Скорее всего, это связано с тем, что другие приложения для инициализации, такие как init и systemd, были специально разработаны для этих целей.
Хорошая новость заключается в том, что теперь Podman / Docker контейнерами можно управлять аналогичным образом, как можно управлять httpd, nginx или любой другой службой, к которой вы привыкли.
Другими словами, вы можете запускать, останавливать, включать, проверять состояние своего хоста и вообще управлять контейнером как службой systemd, и мы собираемся узнать, как это сделать, в этом руководстве.
Прежде чем мы начнем, еще одна приятная особенность заключается в том, что при запуске контейнера можно дополнительно запустить определенную службу, такую как Nginx, установленную в контейнере, с помощью systemd.
Использование systemd для запуска контейнеров
Если у вас не установлен podman, выполните приведенные ниже команды, чтобы ускорить процесс:
######## CentOS 8/RHEL 8 ##########
sudo dnf -y install podman
Установите podman на Ubuntu
Посмотрите инструкцию, показанную ниже, чтобы узнать как установить podman на Ubuntu:
Как установить Podman на Ubuntu
Шаг 1: Скачайте образ, если у вас еще его нет
В качестве примера, давайте вытащим контейнер Nginx из реджестри Docker.
$ podman pull docker.io/nginx
$ podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost/firstapache latest a0c546bc3927 23 hours ago 1.68 GB
docker.io/library/nginx latest 602e111c06b6 32 hours ago 131 MB
Шаг 2: Запустите контейнер, используя Podman
На этом шаге мы инициализируем наш образ для запуска в качестве образа с именем по нашему выбору.
Если вы используете CentOS / RHEL и настаиваете на использовании SELinux, вы должны включить логическое свойство container_manage_cgroup для запуска контейнеров с systemd следующим образом
sudo setsebool -P container_manage_cgroup on
После этого приступите к запуску контейнера
$ sudo podman run -d --name nginx_server -p 7070:80 nginx
384a42964b1b133d82320ebaa2f54407c7ca23d06154a5f413c8119026bda231
$ sudo podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
384a42964b1b docker.io/library/nginx:latest nginx -g daemon o... 48 seconds ago Up 46 seconds ago 0.0.0.0:7070->80/tcp nginx_server
Шаг 3: Настройте контейнер как службу systemd
Мы собираемся создать файл конфигурации юнита в каталоге /etc/systemd/system/.
В качестве примера мы собираемся создать файл в каталоге с именем /etc/systemd/system/nginx-container.service.
Внутри файла заполните знакомые детали, как показано ниже, и убедитесь, что nginx_server совпадает с именем, которое вы дали вашему контейнеру, когда вы запустили его с помощью podman, на шаге 2.
Если вы не уверены, просто запустите «sudo podman ps »и проверьте столбец« NAMES ».
$ sudo vim /etc/systemd/system/nginx-container.service
[Unit]
Description=Cool Nginx container
Wants=syslog.service
[Service]
Restart=always
ExecStart=/usr/bin/podman start -a nginx_server
ExecStop=/usr/bin/podman stop -t 2 nginx_server
[Install]
WantedBy=multi-user.target
И теперь, мы готовы управлять контейнером, как и любой другой сервис, используя systemd.
Шаг 4: Проверка работоспособности настроек
Запустить сервис
Запустите обычную команду systemd start, чтобы запустить наш сервис
sudo systemctl start nginx-container
Проверьте его статус
$ systemctl status nginx-container
● nginx-container.service - Cool Nginx container
Loaded: loaded (/etc/systemd/system/nginx-container.service; disabled; vendor preset: disabled)
Active: active (running) since Fri 2020-04-24 21:58:15 UTC; 9s ago
Main PID: 3910 (podman)
Tasks: 11 (limit: 11121)
Memory: 32.2M
CGroup: /system.slice/nginx-container.service
└─3910 /usr/bin/podman start -a nginx_server
$ sudo systemctl enable nginx-container
Created symlink /etc/systemd/system/local.target.wants/nginx-container.service → /etc/systemd/system/nginx-container.service.
Заключение
В результате мы теперь можем запускать наши контейнеры как системные сервисы!
см. также:
🐳 Настройка локального реджестри для Docker контейнеров с помощью Podman & Let’s Encrypt SSL
🐳 Как установить Docker на CentOS 8
☸️ Как вручную скачать образы контейнеров, используя Kubernetes kubeadm
🐳 Как собирать образа контейнеров OCI и Docker с помощью Buildah
☸️ Лучшие минимальные контейнерные операционные системы для запуска Kubernetes
🥤 Как установить Podman на Arch Linux / Manjaro
🐳 Как установить и использовать Podman на CentOS 8 / RHEL 8
☸️ Как опубликовать образ Docker в Docker Hub с помощью Podman