Установка Docker и Docker Compose
Как установить Docker из официального репозитория, запускать приложения через Compose и что важно знать о портах, логах, месте на диске и памяти.
На этой странице
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/ без ограничения размера. Контейнер, который много пишет, может заполнить диск. Настройте ротацию логов сразу после установки:
Откройте файл настроек. На AlmaLinux и CentOS Stream сначала установите редактор
nano:dnf install -y nanomkdir -p /etc/docker nano /etc/docker/daemon.jsonВставьте содержимое ниже. Если в файле уже есть настройки, добавьте два ключа в существующий объект, а не второй блок
{ }.{ "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } }Проверьте файл. Правильный результат — «configuration OK». Если в файле есть ошибка, служба
dockerне запустится, а вместе с ней и контейнеры.dockerd --validate --config-file=/etc/docker/daemon.jsonПерезапустите 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. Базы данных и панели администрирования не публикуйте на всех адресах сервера.
Как публиковать правильно:
- Публикуйте приложение только на
127.0.0.1("127.0.0.1:8080:80"вместо"8080:80") и выводите его наружу через nginx на 80/443 с HTTPS: Приложения Node.js, Python и другие сервисы: nginx как обратный прокси. Для AlmaLinux и CentOS Stream там же описана нужная настройка SELinux. - Контейнерам, которые общаются только между собой (например, базе данных),
ports:не нужен: внутри одного проекта Compose они находят друг друга по имени сервиса, напримерdb. - Контейнер-прокси (nginx, Caddy, Traefik) можно опубликовать прямо на портах 80 и 443. Тогда не запускайте параллельно nginx или Apache на самом сервере, иначе при старте появится ошибка
address already in use. - Для более тонкой фильтрации добавляйте правила в цепочку
DOCKER-USER, как описано в документации Docker об iptables. Добавленные вручную правила пропадают после перезагрузки, если их не сохранить.
Первый проект на Docker Compose
В примере запускается WordPress с базой данных MariaDB. Сайт слушает только 127.0.0.1:8080, а данные хранятся в именованных томах. Затем вы публикуете его на домене через nginx, как в пункте 1 выше.
Создайте папку проекта:
mkdir -p /srv/wordpress cd /srv/wordpressСоздайте файл
.envс паролем базы данных. Compose читает его автоматически. Используйте в пароле только латинские буквы и цифры: символ$в этом файле Compose воспринимает как подстановку переменной.nano .envDB_PASSWORD=ДЛИННЫЙ_ПАРОЛЬОставьте доступ к файлу только пользователю
root:chmod 600 .envСоздайте файл
compose.yaml:nano compose.yamlservices: 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:Запустите проект и проверьте его:
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}}' ИМЯ_КОНТЕЙНЕРАЧто можно сделать:
- добавить swap: Добавление файла подкачки (swap);
- ограничить память контейнера строкой
mem_limit: 512mу нужного сервиса вcompose.yaml; - перейти на более мощный тариф: Апгрейд сервера: переход на больший тариф.
Образы тоже занимают место: на дисках 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 автоматические обновления безопасности их не затрагивают. Во время обновления контейнеры ненадолго останавливаются. Подробнее: Обновления системы и автоматические обновления безопасности.