Red Hat System Administration II 8.2

Упражнение под руководством преподавателя: Управление контейнерами как службами

В этом упражнении вы настроите контейнер, которым будете управлять как службой systemd, а затем с помощью команд systemctl настроите этот контейнер на автоматический запуск при запуске хост-машины.

Результаты

Вы сможете:

  • создать файлы юнитов systemd для управления контейнерами;

  • запустить и остановить контейнеры с помощью команд systemctl;

  • настроить учетные записи для пользовательских служб systemd на запуск при запуске хост-машины.

Войдите на машину workstation как пользователь student с паролем student.

На машине workstation выполните команду lab containers-services start. Эта команда запускает подготовительный сценарий, который проверяет доступность машины servera в сети. Он также устанавливает на servera контейнерные утилиты.

[student@workstation ~]$ lab containers-services start

Процедура 13.5. Инструкции

  1. С помощью команды ssh войдите на машину servera как пользователь student. Системы настроены на использование ключей SSH для аутентификации, поэтому пароль не требуется.

    [student@workstation ~]$ ssh student@servera
    ...output omitted...
    [student@servera ~]$ 
  2. Выполните команду sudo -i, чтобы переключиться на пользователя root. Пароль для пользователя student — student.

    [student@servera ~]$ sudo -i
    [sudo] password for student: student
    [root@servera ~]# 
  3. Создайте учетную запись пользователя с именем contsvc и паролем redhat. Настройте эту учетную запись на доступ к реестру образов контейнеров по адресу registry.lab.example.com. Вы будете использовать эту учетную запись вместо учетной записи обычного пользователя для запуска контейнеров в виде служб systemd.

    1. С помощью команды useradd создайте учетную запись, а затем с помощью команды passwd задайте пароль redhat.

      [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.
    2. Для управления пользовательскими службами systemd с помощью учетной записи contsvc необходимо выполнить вход от имени пользователя contsvc. Вы не можете использовать команды 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 ~]$ 
    3. Создайте каталог ~/.config/containers/.

      [contsvc@servera ~]$ mkdir -p ~/.config/containers/
      [contsvc@servera ~]$ 
    4. Сценарий lab подготовил файл registries.conf в каталоге /tmp/containers-services/. Скопируйте этот файл в каталог ~/.config/containers/. Следующая команда cp очень длинная, и ее необходимо вводить в одной строке:

      [contsvc@servera ~]$ cp /tmp/containers-services/registries.conf ~/.config/containers/
    5. Чтобы убедиться, что у вас есть доступ к реестру registry.lab.example.com, выполните команду 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
  4. Создайте каталог /home/contsvc/webcontent/html/, а затем создайте тестовую страницу index.html. Вы будете использовать этот каталог в качестве постоянного хранилища при развертывании контейнера веб-сервера.

    1. Создайте каталог ~/webcontent/html/.

      [contsvc@servera ~]$ mkdir -p ~/webcontent/html/
      [contsvc@servera ~]$ 
    2. Создайте файл index.html и добавьте некоторое содержимое.

      [contsvc@servera ~]$ echo "Hello World" > ~/webcontent/html/index.html
      [contsvc@servera ~]$ 
    3. Убедитесь, что у всех есть доступ к каталогу и файлу 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
  5. Создайте отсоединенный контейнер с именем myweb. Перенаправьте порт 8080 на локальном хосте на порт 8080 контейнера. Смонтируйте каталог ~/webcontent с хоста в каталог /var/www в контейнере. Используйте образ registry.lab.example.com/rhel8/httpd-24:1-105.

    1. Войдите в реестр registry.lab.example.com как пользователь admin с паролем redhat321.

      [contsvc@servera ~]$ podman login registry.lab.example.com
      Username: admin
      Password: redhat321
      Login Succeeded!
    2. Создайте контейнер. Вы можете скопировать и вставить приведенную ниже команду из файла /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...
    3. Чтобы проверить свою работу, используйте команду curl для доступа к веб-контенту на порту 8080.

      [contsvc@servera ~]$ curl http://localhost:8080/
      Hello World
  6. Создайте файл юнита systemd для управления контейнером myweb с помощью команд systemctl. После этого остановите и удалите контейнер myweb. Systemd управляет контейнером и ожидает, что контейнер изначально не существует.

    1. Создайте каталог ~/.config/systemd/user/.

      [contsvc@servera ~]$ mkdir -p ~/.config/systemd/user/
      [contsvc@servera ~]$ 
    2. Перейдите в каталог ~/.config/systemd/user/ и выполните команду podman generate systemd, чтобы создать файл юнита для контейнера myweb. Используйте опцию --new, чтобы команда systemd создавала новый контейнер при запуске службы и удаляла его при остановке службы.

      [contsvc@servera ~]$ cd ~/.config/systemd/user
      [contsvc@servera user]$ podman generate systemd --name myweb --files --new
      /home/contsvc/.config/systemd/user/container-myweb.service
    3. Остановите и удалите контейнер myweb.

      [contsvc@servera user]$ podman stop myweb
      2f4844b376b78f8f7021fe3a4c077ae52fdc1caa6d877e84106ab783d78e1e1a
      [contsvc@servera user]$ podman rm myweb
      2f4844b376b78f8f7021fe3a4c077ae52fdc1caa6d877e84106ab783d78e1e1a
  7. Принудительно перезагрузите конфигурацию systemd, а затем включите и запустите новую пользовательскую службу container-myweb. Чтобы протестировать свою работу, остановите, а затем запустите службу и проконтролируйте состояние контейнера с помощью команд curl и podman ps.

    1. Выполните команду systemctl --user daemon-reload, чтобы утилита systemd работала с новым файлом юнита.

      [contsvc@servera user]$ systemctl --user daemon-reload
      [contsvc@servera user]$ 
    2. Включите и запустите службу 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.
    3. С помощью команд 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

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

    4. Остановите службу 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
    5. Запустите службу 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

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

  8. Чтобы пользовательские службы для пользователя contsvc запускались вместе с сервером, выполните команду loginctl enable-linger. После этого перезагрузите машину servera.

    1. Выполните команду loginctl enable-linger.

      [contsvc@servera user]$ loginctl enable-linger
      [contsvc@servera user]$ 
    2. Убедитесь, что для пользователя contsvc задана опция Linger.

      [contsvc@servera user]$ loginctl show-user contsvc
      ...output omitted...
      Linger=yes
    3. Переключитесь на пользователя root и выполните команду systemctl reboot, чтобы перезагрузить машину servera.

      [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 ~]$ 
  9. Дождитесь окончания перезагрузки машины servera (это займет несколько минут), а затем войдите на servera как пользователь contsvc. Убедитесь, что утилита systemd запустила контейнер myweb и веб-контент доступен.

    1. С машины workstation с помощью команды ssh войдите на машину servera как пользователь contsvc.

      [student@workstation ~]$ ssh contsvc@servera
      ...output omitted...
      [contsvc@servera ~]$ 
    2. Выполните команду 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
    3. Используйте команду curl для доступа к веб-контенту.

      [contsvc@servera ~]$ curl http://localhost:8080/
      Hello World
    4. Выйдите с servera.

      [contsvc@servera ~]$ exit
      logout
      Connection to servera closed.
      [student@workstation ~]$ 

Конец

На машине workstation запустите сценарий lab containers-services finish, чтобы закончить это упражнение.

[student@workstation ~]$ lab containers-services finish

Упражнение завершено.