MHOSTMHOST

Как установить Docker на Ubuntu: пошаговая инструкция

Docker запускает приложения в изолированных контейнерах: программа вместе со всеми зависимостями упакована в образ и работает одинаково на любом сервере. Не нужно вручную ставить нужные версии Python, Node.js или PostgreSQL — достаточно скачать готовый образ и запустить его одной командой.

В инструкции ставим Docker Engine и Docker Compose из официального репозитория Docker — так рекомендуют сами разработчики. Разберём, как запускать Docker без sudo, как не открыть контейнеры в интернет в обход firewall и как не забить диск логами.

Требования:

  • 64-битная Ubuntu 22.04, 24.04 или 26.04 — эти версии официально поддерживает Docker.
  • Пользователь с правами sudo. Если сервер новый, сначала пройдите базовую настройку VPS.
  • VPS с виртуализацией KVM. На контейнерной виртуализации (OpenVZ, LXC) Docker может не работать.

Шаг 1. Удалите старые и неофициальные пакеты

В репозиториях Ubuntu есть неофициальные пакеты Docker (docker.io, docker-compose и другие). Они конфликтуют с официальной версией, поэтому сначала удалите их:

sudo apt remove $(dpkg --get-selections docker.io docker-compose docker-compose-v2 docker-doc docker-buildx podman-docker containerd runc | cut -f1)

Если этих пакетов нет, apt сообщит об этом — это нормально, переходите к следующему шагу.

Образы, контейнеры и тома из папки /var/lib/docker при этом не удаляются. Если ставите Docker на сервер, где он уже был, данные сохранятся.

Шаг 2. Подключите официальный репозиторий Docker

Установите нужные утилиты и добавьте ключ, которым Docker подписывает свои пакеты:

sudo apt update

sudo apt install -y 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

Добавьте репозиторий. Это одна длинная команда — скопируйте её целиком:

printf '%s\n' "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" | sudo tee /etc/apt/sources.list.d/docker.sources

Команда создаёт файл /etc/apt/sources.list.d/docker.sources и сама подставляет версию вашей Ubuntu и архитектуру процессора.

Обновите список пакетов:

sudo apt update

В выводе должна появиться строка с download.docker.com — значит, репозиторий подключён.

Шаг 3. Установите Docker Engine и Docker Compose

Одна команда ставит всё необходимое:

sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Что устанавливается:

  • docker-ce — сам Docker Engine, служба, которая запускает контейнеры.
  • docker-ce-cli — команда docker для управления.
  • containerd.io — среда выполнения контейнеров, на которой работает Docker.
  • docker-buildx-plugin — сборщик образов.
  • docker-compose-plugin — Docker Compose для запуска приложений из нескольких контейнеров одним файлом.

Docker запускается автоматически и включается в автозагрузку. Проверьте статус:

sudo systemctl status docker

Должно быть active (running). Если служба не запущена, включите её: sudo systemctl enable --now docker.

Шаг 4. Проверьте установку и настройте запуск без sudo

Запустите тестовый контейнер:

sudo docker run hello-world

Docker скачает маленький образ и выведет сообщение «Hello from Docker!». Значит, всё работает.

Проверьте версии:

docker --version

docker compose version

Запуск без sudo. По умолчанию команды Docker требуют sudo. Чтобы работать без него, добавьте своего пользователя в группу docker:

sudo usermod -aG docker $USER

Переподключитесь по SSH, чтобы изменения вступили в силу, и проверьте:

docker run hello-world

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

Быстрый способ: установка одним скриптом

У Docker есть официальный скрипт, который сам подключает репозиторий и ставит все пакеты. Удобно для тестового сервера:

curl -fsSL https://get.docker.com -o get-docker.sh

sudo sh get-docker.sh

Чтобы посмотреть, что скрипт сделает, не устанавливая ничего, запустите его с флагом --dry-run.

Сами разработчики Docker не рекомендуют скрипт для рабочих серверов: он не даёт выбрать версию и может неожиданно установить новую основную версию Docker. Для production надёжнее ручная установка из шагов 1–3. Обновлять Docker после установки скриптом нужно через apt, а не повторным запуском скрипта.

Первый контейнер и основные команды Docker

Запустите веб-сервер Nginx в контейнере:

docker run -d --name web -p 127.0.0.1:8080:80 --restart unless-stopped nginx

Что означают параметры:

  • -d — запуск в фоне.
  • --name web — имя контейнера, чтобы обращаться к нему по имени.
  • -p 127.0.0.1:8080:80 — порт 80 контейнера доступен на порту 8080 сервера, только локально. Почему локально — в следующем разделе.
  • --restart unless-stopped — контейнер сам поднимется после сбоя или перезагрузки сервера.

Проверьте, что Nginx отвечает: curl http://127.0.0.1:8080.

Команды, которые понадобятся каждый день:

  • docker ps — запущенные контейнеры. С флагом -a — все, включая остановленные.
  • docker images — скачанные образы.
  • docker logs -f web — логи контейнера в реальном времени.
  • docker exec -it web bash — зайти внутрь контейнера. Если bash нет, используйте sh.
  • docker stop web и docker start web — остановить и запустить.
  • docker restart web — перезапустить.
  • docker rm web — удалить остановленный контейнер.
  • docker pull nginx — скачать свежую версию образа.
  • docker stats — нагрузка контейнеров на процессор и память.

Для приложений из нескольких контейнеров (например, сайт + база данных) используют Docker Compose: все сервисы описываются в одном файле docker-compose.yml и запускаются командой docker compose up -d. Пример реального проекта: как установить n8n на VPS с Docker Compose.

Docker и firewall UFW: главная ловушка

Это самая частая ошибка на серверах с Docker. Порты, которые публикует Docker, открываются в интернет в обход правил UFW. Об этом предупреждает официальная документация Docker.

Пример: вы запускаете базу данных командой docker run -p 5432:5432 postgres. UFW показывает, что порт 5432 закрыт, но база доступна из интернета, и боты начинают подбирать пароль. Так происходит потому, что Docker сам прописывает правила в iptables, и они срабатывают раньше правил UFW.

Как защититься:

  • Привязывайте порты к localhost, если сервис не должен быть доступен снаружи: -p 127.0.0.1:5432:5432. В Docker Compose: "127.0.0.1:5432:5432".
  • Не публикуйте порты баз данных вообще, если к ним обращаются только другие контейнеры. Контейнеры в одной сети Docker видят друг друга по имени сервиса без проброса портов.
  • Открывайте наружу только веб-сервер (Nginx или Caddy на портах 80 и 443), а остальные сервисы проксируйте через него.

Проверить, какие порты реально открыты наружу, можно командой sudo ss -tlnp. Адрес 0.0.0.0 или * означает, что порт слушает все интерфейсы и доступен из интернета.

Ограничьте логи и следите за местом на диске

По умолчанию Docker хранит логи контейнеров без ограничений. Активный контейнер за несколько месяцев может забить весь диск, и сервер перестанет работать.

Ротация логов. Создайте файл настроек Docker с ограничением: не больше 3 файлов по 10 МБ на контейнер:

echo '{"log-driver": "json-file", "log-opts": {"max-size": "10m", "max-file": "3"}}' | sudo tee /etc/docker/daemon.json

sudo systemctl restart docker

Команда перезаписывает файл: если /etc/docker/daemon.json уже существует, добавьте параметры в него вручную. Настройка применяется только к новым контейнерам. Уже запущенные нужно пересоздать: docker compose up -d --force-recreate для Compose или удалить и запустить заново.

Очистка места. Посмотрите, сколько места занимает Docker:

docker system df

Удалите остановленные контейнеры, неиспользуемые сети, образы без тегов и кеш сборки:

docker system prune

Удалить все образы, которые не используются ни одним контейнером:

docker image prune -a

Осторожно с томами. Команда docker volume prune удаляет тома, не подключённые к контейнерам, а в томах хранятся данные — например, базы. Перед её запуском убедитесь, что все нужные контейнеры запущены, и сделайте бэкап.

Как обновить и удалить Docker

Обновление. Docker обновляется вместе с остальными пакетами системы:

sudo apt update

sudo apt install --only-upgrade docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Во время обновления служба Docker перезапускается, а вместе с ней и контейнеры. Контейнеры с --restart unless-stopped или restart: always поднимутся сами. Обновляйтесь в спокойное время.

Обновление образов приложений — отдельная операция. Для Docker Compose:

docker compose pull

docker compose up -d

Полное удаление Docker. Удалите пакеты:

sudo apt purge -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras

Образы, контейнеры и тома после этого остаются на диске. Чтобы удалить и их — это безвозвратно уничтожит все данные контейнеров:

sudo rm -rf /var/lib/docker /var/lib/containerd

Удалите репозиторий и ключ:

sudo rm /etc/apt/sources.list.d/docker.sources /etc/apt/keyrings/docker.asc

Частые ошибки

  • permission denied while trying to connect to the Docker daemon socket. Пользователь не в группе docker. Выполните sudo usermod -aG docker $USER и переподключитесь по SSH.
  • Cannot connect to the Docker daemon. Is the docker daemon running? Служба Docker не запущена. Запустите: sudo systemctl start docker, причину смотрите в sudo journalctl -u docker -n 50.
  • Bind for 0.0.0.0:80 failed: port is already allocated. Порт занят другим контейнером или программой, например Nginx на самом сервере. Найдите, кто его занял: sudo ss -tlnp | grep :80.
  • no space left on device. Закончилось место на диске. Очистите неиспользуемые данные Docker и настройте ротацию логов (см. выше).
  • toomanyrequests: You have reached your pull rate limit. Превышен лимит скачиваний с Docker Hub для анонимных пользователей. Войдите в аккаунт Docker Hub: docker login.
  • Конфликт пакетов при установке. На сервере остались неофициальные пакеты Docker. Повторите шаг 1.

Чек-лист

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

Чем Docker отличается от виртуальной машины? Виртуальная машина эмулирует целый компьютер со своей ОС и ядром. Контейнер использует ядро сервера и изолирует только приложение, поэтому запускается за секунды и почти не тратит лишней памяти.

Можно ли установить Docker через snap или apt install docker.io? Можно, но версии там часто старее, а snap-версия ограничивает доступ к файлам системы. Официальный репозиторий Docker даёт свежие версии и обновления безопасности.

Нужно ли ставить Docker Compose отдельно? Нет, docker-compose-plugin из шага 3 уже включает Compose. Команда пишется через пробел: docker compose. Старая отдельная утилита docker-compose через дефис устарела.

Сколько ресурсов нужно для Docker? Сам Docker потребляет немного. Всё зависит от запускаемых контейнеров: для пары небольших сервисов хватит VPS с 1–2 ГБ RAM, для баз данных и нескольких приложений берите от 4 ГБ.

Работает ли Docker на любом VPS? Надёжно — на VPS с виртуализацией KVM. На контейнерной виртуализации (OpenVZ, LXC) Docker часто не запускается или работает с ограничениями.