Start typing to search across invoices, services, domains, tickets, and more...
В этой инструкции показано, как установить Docker и Docker Compose на Linux-сервер из официального репозитория Docker — отдельно для Debian/Ubuntu и для Rocky Linux/AlmaLinux. Также разберём настройку после установки, запуск первого контейнера, зеркало реестра и типичную ловушку: Docker публикует порты в обход файрвола. Подходит для VPS и выделенных серверов IMIDC с 64-битной ОС и доступом root.
Пакеты из репозиториев дистрибутива (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
В официальном репозитории версии свежее, чем в дистрибутиве, и есть плагин 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
Для 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
Включите автозапуск и проверьте работу образом 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
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
Серверы 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
journalctl -u docker -n 50.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
-p 3306:3306 — это одна из самых частых причин взломов и атак вымогателей.Пользователь не состоит в группе docker или не перелогинился после добавления. Проверьте командой id, переподключитесь по SSH либо запускайте от root или через sudo.
docker-compose (через дефис) — устаревшая самостоятельная утилита V1. docker compose — плагин V2 из пакета docker-compose-plugin; синтаксис почти совместим, для новых проектов используйте V2.
Перезагрузка firewalld или очистка iptables удаляет NAT-правила Docker. Выполните systemctl restart docker, и правила будут созданы заново.
Если проблема не решена, создайте тикет — техническая поддержка IMIDC работает 24/7. Укажите IP сервера, версию ОС, выполненные команды и полный текст ошибки, чтобы мы быстрее нашли причину.