Что-то захотелось немного переделать домашний сервер, чтобы можно было им управлять через GUI. В частности хочется графического управления и еще каких-нибудь наворотов. А вот что выбрать? Хочется чего-то мощного и в то же время простого…
Portainer
Неплохо бы установить какой-то графический интерфейс (дополнительный менеджер). Я лично выбрал Portainer, а конкретно Community Edition.
Если посмотреть на hub.docker.com, то у него есть собранные контейнеры для arm64. Значит можно ставить.
Кстати, если пробежаться по документации, Portainer можно установить и на чистый Docker. Воспользуемся этим.
Идем на официальный сайт и смотрим как все это запустить:
docker volume create portainer_data
docker run -d -p 8000:8000 -p 9443:9443 --name portainer \
--restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
portainer/portainer-ce:2.11.0
Первая команда создает том хранения данных, а вторая запускает контейнер. Но мы делать так не будем. Мы создадим Compose-файл для работы сервиса и управления через systemd (как обычно).
/opt/portainer/docker-compose.yml:
version: "2.4"
services:
portainer:
image: portainer/portainer-ce:2.11.1-alpine
restart: always
volumes:
- type: bind
source: /mnt/nfs/portainer
target: /data
- type: bind
source: /var/run/docker.sock
target: /var/run/docker.sock
ports:
- "8000:8000"
- "9000:9000"
- "9443:9443"
mem_limit: 256m
mem_reservation: 192m
Так как Portainer является менеджером, то ему необходимо как-то управлять Docker. Для этого монтируется сокет самого докера, через который и будут выполняться команды на управление контейнерами.
Далее создаем /etc/systemd/system/portainer.service:
[Unit]
Description=Portainer docker-compose
Requires=docker.service
After=docker.service
[Service]
Restart=always
WorkingDirectory=/opt/portainer/
# Compose up
ExecStart=/usr/bin/docker-compose -f docker-compose.yml up
# Compose down, remove containers
ExecStop=/usr/bin/docker-compose -f docker-compose.yml down
[Install]
WantedBy=multi-user.target
Описание сервиса создали. Теперь обновим, включим и запустим:
systemctl daemon-reload
systemctl enable portainer
systemctl start portainer
После запуска заходим по адресу http://<ip-адрес>:9000 и вводим логин с паролем администратор. После попадаем в первоначальную настройку. Выбираем Get Started, после узел local и… Все… Работает! Если зайдем в Stacks, то там будут наши приложения, которые сейчас запущены. В данный момент Portainer не может ими управлять так как они были созданы через внешнюю среду.
Управляемые компоненты
Чтобы можно было безболезненно всем этим набором технологий управлять создадим новый стэк и заполним его как в Docker Compose:
version: "2.4"
services:
db:
image: mariadb:10.7.1-focal
command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW --innodb-file-per-table=1 --skip-innodb-read-only-compressed
restart: always
environment:
MARIADB_DATABASE: nextcloud
MARIADB_USER: nextcloud
MARIADB_PASSWORD:
MARIADB_RANDOM_ROOT_PASSWORD: 1
volumes:
- type: bind
source: /mnt/nfs/cloud/db
target: /var/lib/mysql
mem_limit: 256m
mem_reservation: 64m
nextcloud:
#image: nextcloud:22.2.3-fpm-alpine
image: nextcloud:23.0.0-fpm-alpine
restart: always
volumes:
- type: bind
source: /mnt/nfs/cloud/cloud
target: /var/www/html
mem_limit: 256m
mem_reservation: 64m
links:
- db
depends_on:
- db
nginx:
image: nginx:1.20.1-alpine
restart: always
volumes:
- type: bind
source: /mnt/nfs/cloud/cloud
target: /var/www/html
- type: bind
source: /mnt/nfs/cloud/nginx.conf
target: /etc/nginx/nginx.conf
ports:
- "8082:80"
links:
- nextcloud
depends_on:
- nextcloud
mem_limit: 128m
mem_reservation: 32m
По сути это тот же файл, что и обычный Docker Compose, но теперь им управляет Portainer.

Следите за портами, чтобы не повторялись.
Заключение
На мой взгляд управлять кучей сервисов в таком виде проще.
Если Вам не нравится такой интерфейс, то можете поискать что-то другое. В любом случае у этого продукта или у многих других есть свое API, с помощью которого можно организовать автоматизированное управление сервисами, например CI/CD.