BLACKBOXЦентр помощи

Установка Docker и Docker Compose

Как установить Docker из официального репозитория, запускать приложения через Compose и что важно знать о портах, логах, месте на диске и памяти.

общееОбновлено 2026-10-09~8 мин чтения
На этой странице

Docker запускает приложения в изолированных контейнерах, а Docker Compose поднимает несколько контейнеров из одного файла. На VPS BLACKBOX Docker не предустановлен: вы устанавливаете его сами, подключившись к серверу по SSH как root (Подключение к серверу по SSH (Windows, macOS, Linux)). Команды соответствуют официальной документации Docker.

Доступно: всем, у кого есть root-доступ по SSH к серверу BLACKBOX с Ubuntu, Debian, AlmaLinux 9 или CentOS Stream 9. Панель app.blackbox.md не устанавливает контейнеры и не управляет ими на серверах, заказанных на blackbox.md.

Перед началом

  • Docker публикует для каждого дистрибутива список поддерживаемых версий. Ubuntu 20.04 и Debian 11 в этом списке больше нет. Для нового сервера под Docker выбирайте Ubuntu 24.04 LTS, Ubuntu 22.04 LTS или Debian 12: Доступные операционные системы.
  • Если у вас тариф «VPS hosting» с панелью управления, перед установкой Docker посоветуйтесь с поддержкой: веб-сервер панели, как правило, уже занимает порты 80 и 443. См. Тарифы «VPS hosting» с панелью управления.

Установка Docker Engine и плагина Compose

Пакет docker-compose-plugin добавляет команду docker compose (через пробел). Старая команда docker-compose (через дефис) больше не нужна.

Ubuntu и Debian

Выполняйте команды в одной сессии. . /etc/os-release подставляет название дистрибутива (ubuntu или debian) и кодовое имя версии (например, noble или bookworm), поэтому блок одинаков для обеих систем.

apt update
apt install -y ca-certificates curl
install -m 0755 -d /etc/apt/keyrings
. /etc/os-release
curl -fsSL https://download.docker.com/linux/$ID/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/$ID $VERSION_CODENAME stable" > /etc/apt/sources.list.d/docker.list
apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Служба docker запускается сама сразу после установки и при каждой перезагрузке сервера.

AlmaLinux и CentOS Stream

В документации Docker нет отдельной страницы для AlmaLinux. На AlmaLinux 9 работает репозиторий для CentOS, приведённый ниже.

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

Проверьте установку

docker run hello-world
docker compose version

Первая команда скачивает тестовый образ и выводит «Hello from Docker!». Вторая выводит «Docker Compose version» и номер установленной версии.

Пользователь без root (необязательно)

Если вы работаете под обычным пользователем (созданным по инструкции из статьи Защита нового сервера: чек-лист), добавьте его в группу docker:

usermod -aG docker ИМЯ_ПОЛЬЗОВАТЕЛЯ

Выйдите и снова войдите как ИМЯ_ПОЛЬЗОВАТЕЛЯ. После этого команды docker работают без sudo.

Безопасность Членство в группе docker равносильно правам root: участник группы может запустить контейнер, смонтировав в него весь диск сервера, и изменить любой файл. Добавляйте в группу только тех, кому вы доверили бы и root-доступ.

Ограничьте логи контейнеров

По умолчанию Docker сохраняет весь вывод контейнера в файлы *-json.log в /var/lib/docker/containers/ без ограничения размера. Контейнер, который много пишет, может заполнить диск. Настройте ротацию логов сразу после установки:

  1. Откройте файл настроек. На AlmaLinux и CentOS Stream сначала установите редактор nano:

    dnf install -y nano
    mkdir -p /etc/docker
    nano /etc/docker/daemon.json
  2. Вставьте содержимое ниже. Если в файле уже есть настройки, добавьте два ключа в существующий объект, а не второй блок { }.

    {
      "log-driver": "json-file",
      "log-opts": {
        "max-size": "10m",
        "max-file": "3"
      }
    }
  3. Проверьте файл. Правильный результат — «configuration OK». Если в файле есть ошибка, служба docker не запустится, а вместе с ней и контейнеры.

    dockerd --validate --config-file=/etc/docker/daemon.json
  4. Перезапустите Docker. Контейнеры ненадолго остановятся; те, у которых задано restart: unless-stopped или restart: always, запустятся снова сами.

    systemctl restart docker

Теперь каждый контейнер хранит не больше 3 файлов по 10 МБ. Настройка действует только на контейнеры, созданные после изменения: пересоздайте контейнеры проекта Compose из папки проекта, а запущенные через docker run удалите и создайте заново.

docker compose up -d --force-recreate

Порты: что доступно из интернета

  • Сетевой фильтр, которым управляет BLACKBOX, по умолчанию пропускает только SSH (22), HTTP (80), HTTPS (443) и ping. Контейнер, опубликованный на порту 8080 или 3000, из интернета недоступен. Если нужен другой порт, напишите в поддержку: Как связаться с поддержкой BLACKBOX.
  • Docker обходит файрвол системы. Для опубликованных портов (-p или ports:) Docker добавляет собственные правила iptables, которые срабатывают раньше правил ufw: ufw status их не показывает, а правило deny их не закрывает. На firewalld тоже не рассчитывайте, если нужно скрыть порт, опубликованный Docker.

Внимание Контейнер, опубликованный на порту 80, 443 или на порту, открытом по вашему запросу, доступен из интернета независимо от ufw и firewalld. Базы данных и панели администрирования не публикуйте на всех адресах сервера.

Как публиковать правильно:

  1. Публикуйте приложение только на 127.0.0.1 ("127.0.0.1:8080:80" вместо "8080:80") и выводите его наружу через nginx на 80/443 с HTTPS: Приложения Node.js, Python и другие сервисы: nginx как обратный прокси. Для AlmaLinux и CentOS Stream там же описана нужная настройка SELinux.
  2. Контейнерам, которые общаются только между собой (например, базе данных), ports: не нужен: внутри одного проекта Compose они находят друг друга по имени сервиса, например db.
  3. Контейнер-прокси (nginx, Caddy, Traefik) можно опубликовать прямо на портах 80 и 443. Тогда не запускайте параллельно nginx или Apache на самом сервере, иначе при старте появится ошибка address already in use.
  4. Для более тонкой фильтрации добавляйте правила в цепочку DOCKER-USER, как описано в документации Docker об iptables. Добавленные вручную правила пропадают после перезагрузки, если их не сохранить.

Первый проект на Docker Compose

В примере запускается WordPress с базой данных MariaDB. Сайт слушает только 127.0.0.1:8080, а данные хранятся в именованных томах. Затем вы публикуете его на домене через nginx, как в пункте 1 выше.

  1. Создайте папку проекта:

    mkdir -p /srv/wordpress
    cd /srv/wordpress
  2. Создайте файл .env с паролем базы данных. Compose читает его автоматически. Используйте в пароле только латинские буквы и цифры: символ $ в этом файле Compose воспринимает как подстановку переменной.

    nano .env
    DB_PASSWORD=ДЛИННЫЙ_ПАРОЛЬ

    Оставьте доступ к файлу только пользователю root:

    chmod 600 .env
  3. Создайте файл compose.yaml:

    nano compose.yaml
    services:
      db:
        image: mariadb:11
        restart: unless-stopped
        environment:
          MARIADB_DATABASE: wordpress
          MARIADB_USER: wordpress
          MARIADB_PASSWORD: ${DB_PASSWORD}
          MARIADB_RANDOM_ROOT_PASSWORD: "1"
        volumes:
          - db-data:/var/lib/mysql
    
      wordpress:
        image: wordpress:latest
        restart: unless-stopped
        depends_on:
          - db
        environment:
          WORDPRESS_DB_HOST: db
          WORDPRESS_DB_USER: wordpress
          WORDPRESS_DB_PASSWORD: ${DB_PASSWORD}
          WORDPRESS_DB_NAME: wordpress
        ports:
          - "127.0.0.1:8080:80"
        volumes:
          - wp-data:/var/www/html
    
    volumes:
      db-data:
      wp-data:
  4. Запустите проект и проверьте его:

    docker compose up -d
    docker compose ps
    curl -I http://127.0.0.1:8080

    Ответ, начинающийся с HTTP/1.1, означает, что сайт работает. Если сразу после запуска появляется ошибка, подождите несколько секунд: при первом запуске база данных инициализируется.

Благодаря restart: unless-stopped контейнеры сами запускаются после перезагрузки сервера. Команды Compose выполняются из папки проекта:

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

Данные: тома и резервные копии

Контейнеры одноразовые: при обновлении Compose удаляет их и создаёт заново, и всё, что приложение записало вне тома, пропадает. Храните данные:

  • в именованных томах, как db-data и wp-data в примере. Docker держит их в /var/lib/docker/volumes/, а Compose добавляет к имени название проекта (папки): wordpress_db-data;
  • или в папках сервера, смонтированных в контейнер (bind mount), например ./uploads:/app/uploads. Их легко копировать через rsync.

Сохраняйте тома и файлы compose.yaml и .env, а не контейнеры: образы и контейнеры можно пересоздать в любой момент. Для базы данных делайте дамп, а не копируйте файлы работающей базы:

mkdir -p /root/backup
cd /srv/wordpress
docker compose exec -T db sh -c 'mariadb-dump -u wordpress -p"$MARIADB_PASSWORD" wordpress' > /root/backup/wordpress.sql

Уточните точное имя тома и заархивируйте его с помощью временного контейнера:

docker volume ls
docker run --rm -v wordpress_wp-data:/data:ro -v /root/backup:/backup alpine tar czf /backup/wp-data.tar.gz -C /data .

BLACKBOX не делает автоматических резервных копий вашего сервера. Переносите копии на другой сервер или во внешнее хранилище: Стратегия резервного копирования для вашего сервера.

Как освободить место, занятое Docker

Посмотрите, сколько занимают образы, контейнеры, тома и кеш сборки и сколько можно освободить (столбец RECLAIMABLE):

docker system df
Команда Что удаляет
docker image prune образы без тега (<none>), оставшиеся после обновлений
docker image prune -a все образы, которые не использует ни один контейнер
docker builder prune кеш сборки
docker system prune остановленные контейнеры, неиспользуемые сети, образы без тега и кеш сборки
docker system prune -a дополнительно все неиспользуемые образы

Перед удалением каждая команда запрашивает подтверждение. Если диск уже заполнен, в том числе старыми логами контейнеров, см. Диск сервера заполнен.

Опасно docker system prune удаляет и остановленные контейнеры: у проекта, остановленного через docker compose stop, контейнеры пропадут (пересоздать их можно командой docker compose up -d). Не добавляйте --volumes и не запускайте docker volume prune -a, если не знаете точно, какие тома будут удалены: тома проекта, остановленного через docker compose down, считаются неиспользуемыми, и их данные будут потеряны безвозвратно.

Память на небольших тарифах

Каждый контейнер потребляет память. База данных, приложение и прокси вместе могут превысить память тарифов Basic XS (1 ГБ), Basic S, CPU S и Standard S (2 ГБ): Тарифы VPS: как выбрать. Проверьте потребление и не был ли контейнер остановлен из-за нехватки памяти (результат true это подтверждает):

free -h
docker stats --no-stream
docker inspect --format '{{.State.OOMKilled}}' ИМЯ_КОНТЕЙНЕРА

Что можно сделать:

Образы тоже занимают место: на дисках 20–30 ГБ периодически проверяйте docker system df. В семействах CPU и High-Frequency Compute диск после апгрейда не увеличивается.

Частые вопросы

Почему контейнеров не видно в панели app.blackbox.md? Панель не показывает контейнеры и не управляет ими на серверах, заказанных на blackbox.md. Управляйте ими по SSH командами docker и docker compose.

Контейнер работает, но приложение не открывается из интернета. Почему? Чаще всего приложение опубликовано на порту, отличном от 80 и 443, и его отсекает сетевой фильтр, либо оно опубликовано только на 127.0.0.1. Опубликуйте его через nginx на 80/443 или попросите поддержку открыть порт. Другие причины: Сайт не открывается.

При скачивании образа появляется ошибка toomanyrequests. Что делать? Docker Hub ограничивает число скачиваний без учётной записи. Создайте бесплатную учётную запись на Docker Hub, войдите в неё на сервере командой ниже и повторите скачивание.

docker login

Как обновить Docker? Пакеты Docker обновляются вместе с системой через apt upgrade или dnf upgrade; на Ubuntu и Debian автоматические обновления безопасности их не затрагивают. Во время обновления контейнеры ненадолго останавливаются. Подробнее: Обновления системы и автоматические обновления безопасности.

Не нашли ответ?Напишите нам — служба поддержки ответит. support@blackbox.md
Открыть тикет