Все статьи
Руководства

Как установить Docker и Docker Compose на Ubuntu и Debian

Коротко

Docker ставят из официального репозитория Docker, а не из пакета docker.io: так приходят свежие версии Engine и плагин Compose. Сразу после установки ограничьте размер логов контейнеров и помните, что Docker публикует порты в обход файрвола UFW - открывайте наружу только то, что должно быть видно из интернета.

Главное
  • Docker Engine на Ubuntu 22.04/24.04 и Debian 12 ставят из официального репозитория Docker пакетом docker-ce вместе с docker-compose-plugin, а не пакетом docker.io из дистрибутива - так приходят свежий Engine и команда docker compose.
  • Docker публикует порты контейнеров через собственные правила iptables в обход файрвола UFW: порт 8080:80 доступен из интернета, даже если UFW его закрывает, поэтому внутренние сервисы публикуют только на 127.0.0.1.
  • По умолчанию Docker хранит логи контейнеров без ограничения размера; параметры max-size: 10m и max-file: 3 в /etc/docker/daemon.json ограничивают логи 30 МБ на контейнер.
  • Пользователь в группе docker фактически получает права root на сервере, поэтому в эту группу добавляют только своего администратора.
  • Docker и Docker Compose работают на VPS с виртуализацией KVM без ограничений; самому Docker хватает 2 ГБ оперативной памяти, остальное определяют контейнеры.

Шаг 1. Подключите репозиторий Docker и установите пакеты

Один и тот же набор команд работает на Ubuntu и Debian: /etc/os-release подставляет имя дистрибутива и его версию. Это официальный способ из документации Docker:

bash
sudo apt update
sudo apt install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
. /etc/os-release
sudo curl -fsSL "https://download.docker.com/linux/$ID/gpg" -o /etc/apt/keyrings/docker.asc
sudo 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 ${UBUNTU_CODENAME:-$VERSION_CODENAME} stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Шаг 2. Проверьте установку

Запустите тестовый контейнер hello-world и узнайте версию Compose - обе команды должны отработать без ошибок:

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

Если hello-world напечатал приветствие, Engine работает. Служба Docker уже включена в автозапуск и поднимется после перезагрузки сервера.

Шаг 3. Запуск без sudo

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

bash
sudo usermod -aG docker $USER
# выйдите из SSH и зайдите снова, затем:
docker ps

Шаг 4. Первый проект на Docker Compose

Создайте каталог проекта и файл compose.yaml - в примере nginx, доступный только с самого сервера на порту 8080:

compose.yaml
services:
  web:
    image: nginx:alpine
    ports:
      - "127.0.0.1:8080:80"
    restart: unless-stopped
bash
docker compose up -d
docker compose ps
docker compose logs -f

restart: unless-stopped поднимает контейнер после падения и после перезагрузки сервера - отдельный сервис systemd для него не нужен.

Docker и UFW: порты открываются в обход файрвола

Docker сам прописывает правила iptables для опубликованных портов, и они срабатывают раньше правил UFW. Порт, опубликованный как 8080:80, будет доступен из интернета, даже если в UFW он закрыт. Поэтому:

  • публикуйте внутренние сервисы (базы данных, админки, API без авторизации) только на 127.0.0.1, как в примере выше;
  • наружу открывайте один обратный прокси (nginx, Caddy, Traefik) на портах 80 и 443, а он уже передаёт запросы контейнерам - как поставить nginx с бесплатным сертификатом, описано в руководстве по HTTPS;
  • контейнерам, которым не нужен доступ извне, порты не публикуйте вовсе - внутри одного Compose-проекта они видят друг друга по имени сервиса.

Шаг 5. Ограничьте размер логов

По умолчанию Docker хранит логи контейнеров без ограничения размера, и болтливый контейнер может занять весь диск. Ограничьте их: не больше трёх файлов по 10 МБ на контейнер. Настройка действует на контейнеры, созданные после неё - существующие пересоздайте через docker compose up -d --force-recreate.

bash
sudo tee /etc/docker/daemon.json > /dev/null <<'EOF'
{
  "log-driver": "json-file",
  "log-opts": { "max-size": "10m", "max-file": "3" }
}
EOF
sudo systemctl restart docker

Как освободить место на диске

Старые образы копятся после каждого обновления. Первая команда показывает, что занимает место, вторая удаляет образы, которые не использует ни один контейнер:

bash
docker system df
docker image prune -a
Запустите сервер за 2 минуты

AMD Ryzen 9, NVMe и защита от DDoS в Германии, Финляндии и Польше. Оплата криптовалютой или картой.

Заказать сервер

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

Чем пакет docker.io отличается от docker-ce?

docker.io собирает сам дистрибутив, и версия в нём обычно старше. docker-ce - пакет из официального репозитория Docker со свежим Engine и плагином Compose; именно его рекомендует документация Docker.

Работает ли Docker на VPS Tihost?

Да. Серверы работают на KVM - это полноценная виртуальная машина со своим ядром, поэтому Docker, Compose и сети контейнеров работают без ограничений.

Почему контейнер доступен из интернета, хотя UFW закрыт?

Docker публикует порты через собственные правила iptables, которые срабатывают раньше UFW. Публикуйте внутренние сервисы на 127.0.0.1 или не публикуйте их вовсе.

Чем docker compose отличается от docker-compose?

docker-compose - старая отдельная программа на Python, её развитие прекращено. docker compose (через пробел) - плагин Docker CLI, который ставится пакетом docker-compose-plugin.

Сколько памяти нужно для Docker?

Самому Docker хватает конфигурации с 2 ГБ памяти. Всё остальное зависит от контейнеров: несколько сервисов с базой данных удобнее держать на 4-8 ГБ.