Проверено AppsHome Активен

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-сервере.

При этом наша главная рекомендация:

Не относитесь к контейнерам как к месту хранения данных. Контейнер можно пересоздать. Важные данные должны храниться отдельно и попадать в резервные копии.