В этом упражнении вы настроите контейнер, которым будете управлять как службой systemd, а затем с помощью команд systemctl настроите этот контейнер на автоматический запуск при запуске хост-машины.
systemd
systemctl
Результаты
Вы сможете:
создать файлы юнитов systemd для управления контейнерами;
запустить и остановить контейнеры с помощью команд systemctl;
настроить учетные записи для пользовательских служб systemd на запуск при запуске хост-машины.
Войдите на машину workstation как пользователь student с паролем student.
workstation
student
На машине workstation выполните команду lab containers-services start. Эта команда запускает подготовительный сценарий, который проверяет доступность машины servera в сети. Он также устанавливает на servera контейнерные утилиты.
lab containers-services start
servera
[student@workstation ~]$ lab containers-services start
[student@workstation ~]$
Процедура 13.5. Инструкции
С помощью команды ssh войдите на машину servera как пользователь student. Системы настроены на использование ключей SSH для аутентификации, поэтому пароль не требуется.
ssh
[student@workstation ~]$ ssh student@servera ...output omitted... [student@servera ~]$
ssh student@servera
[student@servera ~]$
Выполните команду sudo -i, чтобы переключиться на пользователя root. Пароль для пользователя student — student.
sudo -i
root
[student@servera ~]$ sudo -i [sudo] password for student: student [root@servera ~]#
[sudo] password for student:
[root@servera ~]#
Создайте учетную запись пользователя с именем contsvc и паролем redhat. Настройте эту учетную запись на доступ к реестру образов контейнеров по адресу registry.lab.example.com. Вы будете использовать эту учетную запись вместо учетной записи обычного пользователя для запуска контейнеров в виде служб systemd.
contsvc
redhat
registry.lab.example.com
С помощью команды useradd создайте учетную запись, а затем с помощью команды passwd задайте пароль redhat.
useradd
passwd
[root@servera ~]# useradd contsvc [root@servera ~]# passwd contsvc Changing password for user contsvc. New password: redhat BAD PASSWORD: The password is shorter than 8 characters Retype new password: redhat passwd: all authentication tokens updated successfully.
useradd contsvc
passwd contsvc
New password:
Retype new password:
Для управления пользовательскими службами systemd с помощью учетной записи contsvc необходимо выполнить вход от имени пользователя contsvc. Вы не можете использовать команды su и sudo.
su
sudo
Выйдите с машины servera и с помощью команды ssh выполните вход от имени пользователя contsvc. Системы настроены на использование ключей SSH для аутентификации, поэтому пароль не требуется.
[root@servera ~]# exit logout [student@servera ~]$ exit logout Connection to servera closed. [student@workstation ~]$ ssh contsvc@servera ...output omitted... [contsvc@servera ~]$
exit
ssh contsvc@servera
[contsvc@servera ~]$
Создайте каталог ~/.config/containers/.
~/.config/containers/
[contsvc@servera ~]$ mkdir -p ~/.config/containers/ [contsvc@servera ~]$
mkdir -p ~/.config/containers/
Сценарий lab подготовил файл registries.conf в каталоге /tmp/containers-services/. Скопируйте этот файл в каталог ~/.config/containers/. Следующая команда cp очень длинная, и ее необходимо вводить в одной строке:
lab
registries.conf
/tmp/containers-services/
cp
[contsvc@servera ~]$ cp /tmp/containers-services/registries.conf ~/.config/containers/
cp /tmp/containers-services/registries.conf ~/.config/containers/
Чтобы убедиться, что у вас есть доступ к реестру registry.lab.example.com, выполните команду podman search ubi в качестве теста. Если все работает должным образом, команда должна показать некоторые образы.
podman search ubi
[contsvc@servera ~]$ podman search ubi INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED example.com registry.lab.example.com/ubi8/ubi 0 example.com registry.lab.example.com/ubi7/ubi 0
Создайте каталог /home/contsvc/webcontent/html/, а затем создайте тестовую страницу index.html. Вы будете использовать этот каталог в качестве постоянного хранилища при развертывании контейнера веб-сервера.
/home/contsvc/webcontent/html/
index.html
Создайте каталог ~/webcontent/html/.
~/webcontent/html/
[contsvc@servera ~]$ mkdir -p ~/webcontent/html/ [contsvc@servera ~]$
mkdir -p ~/webcontent/html/
Создайте файл index.html и добавьте некоторое содержимое.
[contsvc@servera ~]$ echo "Hello World" > ~/webcontent/html/index.html [contsvc@servera ~]$
echo "Hello World" > ~/webcontent/html/index.html
Убедитесь, что у всех есть доступ к каталогу и файлу index.html. Контейнер использует непривилегированного пользователя, который может читать файл index.html.
[contsvc@servera ~]$ ls -ld webcontent/html/ drwxrwxr-x. 2 contsvc contsvc 24 Aug 28 04:56 webcontent/html/ [contsvc@servera ~]$ ls -l webcontent/html/index.html -rw-rw-r--. 1 contsvc contsvc 12 Aug 28 04:56 webcontent/html/index.html
ls -ld webcontent/html/
r-x
ls -l webcontent/html/index.html
r--
Создайте отсоединенный контейнер с именем myweb. Перенаправьте порт 8080 на локальном хосте на порт 8080 контейнера. Смонтируйте каталог ~/webcontent с хоста в каталог /var/www в контейнере. Используйте образ registry.lab.example.com/rhel8/httpd-24:1-105.
myweb
~/webcontent
/var/www
registry.lab.example.com/rhel8/httpd-24:1-105
Войдите в реестр registry.lab.example.com как пользователь admin с паролем redhat321.
admin
redhat321
[contsvc@servera ~]$ podman login registry.lab.example.com Username: admin Password: redhat321 Login Succeeded!
podman login registry.lab.example.com
Username:
Password:
Создайте контейнер. Вы можете скопировать и вставить приведенную ниже команду из файла /tmp/containers-services/start-container.txt. Следующая команда podman run очень длинная, и ее необходимо вводить в одной строке:
/tmp/containers-services/start-container.txt
podman run
[contsvc@servera ~]$ podman run -d --name myweb -p 8080:8080 -v ~/webcontent:/var/www:Z registry.lab.example.com/rhel8/httpd-24:1-105 ...output omitted...
podman run -d --name myweb -p 8080:8080 -v ~/webcontent:/var/www:Z registry.lab.example.com/rhel8/httpd-24:1-105
Чтобы проверить свою работу, используйте команду curl для доступа к веб-контенту на порту 8080.
curl
[contsvc@servera ~]$ curl http://localhost:8080/ Hello World
curl http://localhost:8080/
Создайте файл юнита systemd для управления контейнером myweb с помощью команд systemctl. После этого остановите и удалите контейнер myweb. Systemd управляет контейнером и ожидает, что контейнер изначально не существует.
Создайте каталог ~/.config/systemd/user/.
~/.config/systemd/user/
[contsvc@servera ~]$ mkdir -p ~/.config/systemd/user/ [contsvc@servera ~]$
mkdir -p ~/.config/systemd/user/
Перейдите в каталог ~/.config/systemd/user/ и выполните команду podman generate systemd, чтобы создать файл юнита для контейнера myweb. Используйте опцию --new, чтобы команда systemd создавала новый контейнер при запуске службы и удаляла его при остановке службы.
podman generate systemd
--new
[contsvc@servera ~]$ cd ~/.config/systemd/user [contsvc@servera user]$ podman generate systemd --name myweb --files --new /home/contsvc/.config/systemd/user/container-myweb.service
cd ~/.config/systemd/user
[contsvc@servera user]$
podman generate systemd --name myweb --files --new
Остановите и удалите контейнер myweb.
[contsvc@servera user]$ podman stop myweb 2f4844b376b78f8f7021fe3a4c077ae52fdc1caa6d877e84106ab783d78e1e1a [contsvc@servera user]$ podman rm myweb 2f4844b376b78f8f7021fe3a4c077ae52fdc1caa6d877e84106ab783d78e1e1a
podman stop myweb
podman rm myweb
Принудительно перезагрузите конфигурацию systemd, а затем включите и запустите новую пользовательскую службу container-myweb. Чтобы протестировать свою работу, остановите, а затем запустите службу и проконтролируйте состояние контейнера с помощью команд curl и podman ps.
container-myweb
podman ps
Выполните команду systemctl --user daemon-reload, чтобы утилита systemd работала с новым файлом юнита.
systemctl --user daemon-reload
[contsvc@servera user]$ systemctl --user daemon-reload [contsvc@servera user]$
Включите и запустите службу container-myweb.
[contsvc@servera user]$ systemctl --user enable --now container-myweb Created symlink /home/contsvc/.config/systemd/user/multi-user.target.wants/container-myweb.service → /home/contsvc/.config/systemd/user/container-myweb.service. Created symlink /home/contsvc/.config/systemd/user/default.target.wants/container-myweb.service → /home/contsvc/.config/systemd/user/container-myweb.service.
systemctl --user enable --now container-myweb
С помощью команд podman ps и curl убедитесь, что контейнер запущен.
[contsvc@servera user]$ podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a648c286c653 registry.lab.example.com/rhel8/httpd-24:1-105 /usr/bin/run-http... About a minute ago Up About a minute ago 0.0.0.0:8080->8080/tcp myweb [contsvc@servera user]$ curl http://localhost:8080/ Hello World
a648c286c653
Обратите внимание на идентификатор контейнера. Вы будете использовать эти сведения, чтобы убедиться, что systemd создает новый контейнер при перезапуске службы.
Остановите службу container-myweb и убедитесь, что контейнер больше не существует. Когда вы останавливаете службу, systemd останавливает, а затем удаляет контейнер.
[contsvc@servera user]$ systemctl --user stop container-myweb [contsvc@servera user]$ podman ps --all CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
systemctl --user stop container-myweb
podman ps --all
Запустите службу container-myweb и убедитесь, что контейнер работает.
[contsvc@servera user]$ systemctl --user start container-myweb [contsvc@servera user]$ podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6f5148b27726 registry.lab.example.com/rhel8/httpd-24:1-105 /usr/bin/run-http... 5 seconds ago Up 4 seconds ago 0.0.0.0:8080->8080/tcp myweb
systemctl --user start container-myweb
6f5148b27726
Обратите внимание, что идентификатор контейнера изменился. Когда вы запускаете службу, systemd создает новый контейнер.
Чтобы пользовательские службы для пользователя contsvc запускались вместе с сервером, выполните команду loginctl enable-linger. После этого перезагрузите машину servera.
loginctl enable-linger
Выполните команду loginctl enable-linger.
[contsvc@servera user]$ loginctl enable-linger [contsvc@servera user]$
Убедитесь, что для пользователя contsvc задана опция Linger.
Linger
[contsvc@servera user]$ loginctl show-user contsvc ...output omitted... Linger=yes
loginctl show-user contsvc
Linger=yes
Переключитесь на пользователя root и выполните команду systemctl reboot, чтобы перезагрузить машину servera.
systemctl reboot
[contsvc@servera user]$ su - Password: redhat Last login: Fri Aug 28 07:43:40 EDT 2020 on pts/0 [root@servera ~]# systemctl reboot Connection to servera closed by remote host. Connection to servera closed. [student@workstation ~]$
su -
Дождитесь окончания перезагрузки машины servera (это займет несколько минут), а затем войдите на servera как пользователь contsvc. Убедитесь, что утилита systemd запустила контейнер myweb и веб-контент доступен.
С машины workstation с помощью команды ssh войдите на машину servera как пользователь contsvc.
[student@workstation ~]$ ssh contsvc@servera ...output omitted... [contsvc@servera ~]$
Выполните команду podman ps, чтобы убедиться, что контейнер запущен.
[contsvc@servera ~]$ podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1d174e79f08b registry.lab.example.com/rhel8/httpd-24:1-105 /usr/bin/run-http... 3 minutes ago Up 3 minutes ago 0.0.0.0:8080->8080/tcp myweb
Используйте команду curl для доступа к веб-контенту.
Выйдите с servera.
[contsvc@servera ~]$ exit logout Connection to servera closed. [student@workstation ~]$
Конец
На машине workstation запустите сценарий lab containers-services finish, чтобы закончить это упражнение.
lab containers-services finish
[student@workstation ~]$ lab containers-services finish
Упражнение завершено.