Найти тему
ИТ разнообразно

Настройка контейнера для автоматического запуска в качестве службы systemd. Часть 4.

Оглавление

Настройка контейнеров с помощью systemd. Продолжаем.

Следующий шаг — создание каталога ~/.config/systemd/user/ для хранения файла container-httpd.service и перезагрузка демона systemd. Вы также можете использовать каталог /etc/systemd/system, но только привилегированный пользователь может скопировать служебный файл systemd в этот каталог. Вот команды:

$ mkdir -p ~/.config/systemd/user/
$ cp -Z container-httpd.service ~/.config/systemd/user/
$ ls ~/.config/systemd/user/
container-httpd.service
$ systemctl --user daemon-reload

Почти готово. Запускаем контейнер с помощью systemctl, используя только что созданный сервис systemd, и проверяем, правильно ли он работает:

$ systemctl --user start container-httpd.service
$ systemctl --user status container-httpd.service
● container-httpd.service - Podman container-httpd.service
Loaded: loaded (/home/webuser/.config/systemd/user/container-httpd.service; disabled; vendor preset: disabled)
Active: active (running) since Wed 2023-02-01 16:11:28 -03; 1min 13s ago
Docs: man:podman-generate-systemd(1)
Process: 4564 ExecStartPre=/bin/rm -f /run/user/1001/container-httpd.service.ctr-id (code=exited, status=0/SUCCESS)
Main PID: 4600 (conmon)
Tasks: 14 (limit: 4649)
Memory: 4.6M
CPU: 139ms
CGroup: /user.slice/user-1001.slice/user@1001.service/app.slice/container-httpd.service
├─ 4585 /usr/bin/slirp4netns --disable-host-loopback --mtu=65520 --enable-sandbox --enable-seccomp --enable-ipv6 -c -e 3 -r 4 --netns-t>
├─ 4587 rootlessport
├─ 4592 rootlessport-child
└─ 4600 /usr/bin/conmon --api-version 1 -c
81b6c1c3125bd9a10ad3bb5f62534cc01caf6e070a948be6ce0afa924d1b2b1b -u 81b6c1c3125bd9a10ad3bb5f>
…output omitted…

Кажется, работает. Чтобы убедиться в этом, проверяем запущенный контейнер с помощью Podman и пробуем снова использовать curl для вашего приложения:

$ podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
81b6c1c3125b docker.io/library/httpd:latest httpd-foreground 2 minutes ago Up 2 minutes ago 0.0.0.0:8081->80/tcp httpd
$ curl -v http://localhost:8081*
Trying 127.0.0.1:8081...
* Connected to localhost (127.0.0.1) port 8081 (#0)
> GET / HTTP/1.1
> Host: localhost:8081
> User-Agent: curl/7.82.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Date: Wed, 01 Feb 2023 19:14:32 GMT
< Server: Apache/2.4.55 (Unix)
< Last-Modified: Fri, 07 Oct 2022 21:34:58 GMT
< ETag: "74-5ea7894e36d30"
< Accept-Ranges: bytes
< Content-Length: 116
< Content-Type: text/html
<
<html>
<header>
<title>Enable SysAdmin</title>
</header>
<body>
<p>Hello World!</p>
</body>
</html>
* Connection #0 to host localhost left intact

Бинго! Теперь вы можете настроить его для запуска и остановки в вашей системе, включив его с помощью systemctl:

$ systemctl --user enable container-httpd.service
Created symlink /home/webuser/.config/systemd/user/default.target.wants/container-httpd.service → /home/webuser/.config/systemd/user/container-httpd.service.

Протестируйте его и перезагрузите систему. Если он работает правильно, при загрузке системы служба контейнера httpd должна начать использовать systemd. Он должен быть активен, включён и реагировать. Подтвердите это с помощью curl:

$ uptime
16:16:47 up 36 min, 1 user, load average: 0,00, 0,03, 0,16
# reboot
$ systemctl --user is-active container-httpd.service
active
$ systemctl --user is-enabled container-httpd.service
enabled
$ curl -v http://localhost:8081
* Trying 127.0.0.1:8081...
* Connected to localhost (127.0.0.1) port 8081 (#0)
> GET / HTTP/1.1
> Host: localhost:8081
> User-Agent: curl/7.82.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Date: Wed, 01 Feb 2023 19:20:18 GMT
< Server: Apache/2.4.55 (Unix)
< Last-Modified: Fri, 07 Oct 2022 21:34:58 GMT
< ETag: "74-5ea7894e36d30"
< Accept-Ranges: bytes
< Content-Length: 116
< Content-Type: text/html
<
<html>
<header>
<title>Enable SysAdmin</title>
</header>
<body>
<p>Hello World!</p>
</body>
</html>
* Connection #0 to host localhost left intact
$ podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c8a15a2853ac docker.io/library/httpd:latest httpd-foreground 3 minutes ago Up 3 minutes ago 0.0.0.0:8081->80/tcp httpd

Это сработало! У вас есть контейнер с веб-приложением, работающим так, как если бы это была стандартная служба systemd. Он остается постоянным после перезагрузки или выхода из терминала. Та же процедура работает и для подов с небольшими изменениями.

Но что, если вам больше не нужна эта служба? Как убрать автозапуск службы после перезагрузки? Вы можете остановить и отключить службу, как службу systemd следующим образом:

$ systemctl --user stop container-httpd.service
$ podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
$ systemctl --user disable container-httpd.service
Removed /home/webuser/.config/systemd/user/default.target.wants/container-httpd.service.

В качестве окончательного теста снова перезагружаем систему и убеждаемся, что приложение не запущено:

$ uptime
16:21:34 up 4 min, 1 user, load average: 0,02, 0,10, 0,06
# reboot
$ uptime
16:22:06 up 0 min, 1 user, load average: 0,29, 0,06, 0,02
$ systemctl --user is-active container-httpd.service
inactive
$ systemctl --user is-enabled container-httpd.service
disabled
$ podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
$ curl -v http://localhost:8081
* Trying 127.0.0.1:8081...
* connect to 127.0.0.1 port 8081 failed: Connection refused
* Trying ::1:8081...
* connect to ::1 port 8081 failed: Connection refused
* Failed to connect to localhost port 8081 after 0 ms: Connection refused
* Closing connection 0
curl: (7) Failed to connect to localhost port 8081 after 0 ms:
Connection refused

Унесённые ветром! Надеюсь, я ясно продемонстрировал, как работает настройка и администрирование персистентных контейнеров с помощью systemd.

Я рекомендую вам прочитать эти статьи от моих коллег Enable Sysadmin, которые расширяют идеи этой статьи:

Заключение

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

Управление контейнерами на основе модулей systemd в основном полезно для базовых и небольших развертываний, не требующих масштабирования. Для более сложного масштабирования и оркестрации многих приложений и сервисов на основе контейнеров рассмотрите корпоративную платформу оркестрации на основе Kubernetes, например Red Hat OpenShift Container Platform. Я надеюсь, что эта статья поможет вам понять эту тему, поддержит ваш путь сертификации Linux и пополнит ваши общие знания системного администратора.

Перевод с некоторыми авторскими заголовками. Автор оригинала: Alexon Oliveira.