Docker
Платформа контейнеризации, которая позволяет запускать приложения изолированно друг от друга и удобно управлять их зависимостями, сетями и постоянными данными.
Docker — удобный способ запускать приложения на своём сервере
Если вы только начинаете знакомство с домашними серверами и self-hosted-приложениями, название Docker встретится очень быстро. Vaultwarden, Immich, Paperless-ngx, Uptime Kuma, Portainer, Jellyfin и множество других проектов можно установить именно с помощью Docker.
На первый взгляд Docker может показаться ещё одним дополнительным слоем между сервером и приложением. На практике всё наоборот: после первоначального знакомства он заметно упрощает установку, обновление и перенос сервисов между серверами.
Что такое Docker простыми словами
Обычно при установке программы непосредственно в Linux необходимо отдельно устанавливать её зависимости, настраивать версии библиотек, создавать системных пользователей, конфигурационные файлы и следить, чтобы одна программа не конфликтовала с другой.
Docker предлагает другой подход.
Приложение поставляется в виде образа — заранее подготовленной среды, содержащей необходимые для запуска компоненты. Из этого образа создаётся контейнер.
Условно это можно представить так:
Ubuntu Server
│
├── Docker
│
├── Vaultwarden
├── Uptime Kuma
├── Paperless-ngx
├── Immich
└── Gotify
Каждый сервис работает в собственном окружении, но все они используют один сервер.
Docker Engine управляет контейнерами, образами, сетями и томами, а взаимодействовать с ним можно через командную строку или другие приложения, например Portainer.
Контейнер — это не виртуальная машина
Это важное отличие.
При использовании обычной виртуальной машины схема выглядит примерно так:
Физический сервер
└── Proxmox
├── Ubuntu VM
│ └── приложение
│
└── Windows VM
└── приложение
Каждая виртуальная машина содержит собственную полноценную операционную систему.
Docker-контейнер значительно легче:
Ubuntu
└── Docker
├── Container A
├── Container B
├── Container C
└── Container D
Поэтому на одном небольшом сервере можно разместить довольно много сервисов, если сами приложения не требуют больших ресурсов.
При этом Docker и Proxmox не обязательно выбирать друг против друга. Очень удобный вариант — отдельная Linux-виртуальная машина в Proxmox, внутри которой работает Docker.
Почему Docker особенно удобен для домашнего сервера
Главное преимущество Docker проявляется не в момент первой установки, а спустя несколько месяцев.
Представим, что на сервере работают:
Vaultwarden
Uptime Kuma
Paperless-ngx
Gotify
Umami
Authentik
Если всё установлено непосредственно в операционную систему, со временем становится трудно понять, какие библиотеки к чему относятся и что можно безопасно удалить или обновить.
С Docker структура значительно понятнее.
У каждого приложения могут быть свои:
- контейнер;
- конфигурация;
- сеть;
- переменные окружения;
- каталоги с данными;
- версия образа.
Если сервис больше не нужен, контейнер можно удалить, практически не затрагивая остальные приложения.
Docker Compose
На AppsHome мы будем особенно часто использовать Docker Compose.
Вместо длинной последовательности команд конфигурация приложения записывается в файл compose.yaml или docker-compose.yml.
Упрощённый пример:
services:
uptime-kuma:
image: louislam/uptime-kuma:2
container_name: uptime-kuma
restart: unless-stopped
ports:
- "3001:3001"
volumes:
- ./data:/app/data
После этого сервис запускается:
docker compose up -d
А посмотреть его состояние можно:
docker compose ps
Остановить:
docker compose down
Современный Docker Compose устанавливается как плагин и вызывается именно через команду docker compose, а не старую отдельную команду docker-compose.
Для AppsHome это будет основной формат инструкций: пользователь сможет видеть полный Compose-файл, понимать, куда сохраняются данные, и при необходимости легко перенести сервис на другой сервер.
Где хранятся данные
Сам контейнер лучше считать временным.
Например:
Container
↓
можно удалить и создать заново
А важные данные должны находиться отдельно:
/opt/vaultwarden/data
/opt/paperless/media
/opt/uptime-kuma/data
Для этого Docker использует volumes или bind mounts.
Именно поэтому при правильной настройке можно:
удалить контейнер
↓
скачать новую версию образа
↓
создать контейнер заново
↓
подключить прежние данные
и приложение продолжит работать с прежними настройками.
Это один из принципов, которому мы будем придерживаться в инструкциях AppsHome.
Docker-сети
Контейнеры не обязательно должны общаться через публичные IP-адреса или открытые порты.
Например:
WordPress
│
└── appshome-db:3306
│
MariaDB
WordPress обращается к базе по имени контейнера внутри собственной Docker-сети.
Саму MariaDB при этом вообще не требуется публиковать в интернет.
Такая схема делает инфраструктуру одновременно удобнее и безопаснее.
Что такое Docker Image
Image, или образ, — это шаблон, из которого создаётся контейнер.
Например:
mariadb:11.8.8
означает:
приложение: MariaDB
версия: 11.8.8
А:
wordpress:7.0.2-php8.3-apache
уже сообщает гораздо больше:
WordPress 7.0.2
PHP 8.3
Apache
По возможности на AppsHome мы будем указывать конкретные версии образов вместо бездумного использования:
latest
Это позволяет лучше контролировать обновления.
А что тогда делает Portainer?
Docker может полностью работать без Portainer.
Например:
docker ps
показывает контейнеры.
docker logs uptime-kuma
показывает журнал контейнера.
docker compose up -d
разворачивает Stack.
Но Portainer предоставляет удобный веб-интерфейс для этих операций.
Поэтому схема может выглядеть так:
Docker Engine
│
├── контейнеры
├── networks
├── volumes
└── images
↑
Portainer
То есть Portainer не заменяет Docker — он помогает им управлять.
Преимущества Docker
Простая установка
Для многих приложений достаточно Compose-файла и нескольких команд.
Изоляция
Зависимости одного приложения меньше вмешиваются в работу другого.
Удобное обновление
Часто достаточно:
docker compose pull
docker compose up -d
Простое резервное копирование
Если заранее понятно, где находятся постоянные данные, backup организовать значительно проще.
Переносимость
Compose-файл и каталоги данных можно перенести на другой сервер и снова запустить приложение.
Большой выбор приложений
Docker стал одним из наиболее распространённых способов распространения self-hosted-программ.
Недостатки Docker
Docker — не волшебная кнопка, которая автоматически делает сервер безопасным и надёжным.
Нужно понимать хотя бы основные понятия:
container
image
volume
bind mount
network
port
environment
Docker Compose
Особенно внимательно следует относиться к портам.
Например:
ports:
- "8080:80"
может сделать сервис доступным не только другим контейнерам, но и через сетевой интерфейс самого сервера.
В официальной документации Docker отдельно предупреждается, что опубликованные контейнерные порты могут обходить некоторые ожидаемые правила ufw/firewalld, поэтому firewall при использовании Docker нужно проектировать осознанно.
На AppsHome мы будем отдельно отмечать, какие порты действительно нужно публиковать.
Docker Engine и Docker Desktop — не одно и то же
На Linux-сервере обычно используется:
Docker Engine
Docker Desktop — это отдельный продукт преимущественно для настольных систем.
Для домашнего Linux-сервера Docker Desktop обычно не нужен.
Это важно и с точки зрения лицензирования: Docker Engine относится к open-source-проектам, тогда как Docker Desktop имеет отдельные условия использования для организаций.
Как мы рекомендуем использовать Docker
Для домашнего сервера AppsHome будет придерживаться примерно такой структуры:
/opt/
├── vaultwarden/
│ ├── compose.yaml
│ └── data/
│
├── uptime-kuma/
│ ├── compose.yaml
│ └── data/
│
├── paperless/
│ ├── compose.yaml
│ ├── media/
│ ├── data/
│ └── postgres/
│
└── gotify/
├── compose.yaml
└── data/
Так сразу понятно:
- где расположен сервис;
- где лежит его Compose;
- что нужно резервировать;
- что переносить на другой сервер.
Кому подойдёт Docker
Docker особенно полезен, если вы хотите:
- самостоятельно размещать приложения;
- собрать домашний сервер;
- использовать VPS;
- управлять несколькими сервисами;
- иметь понятное резервное копирование;
- переносить приложения между серверами;
- экспериментировать с новыми self-hosted-проектами.
Для единственного приложения Docker иногда может показаться лишним. Но когда сервисов становится пять, десять или двадцать, преимущества становятся гораздо заметнее.
Наша оценка
Docker — одна из базовых технологий для self-hosting.
Он не избавляет от необходимости понимать Linux, сеть и резервное копирование, но делает управление большим количеством приложений существенно удобнее.
AppsHome рекомендует Docker как основу для большинства self-hosted-сервисов на Linux-сервере.
При этом наша главная рекомендация:
Не относитесь к контейнерам как к месту хранения данных. Контейнер можно пересоздать. Важные данные должны храниться отдельно и попадать в резервные копии.
