Docker

Материал из wiki

Docker: основы контейнеризации для self‑hosted сервисов

Docker — это платформа для упаковки приложений в контейнеры, которые работают изолированно друг от друга и от хост‑системы. Контейнеры содержат всё необходимое для запуска: код, библиотеки, зависимости и настройки. Благодаря этому приложение можно легко перенести между серверами, обновить или откатить без влияния на другие сервисы.

Эта статья даёт базовое понимание Docker, которое необходимо для работы с Nextcloud, ZeroTier, базами данных и другими компонентами. Предполагается, что Docker уже установлен (это описано в статьях Linux, Windows или macOS).

1. Основные понятия

Понятие Описание
Образ (Image) неизменяемый шаблон, содержащий приложение и его окружение (например, nextcloud:stable). Образы могут быть слоёными, чтобы экономить место.
Контейнер (Container) запущенный экземпляр образа. Контейнер имеет собственное файловое пространство, сеть и процессы, изолированные от хоста.
Том (Volume) механизм сохранения данных вне контейнера. Данные в томе переживают перезапуск или удаление контейнера.
Сеть (Network) виртуальный изолированный сегмент, в котором контейнеры могут общаться друг с другом.
Docker Compose инструмент для описания многоконтейнерных приложений в одном YAML‑файле (например, Nextcloud + MariaDB).

2. Жизненный цикл контейнера

Основные команды для управления контейнерами:

  • docker pull <образ> — скачать образ из реестра (по умолчанию Docker Hub).
  • docker run <образ> — создать и запустить контейнер из образа.
  • docker ps — список запущенных контейнеров.
  • docker ps -a — все контейнеры (включая остановленные).
  • docker stop <контейнер> — остановить контейнер.
  • docker start <контейнер> — запустить остановленный контейнер.
  • docker restart <контейнер> — перезапустить.
  • docker rm <контейнер> — удалить контейнер (предварительно остановив).
  • docker rmi <образ> — удалить образ.

Пример запуска простого веб‑сервера:

docker run -d --name my-nginx -p 8080:80 nginx
  • -d — запуск в фоновом режиме (detach)
  • --name — задать имя контейнера
  • -p — пробросить порт хоста:порт контейнера

После этого Nginx доступен по адресу http://localhost:8080.

3. Управление данными: тома и привязка папок

Контейнеры по умолчанию не сохраняют данные при пересоздании. Чтобы данные сохранялись, используют:

3.1. Именованные тома (Volumes)

Тома управляются Docker и хранятся в специальной области (обычно /var/lib/docker/volumes).

docker volume create nextcloud_data
docker run -v nextcloud_data:/var/www/html/data nextcloud

3.2. Привязка папки хоста (Bind Mount)

Папка на хост‑системе монтируется в контейнер. Удобно для разработки или прямого доступа к файлам.

docker run -v /home/user/data:/var/www/html/data nextcloud

3.3. В Docker Compose

Тома описываются в секции volumes сервиса и в корневом блоке volumes для именованных томов:

services:
  app:
    image: nextcloud
    volumes:
      - ./data:/var/www/html/data   # bind mount
      - nextcloud_config:/var/www/html/config   # именованный том
volumes:
  nextcloud_config:

4. Сети в Docker

Docker создаёт несколько сетей по умолчанию:

  • bridge — изолированная внутренняя сеть, в которой контейнеры могут общаться друг с другом по именам. Используется по умолчанию.
  • host — контейнер использует сетевой стек хоста (порты не мапятся, контейнер слушает напрямую на интерфейсах хоста).
  • overlay — для связи контейнеров на разных хостах в режиме Swarm.

Обычно мы используем пользовательские сети bridge для изоляции и удобства. Создадим сеть для Nextcloud:

docker network create nextcloud_net

Запустим контейнеры в этой сети:

docker run -d --name db --network nextcloud_net mariadb
docker run -d --name app --network nextcloud_net -p 8080:80 nextcloud

Теперь контейнер app может обращаться к БД по имени db.

5. Переменные окружения (Environment Variables)

Многие образы позволяют настраиваться через переменные окружения. Это безопаснее, чем жёсткое кодирование конфигов.

Пример для MariaDB:

docker run -d --name db -e MYSQL_ROOT_PASSWORD=secret -e MYSQL_DATABASE=nextcloud mariadb

В Docker Compose это выглядит так:

environment:
  - MYSQL_ROOT_PASSWORD=secret
  - MYSQL_DATABASE=nextcloud

5.1. Файл переменных (.env)

Для хранения паролей и других чувствительных данных рекомендуется использовать файл .env в папке проекта, а в Compose ссылаться на переменные.

.env:

MYSQL_ROOT_PASSWORD=verysecret
MYSQL_PASSWORD=anothersecret

В docker-compose.yml:

environment:
  - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
  - MYSQL_PASSWORD=${MYSQL_PASSWORD}

Не забывайте добавить .env в .gitignore, если используете Git.

6. Логи и отладка

  • docker logs <контейнер> — просмотр логов контейнера (stdout/stderr).
  • docker logs -f <контейнер> — следить за логами в реальном времени.
  • docker exec -it <контейнер> /bin/bash — войти внутрь работающего контейнера для диагностики.
  • docker inspect <контейнер> — подробная информация о контейнере (IP, переменные, монтирования и т.д.).
  • docker stats — просмотр использования ресурсов (CPU, память) в реальном времени.

7. Docker Compose: управление группой контейнеров

Docker Compose позволяет запускать несколько контейнеров как единое приложение. Обычно мы используем docker-compose.yml.

Основные команды

  • docker compose up -d — запустить все сервисы в фоне.
  • docker compose down — остановить и удалить все контейнеры, сети (тома по умолчанию не удаляются).
  • docker compose logs — логи всех сервисов.
  • docker compose ps — статус сервисов.
  • docker compose exec <сервис> bash — войти в контейнер сервиса.

Пример Compose-файла для стека Nextcloud

Мы уже использовали его в статьях по ОС. Приведём его здесь с комментариями:

version: '3'

services:
  db:
    image: mariadb:10.6
    restart: unless-stopped
    command: --transaction-isolation=READ-COMMITTED --log-bin=binlog --binlog-format=ROW
    volumes:
      - ./db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=${ROOT_PASS}
      - MYSQL_PASSWORD=${USER_PASS}
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
    networks:
      - nextcloud_net

  app:
    image: nextcloud:stable
    restart: unless-stopped
    ports:
      - "8080:80"
    volumes:
      - ./data:/var/www/html/data
      - ./config:/var/www/html/config
      - ./apps:/var/www/html/custom_apps
    environment:
      - MYSQL_HOST=db
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
      - MYSQL_PASSWORD=${USER_PASS}
    depends_on:
      - db
    networks:
      - nextcloud_net

networks:
  nextcloud_net:
    driver: bridge

8. Бэкап и восстановление томов

Бэкап данных из тома

Используем временный контейнер для архивации:

docker run --rm -v nextcloud_data:/source -v $(pwd):/backup ubuntu tar czf /backup/nextcloud_backup.tar.gz -C /source .

Это создаст файл nextcloud_backup.tar.gz в текущей папке.

Восстановление

docker run --rm -v nextcloud_data:/target -v $(pwd):/backup ubuntu tar xzf /backup/nextcloud_backup.tar.gz -C /target

Для бэкапа баз данных используйте mysqldump внутри контейнера или отдельный дамп-контейнер.

9. Обновление контейнеров

Чтобы обновить образ и пересоздать контейнер:

docker pull nextcloud:stable
docker compose down
docker compose up -d

Если используете Compose, образы обновляются автоматически при наличии новых тегов (если не указан точный тег, например, :stable всегда указывает на последнюю стабильную версию). Для контроля обновляйте вручную.

10. Советы по безопасности

  • Не используйте latest‑тег в продакшене, так как он может непредсказуемо меняться. Указывайте конкретную версию, например nextcloud:27.0.0.
  • Ограничивайте ресурсы контейнера (CPU, память) через docker run --memory=512m --cpus=1 или в Compose.
  • Не запускайте контейнеры от root, используйте user: "1000:1000" в Compose или параметр --user.
  • Скачивайте образы только из официальных реестров (Docker Hub, официальные организации).
  • Регулярно обновляйте образы и перезапускайте контейнеры для получения исправлений безопасности.

См. также

  • Linux – установка Docker на Linux
  • Windows – установка Docker на Windows
  • macOS – установка Docker на macOS
  • Nextcloud – настройка приложения на Docker
  • ZeroTier – работа ZeroTier в контейнерах
  • NAS – монтирование сетевых хранилищ в контейнеры