core code helper

Встановлення і налаштування Docker: Engine, Desktop, daemon.json

Встановлення Docker Engine на Ubuntu і RHEL, Docker Desktop на Windows і macOS, група docker, daemon.json (логи, мережі, live-restore), контексти для віддалених серверів і rootless.

0 імпортували Імпортувати собі

Що встановлювати

Схема: на Linux Docker Engine працює прямо на ядрі хоста, а на Windows і macOS Docker Desktop запускає Engine у Linux-віртуалці

Де Що Примітка
Linux-сервер Docker Engine з репозиторію Docker безкоштовно, без GUI
Linux-десктоп Docker Engine (або Docker Desktop for Linux) Engine простіший і швидший
Windows 10/11 Docker Desktop + WSL 2 Engine працює всередині WSL
macOS Docker Desktop (або OrbStack, Colima) Engine у легкій ВМ
Ліцензія Docker Desktop

Docker Desktop безкоштовний для особистого використання, навчання, open source і компаній до 250 працівників і з доходом до 10 млн доларів на рік. Великим компаніям потрібна платна підписка. Docker Engine на Linux безкоштовний завжди.

Ubuntu / Debian: офіційний репозиторій

Пакет docker.io у репозиторії Ubuntu зазвичай старіший і без плагінів. Ставимо з репозиторію Docker.

# 1. Прибрати конфліктні пакети (дані в /var/lib/docker не чіпає)
sudo apt remove $(dpkg --get-selections docker.io docker-compose docker-compose-v2 \
  docker-doc podman-docker containerd runc | cut -f1)

# 2. Ключ репозиторію
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

# 3. Репозиторій
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
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
EOF

# 4. Встановлення
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

На Debian замініть обидва ubuntu в адресах на debian, а UBUNTU_CODENAME підставиться порожнім — візьметься VERSION_CODENAME.

RHEL / Rocky / AlmaLinux / Fedora

sudo dnf remove -y docker docker-client docker-common docker-latest podman-docker runc
sudo dnf -y install dnf-plugins-core
sudo dnf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo
sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo systemctl enable --now docker

На Fedora адреса .../linux/fedora/docker-ce.repo, а в dnf5 команда додавання репозиторію: sudo dnf config-manager addrepo --from-repofile=<адреса>.

Тестова віртуалка за хвилину

Для одноразових машин є офіційний скрипт: curl -fsSL https://get.docker.com | sh. На прод-серверах краще ставити через репозиторій, як вище: видно, що саме встановлюється, і оновлення йдуть через apt/dnf.

Перевірка

sudo systemctl status docker      # Active: active (running)
docker version                    # версії клієнта і сервера
docker info                       # драйвер сховища, cgroup, кількість контейнерів
docker compose version
sudo docker run --rm hello-world  # «Hello from Docker!»

Після встановлення (Linux)

Docker без sudo

sudo usermod -aG docker $USER
newgrp docker          # або вийти й зайти знову
docker ps              # уже без sudo
Група docker дорівнює root

Учасник групи docker може запустити docker run -v /:/host -it alpine chroot /host і отримати повний доступ до сервера. Додавайте в групу лише тих, кому довірили б sudo. Альтернатива для спільних машин — rootless-режим (нижче).

Автозапуск

sudo systemctl enable docker.service containerd.service

/etc/docker/daemon.json — налаштування демона

Файл не існує за замовчуванням. Рекомендований мінімум для сервера:

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  },
  "live-restore": true,
  "default-address-pools": [
    { "base": "172.30.0.0/16", "size": 24 }
  ]
}
Параметр Навіщо
log-opts.max-size / max-file без них логи контейнерів ростуть безкінечно й забивають диск
live-restore контейнери не зупиняються при перезапуску чи оновленні dockerd
default-address-pools з яких підмереж Docker видає адреси мережам; змініть, якщо 172.17–172.31 перетинаються з корпоративною мережею чи VPN
data-root перенести /var/lib/docker на інший диск: "data-root": "/mnt/data/docker"
registry-mirrors дзеркало Docker Hub: ["https://mirror.example.com"]
insecure-registries власний реєстр без HTTPS (лише для тестів!)

Застосувати:

sudo dockerd --validate --config-file /etc/docker/daemon.json   # перевірити синтаксис
sudo systemctl restart docker
Ліміти логів — лише для нових контейнерів

log-opts діють на контейнери, створені після перезапуску демона. Існуючі потрібно перестворити (docker compose up -d --force-recreate).

Docker і firewall

Docker сам пише правила iptables і обходить UFW/firewalld: порт, опублікований через -p 5432:5432, буде доступний з інтернету, навіть якщо в UFW він закритий. Рішення:

  • публікуйте сервісні порти лише на localhost: -p 127.0.0.1:5432:5432;
  • або не публікуйте зовсім, а спілкуйтеся через мережі Docker (див. «Мережі»);
  • власні правила фільтрації — у ланцюжку DOCKER-USER.

Docker Desktop на Windows

  1. Увімкніть WSL 2: у PowerShell від адміністратора wsl --install, перезавантажтеся.
  2. Встановіть Docker Desktop (winget install -e --id Docker.DockerDesktop), у налаштуваннях має бути Use the WSL 2 based engine.
  3. Settings → Resources → WSL Integration — увімкніть для свого дистрибутива (Ubuntu), щоб docker працював і в терміналі WSL.
Код — у файловій системі WSL

Тримайте проєкти в ~/code всередині WSL, а не в /mnt/c/.... Bind mount з диска C: іде через мережевий міст і повільніший у рази; file watching (автоперезапуск dev-сервера) там часто не працює.

Обмежити пам'ять, яку забирає WSL, — файл %UserProfile%\.wslconfig:

[wsl2]
memory=8GB
processors=4

Застосувати: wsl --shutdown і запустити Docker Desktop знову.

Docker Desktop на macOS

Встановіть з docker.com (Apple Silicon чи Intel) або brew install --cask docker. Ресурси (CPU, RAM, диск) — у Settings → Resources.

На Apple Silicon образи за замовчуванням збираються під linux/arm64. Якщо сервер на x86 — збирайте з --platform linux/amd64 (див. «Образи»), інакше на сервері буде exec format error.

Контексти: керувати віддаленим Docker зі свого ноутбука

docker context create prod --docker "host=ssh://deploy@prod-01.example.com"
docker context ls
docker --context prod ps          # команда виконується на сервері
docker context use prod           # перемкнутися надовго (обережно!)
docker context use default        # назад на локальний

Працює через SSH, нічого додатково відкривати не треба. Альтернатива на один раз: DOCKER_HOST=ssh://deploy@prod-01 docker ps.

Rootless-режим

Демон працює від звичайного користувача, а не від root. Навіть якщо зловмисник вирветься з контейнера, він отримає права лише цього користувача.

sudo apt install -y uidmap
dockerd-rootless-setuptool.sh install
systemctl --user enable --now docker
export DOCKER_HOST=unix://$XDG_RUNTIME_DIR/docker.sock

Обмеження: порти нижче 1024 за замовчуванням недоступні, частина мережевих функцій працює повільніше. Для серверів з кількома користувачами — добрий вибір.

Оновлення і видалення

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

Повністю видалити (разом з усіма образами, контейнерами і томами!):

sudo apt purge -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo rm -rf /var/lib/docker /var/lib/containerd

Чекліст нового сервера

  1. Docker з офіційного репозиторію, docker compose version працює.
  2. daemon.json: ротація логів, live-restore, за потреби — пули адрес.
  3. У групі docker лише довірені люди.
  4. Порти БД і внутрішніх сервісів не опубліковані на 0.0.0.0.
  5. Є моніторинг диска (docker system df) і план очищення (див. «Образи»).

Збережіть статтю собі

Увійдіть, щоб імпортувати її у власні нотатки, відмічати вивчене, ставити лайки й питати спільноту. Реєстрація безкоштовна: вхід через Google займає кілька секунд.

Увійти через Google Інші способи входу