Как установить 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 часто не запускается или работает с ограничениями.