Перейти к содержимому

Docker и Docker Compose

Облачные серверы3 мин чтения

Как поставить Docker и Compose в Ubuntu, Debian и AlmaLinux из официального репозитория, запустить приложение из compose.yaml, не открыть порт в обход межсетевого экрана и не забить диск журналами.

Содержание

Docker запускает программы в контейнерах — вместе со всем, что им нужно, отдельно от остальной системы. Ставить его лучше из репозитория Docker: там свежие версии и сразу есть Compose. В репозиториях самих систем Docker тоже есть, но версии там старше.

Ubuntu и Debian

Команды для Ubuntu:

sudo apt update
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Для Debian — те же команды, только в двух адресах вместо ubuntu напишите debian. Служба Docker запустится сама и будет запускаться при загрузке.

AlmaLinux

sudo dnf install dnf-plugins-core
sudo dnf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo
sudo dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo systemctl enable --now docker

При первой установке dnf попросит подтвердить ключ репозитория — его отпечаток должен быть 060A 61C5 1B55 8A7F 742B 77AA C52F EB6B 621E 9F35.

Проверка

sudo docker run --rm hello-world
docker --version
docker compose version

Если появилось «Hello from Docker!», всё работает.

Чтобы не писать каждый раз sudo, добавьте себя в группу docker и войдите заново:

sudo usermod -aG docker $USER
Внимание Участник группы docker может получить права root без пароля. Добавляйте в неё только тех, кому вы дали бы и sudo.

Compose: приложение одним файлом

Compose описывает в одном файле несколько контейнеров, их настройки и данные. Пример — WordPress с базой MariaDB. Создайте папку, например /opt/wordpress, а в ней файл compose.yaml:

services:
  db:
    image: mariadb:11
    restart: unless-stopped
    environment:
      MARIADB_DATABASE: wp
      MARIADB_USER: wp
      MARIADB_PASSWORD: надёжный-пароль
      MARIADB_RANDOM_ROOT_PASSWORD: "1"
    volumes:
      - db:/var/lib/mysql

  wordpress:
    image: wordpress:6
    restart: unless-stopped
    depends_on:
      - db
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: wp
      WORDPRESS_DB_PASSWORD: надёжный-пароль
      WORDPRESS_DB_NAME: wp
    ports:
      - "127.0.0.1:8080:80"
    volumes:
      - wp:/var/www/html

volumes:
  db:
  wp:

Запуск и управление — из этой папки:

КомандаЧто делает
docker compose up -dскачать образы, создать и запустить контейнеры
docker compose psчто запущено
docker compose logs -f wordpressжурнал контейнера, выход — Ctrl+C
docker compose pull && docker compose up -dобновить образы и пересоздать контейнеры
docker compose downостановить и удалить контейнеры; данные в томах остаются

restart: unless-stopped — контейнеры поднимутся сами после перезагрузки сервера. Данные лежат в томах (volumes): контейнеры можно удалять и пересоздавать, база и файлы сайта не пропадут. Тома хранятся в /var/lib/docker/volumes, их стоит включить в резервное копирование.

Порты и межсетевой экран

Строка "127.0.0.1:8080:80" публикует порт 80 контейнера только на внутреннем адресе сервера — снаружи до него не достучаться. Наружу сайт отдаёт nginx на самом сервере, он же получает бесплатный сертификат: Сертификат Let's Encrypt: certbot. Строка для nginx:

location / {
    proxy_pass http://127.0.0.1:8080;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}
Внимание Если написать просто "8080:80" или -p 8080:80, Docker откроет порт всему интернету — в обход ufw и firewalld: он добавляет свои правила раньше правил экрана. Так в интернет часто случайно попадают базы данных и панели управления. Публикуйте на 127.0.0.1 всё, что не должно быть видно снаружи.

Журналы контейнеров

Docker сохраняет всё, что контейнер выводит, в файл, и по умолчанию этот файл растёт без ограничений — со временем он может занять весь диск. Ограничьте размер: создайте /etc/docker/daemon.json:

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}

и перезапустите Docker: sudo systemctl restart docker. Настройка действует на новые контейнеры — существующие пересоздайте: docker compose up -d --force-recreate.

Место на диске

docker system df       # сколько занимают образы, контейнеры, тома и кэш
docker image prune -a  # удалить образы, которые не использует ни один контейнер

Подробнее о том, что можно чистить, — в статье Закончилось место на диске.

Не нашли ответ? Напишите в поддержку — подскажем.