Подготавливаем среду
Во-первых, как привилегированный пользователь создайте в системе обычного пользователя, который будет действовать как "пользователь службы" для приложения с systemd:
# useradd webuser
# passwd webuser
Changing password for user webuser.
New password: BAD PASSWORD: The password is shorter than 8 characters Retype new password:
passwd: all authentication tokens updated successfully.
Держите этот терминал открытым. В отдельном терминале подключитесь по SSH к тому же серверу со вновь созданным пользователем и убедитесь, что он может выполнять команды Podman:
$ ssh webuser@fedora
webuser@fedora's password:
Last login: Wed Feb 1 15:52:26 2023
$ podman version
Client: Podman Engine
Version: 4.3.1
API Version: 4.3.1
Go Version: go1.18.7
Built: Fri Nov 11 12:24:13 2022
OS/Arch: linux/amd64
Теперь разрешите этой учетной записи "пользователя службы" запускать службу при запуске системы, которая сохраняется после выхода из системы. Используйте команду loginctl, чтобы настроить службу пользователя systemd, чтобы она сохранялась после закрытия последнего пользовательского сеанса настроенной службы. В окне терминала привилегированного пользователя выполните следующие действия:
# loginctl show-user webuser | grep ^Linger
Linger=no
# loginctl enable-linger webuser
# loginctl show-user webuser | grep ^Linger
Linger=yes
Вернитесь к окну терминала обычного пользователя и извлеките образ контейнера для своего приложения. В этом примере я буду использовать образ контейнера httpd, потому что его проще продемонстрировать:
$ podman pull docker.io/library/httpd
Trying to pull docker.io/library/httpd:latest...
Getting image source signatures
Copying blob 70698c657149 done
Copying blob 00df85967755 done
Copying blob 8b4456c99d44 done
Copying blob ec2ee6bdcb58 done
Copying blob 8740c948ffd4 done
Copying config 6e794a4832 done
Writing manifest to image destination
Storing signatures 6e794a4832588ca05865700da59a3d333e7daaaf0544619e7f326eed7e72c903
$ podman image ls
REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/library/httpd latest 6e794a483258 2 weeks ago 149 MB
Запустите контейнер и смонтируйте внешний том в системе. Если вы читали мою статью о том, как создавать быстрые, простые и воспроизводимые контейнеры с помощью Podman и сценариев оболочки (если вы этого не сделали, проверьте её сейчас), вы знаете, что я уже создал этот внешний том с его содержимым в каталоге /var/local/httpd/:
$ ls /var/local/httpd/
index.html
$ cat /var/local/httpd/index.html
<html>
<header>
<title>Enable SysAdmin</title>
</header>
<body>
<p>Hello World!</p>
</body>
</html>
Чтобы упростить задачу (и поскольку я немного ленив), я буду использовать тот же контент для этого httpd-контейнера. Запустите его с помощью Podman, чтобы проверить, работает ли он так, как задумано:
$ podman run --name=httpd --hostname=httpd -p 8081:80 -v /var/local/httpd:/usr/local/apache2/htdocs:Z -d docker.io/library/httpdf6f3d836bde9a75c6d745f481c8e83f8c7c342db2bbeac901347c535eaef03d9
$ podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f6f3d836bde9 docker.io/library/httpd:latest httpd-foreground 5 seconds ago Up 4 seconds 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:02:28 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 stop httpd && podman rm -a && podman volume prune
httpd f6f3d836bde9a75c6d745f481c8e83f8c7c342db2bbeac901347c535eaef03d9 WARNING! This will remove all volumes not used by at least one container. The following volumes will be removed:
No dangling volumes found
$ 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 1 ms: Connection refused
* Closing connection 0
curl: (7) Failed to connect to localhost port 8081 after 1 ms:
Connection refused
Предварительные требования выполнены. Пора переходить к следующей части.
Продолжение следует...
Перевод. Автор оригинала: Alexon Oliveira.