ESC

Start typing to search across invoices, services, domains, tickets, and more...

Search... Ctrl+K
Linux-сервер

Установка Docker и Docker Compose на Debian, Ubuntu, Rocky Linux и AlmaLinux

7 шагов 15 мин чтения 26 просмотров 0
Содержание

В этой инструкции показано, как установить Docker и Docker Compose на Linux-сервер из официального репозитория Docker — отдельно для Debian/Ubuntu и для Rocky Linux/AlmaLinux. Также разберём настройку после установки, запуск первого контейнера, зеркало реестра и типичную ловушку: Docker публикует порты в обход файрвола. Подходит для VPS и выделенных серверов IMIDC с 64-битной ОС и доступом root.

Шаг 1: Удалите старые пакеты перед установкой Docker

Пакеты из репозиториев дистрибутива (docker.io, podman-docker и др.) конфликтуют с Docker CE. На чистой системе команды просто сообщат, что пакеты не установлены. Образы и тома в /var/lib/docker при этом не удаляются.

# Debian / Ubuntu: remove distro packages that conflict with Docker CE
for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do apt-get remove -y $pkg; done

# Rocky Linux / AlmaLinux
dnf remove -y docker docker-client docker-client-latest docker-common docker-latest \
  docker-latest-logrotate docker-logrotate docker-engine podman runc

Шаг 2: Установка Docker на Debian/Ubuntu из официального репозитория

В официальном репозитории версии свежее, чем в дистрибутиве, и есть плагин docker compose (Compose V2). Команды сами определяют Debian или Ubuntu и кодовое имя релиза через /etc/os-release, поэтому их можно вставлять без правок.

apt-get update
apt-get install -y ca-certificates curl
install -m 0755 -d /etc/apt/keyrings
. /etc/os-release          # sets $ID (debian/ubuntu) and $VERSION_CODENAME
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-get update
apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Шаг 3: Установка Docker CE на Rocky Linux/AlmaLinux

Для RHEL-совместимых систем используется репозиторий Docker для rhel; он подходит для Rocky Linux и AlmaLinux 8 и 9. При первой установке dnf попросит импортировать GPG-ключ — проверьте отпечаток и ответьте y.

dnf install -y dnf-plugins-core
dnf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo
dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Шаг 4: Запуск Docker и настройка после установки

Включите автозапуск и проверьте работу образом hello-world. Чтобы обычный пользователь запускал docker без sudo, добавьте его в группу docker, но помните: членство в ней фактически равно правам root, поэтому выдавайте его только доверенным учётным записям.

systemctl enable --now docker
docker version
docker compose version
docker run --rm hello-world

# Optional: allow a normal user to run docker (this is equivalent to root access)
usermod -aG docker deploy
# log out and log in again as "deploy", then test:
docker ps

Шаг 5: Первый контейнер с Docker Compose

Compose V2 вызывается как docker compose (через пробел), а файл рекомендуется называть compose.yaml. Пример ниже запускает контейнер Nginx, привязанный только к 127.0.0.1; наружу его лучше публиковать через Nginx на хосте с HTTPS (см. статью про обратный прокси Nginx).

mkdir -p /opt/web && cd /opt/web
cat > compose.yaml <<'EOF'
services:
  web:
    image: nginx:stable
    ports:
      - "127.0.0.1:8080:80"
    volumes:
      - ./html:/usr/share/nginx/html:ro
    restart: unless-stopped
EOF
mkdir -p html && echo "Hello from Docker" > html/index.html
docker compose up -d
docker compose ps
curl http://127.0.0.1:8080
docker compose logs -f web      # Ctrl+C to stop following

Шаг 6: Зеркало реестра Docker и ограничение логов

Серверы IMIDC в Гонконге, Японии, Корее и других регионах обычно работают с Docker Hub напрямую, и зеркало не требуется. Если загрузка образов медленная, укажите доверенное зеркало в daemon.json (registry-mirrors действует только для Docker Hub). Заодно ограничьте размер логов контейнеров, чтобы они не заполнили диск. Анонимные загрузки лимитированы, поэтому при частых pull выполните docker login.

mkdir -p /etc/docker
cat > /etc/docker/daemon.json <<'EOF'
{
  "registry-mirrors": ["https://mirror.example.com"],
  "log-driver": "json-file",
  "log-opts": { "max-size": "20m", "max-file": "3" }
}
EOF
systemctl restart docker
docker info | grep -A2 "Registry Mirrors"

# Avoid anonymous Docker Hub pull limits
docker login
daemon.json должен быть корректным JSON: лишняя запятая не даст Docker запуститься. Причину смотрите в journalctl -u docker -n 50.

Шаг 7: Docker и файрвол (iptables, ufw, firewalld)

Docker создаёт собственные правила iptables/nftables для публикации портов, и они срабатывают раньше правил ufw. Поэтому порт, опубликованный через -p 8080:80, доступен из интернета, даже если в ufw он не открыт. Надёжнее всего привязывать контейнер к 127.0.0.1 и отдавать приложение через Nginx; если порт обязан быть публичным, ограничьте источники в цепочке DOCKER-USER.

# 1) Recommended: publish only on localhost and expose the app through Nginx
#    compose.yaml ->  ports: - "127.0.0.1:8080:80"

# 2) Restrict a published port in the DOCKER-USER chain
#    (only 198.51.100.20 may reach container port 8080 via eth0)
iptables -I DOCKER-USER -i eth0 -p tcp -m conntrack --ctorigdstport 8080 --ctdir ORIGINAL \
  ! -s 198.51.100.20 -j DROP
iptables -L DOCKER-USER -n --line-numbers

# 3) firewalld (Rocky/AlmaLinux): Docker adds its own "docker" zone
firewall-cmd --get-active-zones
firewall-cmd --zone=docker --list-all

# After reloading or restarting the firewall, restart Docker to rebuild its rules
systemctl restart docker
Никогда не публикуйте контейнеры баз данных (MySQL, Redis, MongoDB) в интернет через -p 3306:3306 — это одна из самых частых причин взломов и атак вымогателей.

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

Ошибка «permission denied while trying to connect to the Docker daemon socket»?

Пользователь не состоит в группе docker или не перелогинился после добавления. Проверьте командой id, переподключитесь по SSH либо запускайте от root или через sudo.

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

docker-compose (через дефис) — устаревшая самостоятельная утилита V1. docker compose — плагин V2 из пакета docker-compose-plugin; синтаксис почти совместим, для новых проектов используйте V2.

После перезагрузки файрвола контейнеры потеряли сеть?

Перезагрузка firewalld или очистка iptables удаляет NAT-правила Docker. Выполните systemctl restart docker, и правила будут созданы заново.

Если проблема не решена, создайте тикет — техническая поддержка IMIDC работает 24/7. Укажите IP сервера, версию ОС, выполненные команды и полный текст ошибки, чтобы мы быстрее нашли причину.

Помог ли вам данный ответ?

Похожие руководства