у меня есть много написано о контейнерах в этом блоге. Почему я так люблю контейнеры?
- Они начинают быстро
- Они делают ваши рабочие нагрузки портативными
- Они отключают ваш стек приложений от операционной системы, которая работает под ним.
- Вы можете отправить свое приложение через CI как единый образ контейнера.
- Вы можете изолировать рабочие нагрузки в сети и ограничить использование их ресурсов, подобно виртуальной машине.
Тем не менее, я все еще зависим от docker-compose. Может ли подман четверки изменить это?
Да, я думаю, что они могут.
Podman представил поддержку квадлетов в версии 4.4, и это более простой способ позволить systemd управлять вашими контейнерами. Раньше существовала возможность заставить podman генерировать файлы модулей systemd, но они были громоздкими и полны параметров командной строки podman внутри файла модуля. Эти файлы модулей было нелегко редактировать или даже анализировать на глаз.
Квадлеты упрощают эту задачу, предоставляя простой файл в стиле ini, который можно легко читать и редактировать. Позже в эту публикацию в блоге будут включены некоторые квадлеты, но вот пример для WordPress:
[Unit]
Description=WordPress Quadlet
[Container]
Image=docker.io/library/wordpress:fpm
ContainerName=wordpress
AutoUpdate=registry
EnvironmentFile=/home/core/.config/containers/containers-environment
Volume=wordpress.volume:/var/www/html
Network=wordpress.network
[Service]
Restart=always
TimeoutStartSec=900
[Install]
WantedBy=caddy.service multi-user.target default.target
Много строк внизу [Container]
должен показаться знакомым большинству читателей, которые раньше работали с контейнерами. Однако здесь есть что-то новое.
Проверьте AutoUpdate=registry
линия. Это говорит podman о необходимости регулярно обновлять ваш контейнер с помощью вышестоящего реестра контейнеров. я использовал сторожевая башня в прошлом для этого, но для этого требуется привилегированный контейнер, и это еще одна внешняя зависимость.
Также в самом конце вы увидите WantedBy
линия. Это отличное место для настройки зависимостей контейнера. В этом примере контейнер, который запускает caddy
(веб-сервер) не может запуститься, пока WordPress не заработает.
Нельзя отрицать, что docker-compose — потрясающий инструмент. Вы указываете желаемый результат, указываете ему вызвать контейнеры, и он переводит контейнеры в указанное вами состояние. Он обрабатывает тома, сети и сложную конфигурацию без особых усилий. Файлы YAML также довольно легко читаются.
Однако, как и в случае со сторожевой башней, это еще одна внешняя зависимость.
Мои развертывания контейнеров часто выполняются во время загрузки экземпляра, и после этого я не вношу слишком много изменений. Я обнаружил, что использую docker-compose для первоначального развертывания, а затем больше им не пользовался.
Почему бы не удалить его полностью и не использовать то, что уже встроено в CoreOS?
Прежде чем мы начнем, нам понадобится несколько вещей:
- Легко читать бутан конфигурация, которая превращается в крошечный зажигание конфигурация для CoreOS
- Некоторые четверки
- Дополнительная конфигурация системы
- Облачный провайдер с образами CoreOS (с использованием ВУЛТР для этого)
Я упаковал все эти предметы в свой Квадлеты-WordPress репозиторий, чтобы упростить задачу. Начните с просмотра конфиг.бутан файл.
Давайте разберемся здесь. Прежде всего, мы добавляем ключ ssh для значения по умолчанию. core
пользователь.
variant: fcos
version: 1.5.0
passwd:
users:
- name: core
ssh_authorized_keys:
- ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDyoH6gU4lgEiSiwihyD0Rxk/o5xYIfA3stVDgOGM9N0
Далее мы включаем podman-auto-update.timer
поэтому мы получаем обновления контейнера автоматически:
storage:
links:
- path: /home/core/.config/systemd/user/timers.target.wants/podman-auto-update.timer
target: /usr/lib/systemd/user/podman-auto-update.timer
user:
name: core
group:
name: core
Дальше будет длинный files
раздел:
files:
# Ensure the `core` user can keep processes running after they're logged out.
- path: /var/lib/systemd/linger/core
mode: 0644
# Allow caddy to listen on 80 and 443.
# Allow it to ask for bigger network buffers, too.
- path: /etc/sysctl.d/90-caddy.conf
contents:
inline: |
net.ipv4.ip_unprivileged_port_start = 80
net.core.rmem_max=2500000
net.core.wmem_max=2500000
# Set up an an environment file that containers can read to configure themselves.
- path: /home/core/.config/containers/containers-environment
contents:
inline: |
MYSQL_DATABASE=wordpress
MYSQL_USER=wordpress
MYSQL_ROOT_PASSWORD=mariadb-needs-a-secure-password
MYSQL_PASSWORD=wordpress-needs-a-secure-password
WORDPRESS_DB_HOST=mariadb
WORDPRESS_DB_USER=wordpress
WORDPRESS_DB_PASSWORD=wordpress-needs-a-secure-password
WORDPRESS_DB_NAME=wordpress
mode: 0644
# Deploy the caddy configuration file from the repository.
- path: /home/core/.config/caddy/Caddyfile
contents:
local: caddy/Caddyfile
mode: 0644
user:
name: core
group:
name: core
# Add some named volumes for caddy and wordpress.
- path: /home/core/.config/containers/systemd/caddy-config.volume
contents:
inline: |
[Volume]
user:
name: core
group:
name: core
- path: /home/core/.config/containers/systemd/caddy-data.volume
contents:
inline: |
[Volume]
user:
name: core
group:
name: core
- path: /home/core/.config/containers/systemd/wordpress.volume
contents:
inline: |
[Volume]
user:
name: core
group:
name: core
# Create a network for all the containers to use and enable the
# DNS plugin. This allows containers to find each other using
# the container names.
- path: /home/core/.config/containers/systemd/wordpress.network
contents:
inline: |
[Network]
DisableDNS=false
Internal=false
user:
name: core
group:
name: core
# Add the wordpress container.
- path: /home/core/.config/containers/systemd/wordpress.container
contents:
local: quadlets/wordpress.container
mode: 0644
user:
name: core
group:
name: core
# Add the MariaDB container.
- path: /home/core/.config/containers/systemd/mariadb.container
contents:
local: quadlets/mariadb.container
mode: 0644
user:
name: core
group:
name: core
# Add the caddy container.
- path: /home/core/.config/containers/systemd/caddy.container
contents:
local: quadlets/caddy.container
mode: 0644
user:
name: core
group:
name: core
Каддифайл также находится в репозитории и будет развернут в конфигурации с бутаном, показанной выше.
Мы можем подробно рассмотреть каждую четверку. Прежде всего, это MariaDB. Мы сообщаем systemd, что контейнер WordPress захочет запустить этот контейнер первым.
[Unit]
Description=MariaDB Quadlet
[Container]
Image=docker.io/library/mariadb:11
ContainerName=mariadb
AutoUpdate=registry
EnvironmentFile=/home/core/.config/containers/containers-environment
Volume=mariadb.volume:/var/lib/mysql
Network=wordpress.network
[Service]
Restart=always
TimeoutStartSec=900
[Install]
WantedBy=wordpress.service multi-user.target default.target
Квадлет WordPress во многом аналогичен квадлету MariaDB, но мы сообщаем systemd, что caddy захочет, чтобы WordPress запускался первым.
[Unit]
Description=WordPress Quadlet
[Container]
Image=docker.io/library/wordpress:fpm
ContainerName=wordpress
AutoUpdate=registry
EnvironmentFile=/home/core/.config/containers/containers-environment
Volume=wordpress.volume:/var/www/html
Network=wordpress.network
[Service]
Restart=always
TimeoutStartSec=900
[Install]
WantedBy=caddy.service multi-user.target default.target
Наконец, квадлет Caddy содержит четыре тома и несколько опубликованных портов. Эти порты будут опубликованы на узле контейнера. Кроме того, вы заметите, что здесь также смонтирован том WordPress. Это связано с тем, что Caddy может обслуживать статические файлы. намного быстрее чем WordPress.
[Unit]
Description=Caddy Quadlet
[Container]
Image=docker.io/library/caddy:latest
ContainerName=caddy
AutoUpdate=registry
EnvironmentFile=/home/core/.config/containers/containers-environment
Volume=caddy-data.volume:/data
Volume=caddy-config.volume:/config
Volume=/home/core/.config/caddy/Caddyfile:/etc/caddy/Caddyfile:Z
Volume=wordpress.volume:/var/www/html
PublishPort=80:80
PublishPort=443:443
Network=wordpress.network
[Service]
Restart=always
TimeoutStartSec=900
[Install]
WantedBy=multi-user.target default.target
Есть запустить скрипт который отправляет эту конфигурацию в VULTR и запускает экземпляр CoreOS:
#!/bin/bash
# This command starts up a CoreOS instance on Vultr using the vultr-cli
vultr-cli instance create
--os 391
--plan vhp-1c-1gb-amd
--region dfw
--notify true
--ipv6 true
-u "$(butane --files-dir . config.butane)"
-l "coreos-$(date "+%s")"
Чтобы запустить экземпляр, получите Ключ API ВУЛТР первый. Затем установите vultr-cli и бутан:
$ sudo dnf -y install butane vultr-cli
После запуска проверьте, что делают ваши контейнеры:
[core@vultr ~]$ podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
afa2d6501593 docker.io/library/caddy:latest caddy run --confi... 54 seconds ago Up 53 seconds 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp caddy
460426f39e6c docker.io/library/mariadb:11 mariadbd 35 seconds ago Up 35 seconds mariadb
92ece6538d5a docker.io/library/wordpress:fpm php-fpm 28 seconds ago Up 29 seconds wordpress
У нас должна быть возможность общаться с WordPress через Caddy через порт 80:
[core@vultr ~]$ curl -si http://localhost/wp-admin/install.php | head -n 25
HTTP/1.1 200 OK
Cache-Control: no-cache, must-revalidate, max-age=0
Content-Type: text/html; charset=utf-8
Expires: Wed, 11 Jan 1984 05:00:00 GMT
Server: Caddy
X-Powered-By: PHP/8.0.30
Date: Mon, 25 Sep 2023 21:43:40 GMT
Transfer-Encoding: chunked
WordPress › Installation
WordPress
Потрясающий! 🎉
Контейнеры будут автоматически обновляться по расписанию, и вы можете проверить таймер:
[core@vultr ~]$ systemctl status --user podman-auto-update.timer
● podman-auto-update.timer - Podman auto-update timer
Loaded: loaded (/usr/lib/systemd/user/podman-auto-update.timer; enabled; preset: disabled)
Active: active (waiting) since Mon 2023-09-25 21:41:31 UTC; 3min 14s ago
Trigger: Tue 2023-09-26 00:04:46 UTC; 2h 20min left
Triggers: ● podman-auto-update.service
Sep 25 21:41:31 vultr.guest systemd[1786]: Started podman-auto-update.timer - Podman auto-update timer.
Квадлеты — это обычные системные модули:
[core@vultr ~]$ systemctl list-units --user | grep -i Quadlet
caddy.service loaded active running Caddy Quadlet
mariadb.service loaded active running MariaDB Quadlet
wordpress.service loaded active running WordPress Quadlet
Например, вы можете внести изменения в файл конфигурации caddy и легко перезапустить его:
[core@vultr ~]$ systemctl restart --user caddy
[core@vultr ~]$ systemctl status --user caddy
● caddy.service - Caddy Quadlet
Loaded: loaded (/var/home/core/.config/containers/systemd/caddy.container; generated)
Drop-In: /usr/lib/systemd/user/service.d
└─10-timeout-abort.conf
Active: active (running) since Mon 2023-09-25 21:46:28 UTC; 5s ago
Main PID: 2652 (conmon)
Tasks: 18 (limit: 1023)
Memory: 15.1M
CPU: 207ms
Если вам нужно изменить конфигурацию квадлета, просто откройте файл конфигурации в вашем любимом редакторе в разделе ~/.config/containers/systemd
перезагрузите systemd и перезапустите контейнер:
$ vi ~/.config/containers/systemd/caddy.container
--- make your edits and save the quadlet configuration ---
$ systemctl daemon-reload --user
$ systemctl restart --user caddy
Наслаждаться!
2023-09-26 05:39:19
1695710759
#Квадлеты #могут #заставить #меня #наконец #отказаться #от #использования #dockercompose #Майор #Хейден