- 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:
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 - обе команды должны отработать без ошибок:
sudo docker run --rm hello-world
docker compose versionЕсли hello-world напечатал приветствие, Engine работает. Служба Docker уже включена в автозапуск и поднимется после перезагрузки сервера.
Шаг 3. Запуск без sudo
Чтобы не писать sudo перед каждой командой docker, добавьте своего пользователя в группу docker и перезайдите по SSH:
sudo usermod -aG docker $USER
# выйдите из SSH и зайдите снова, затем:
docker psШаг 4. Первый проект на Docker Compose
Создайте каталог проекта и файл compose.yaml - в примере nginx, доступный только с самого сервера на порту 8080:
services:
web:
image: nginx:alpine
ports:
- "127.0.0.1:8080:80"
restart: unless-stoppeddocker compose up -d
docker compose ps
docker compose logs -frestart: 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.
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Как освободить место на диске
Старые образы копятся после каждого обновления. Первая команда показывает, что занимает место, вторая удаляет образы, которые не использует ни один контейнер:
docker system df
docker image prune -aAMD 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 ГБ.