6.21 Налаштування Docker на сервері

TheHost Docker Banner

Docker – Це популярна платформа контейнеризації, яка дозволяє розробляти, розгортати та керувати контейнерами з додатками. Завдяки контейнеризації розробники можуть швидко створювати, тестувати та розгортати програмне забезпечення в ізольованому середовищі, мінімізуючи конфлікти між залежностями. Це робить Docker ідеальним інструментом для розробки та супроводу сучасних хмарних рішень. Docker значно спрощує процес розгортання додатків, дозволяючи запускати програмне забезпечення в уніфікованому середовищі, незалежно від конфігурації операційної системи хоста. Контейнери забезпечують масштабованість, підвищену безпеку та зручність управління, що робить їх незамінними уDevOps-практиках.

Сьогодні Docker використовується у безлічі сценаріїв — від локальної розробки до розгортання складних розподілених систем. У цьому посібнику ми розглянемо:

  • Встановлення Docker на різні операційні системи;
  • Запуск контейнерів та роботу з образами;
  • Основні команди Docker;
  • Налаштування автозапуску контейнерів.

Термінологія

У подальшому тексті використовується загальноприйнята термінологія роботи з Docker. Основні поняття описані нижче:

Контейнер (Docker Container)

Контейнер – ізольований процес, запущений з образу. Контейнер має:

  • власний простір імен (процеси, мережа, файлова система);
  • обмежені ресурси (CPU, RAM, диск);
  • доступ лише до того, що дозволено.
Образ (Docker Image)

Образ – шаблон, з якого створюються контейнери. Він містить:

  • файлову систему (наприклад, Ubuntu, Alpine);
  • залежності (бібліотеки, пакети);
  • код застосунку;
  • інструкції (з Dockerfile), наприклад COPY, RUN, CMD;
  • Важливо. Образи незмінні. Коли ви оновлюєте застосунок — створюєте новий образ.
Том (Docker Volume)

Том – постійне сховище даних, яке підключається до контейнера. Використовується для:

  • збереження даних БД, логів та конфігурацій;
  • обміну файлами між хостом і контейнером;
  • спільного доступу до даних для кількох контейнерів.

Підготовка сервера та встановлення Docker

Важливо: перед налаштуванням Docker переконайтесь, що:

  • Ви маєте root-доступ. Встановлення можна здійснити на наших віртульних чи виділенних серверах;
  • Увімкнена підтримка віртуалізації (для запуску контейнерів);
  • Є достатньо вільного місця на диску (Docker може займати багато місця при активному використанні).

Перед виконанням будь-яких подібних дій рекомендовано оновити вашу систему. Команда залежить від операційної системи:

Для Debian/Ubuntu:

1. Оновлюємо список пакетів та систему:

sudo apt update
sudo apt upgrade -y

2. Встановлюємо необхідні залежності:

# Эти пакеты позволяют системе загружать Docker из внешнего репозитория через HTTPS.
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common

3. Додаємо офіційний GPG-ключ Docker:

# GPG-ключ використовується для перевірки 
справжньості пакетів Docker.
curl -fsSL https://download.docker.com/linux/ubuntu/gpg
sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

4. Додаємо репозиторій Docker:

# Тепер система знає, звідки завантажувати Docker
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

5. Оновлюємо пакети та встановлюємо Docker:

# Після цього Docker буде встановлен і готовий ждя використання.
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io

Для CentOS/AlmaLinux/RockyLinux

1. Встановлюємо плагіни для роботи з репозиторіями:

sudo dnf install -y dnf-plugins-core

2. Додаємо офіційний репозиторій Docker:

sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

3. Встановлюємо Docker та його компоненти:

sudo dnf install -y docker-ce docker-ce-cli containerd.io
Як додати Docker в автозавантаження?

Якщо потрібно, ви можете налаштувати автозапуск Docker після перезавантаження системи:

sudo systemctl start docker
sudo systemctl enable docker

Основні команди

Нижче ми розглянемо деякі команди з прикладами. У прикладах команди позначені як my_command, контейнери — як my_container, образи — як my_image, теги — як my_tag тощо. Також використовуються певні прапори. Детальніше ознайомитись з командами та їхніми параметрами можна в офіційній документації Docker.

Керування образами
docker image my_command
  • build – збірка образу;
  • push – відправлення образу у віддалений реєстр;
  • ls – вивід списоку образів;
  • history – інформація про шари образу;
  • inspect – вивід детальної інформації про образ;
  • rm – видалення образу.

Приклади:

Збірка образу з тегом:
docker image build -t my_repo/my_image:my_tag
  • -t(--tag) – вказує, який тег призначити створюваному образу. В цьому випадку це my_tag.
Відправлення образу у Docker Registry
docker image push
Відображення списку локально збережених образів
docker image ls
Вивести список активних образів
docker image history
Вивести детальну інформацію про образ
docker image inspect
Додавання тегу до образу
docker image tag image_id my_image:my_tag

Керування контейнерами
docker container my_command
  • create– створення контейнеру з образу;
  • start– запуск наявного контейнера;
  • run– створення і запуск контейнера;
  • ls– список активних контейнерів;
  • rename– перейменування контейнера;
  • inspect– детальна інформація про контейнер.

Приклади:

Створення контейнера
docker container create my_repo/my_image:my_tag
Створення та запуск контейнера з мапінгом порту
docker container run -i -t -p 1000:8000 --rm my_repo/my_image:my_tag
  • -i(--interactive)-- підтримує відкритий STDIN;
  • -t(--tty)-- створює псевдотермінал;
  • -p– мапінг порту хоста на контейнер.

Приклад подібного мапінгу:

  • “3000”
  • “3000-3005”
  • “8000:8000”
  • “9090-9091:8080-8081”
Запуск з оболонкою sh:
docker container run -it my_repo/my_image:my_tag sh
  • Спільне використання прапорів -i -t дозволяє керувати контейнером через термінал;
Список працюючих контейнерів
docker container ls
Перейменування контейнера зі значення CONTAINER у NEW_NAME
docker container rename CONTAINER NEW_NAME
Детальна інформація про контейнер
docker container inspect CONTAINER_ID
Вивід логів роботи контейнера
docker container logs
Зупинка контейнера з надсиланням сигналу SIGTERM, а потім SIGKILL
docker container stop
Примусова зупинка контейнера з сигналом SIGKILL
docker container kill
Керування томами
docker volume my_command
  • create– створення тому;
  • ls– список томів;
  • inspect– перегляд детальної інформації про том;
  • rm– видалення тому;
  • prune– видалення всіх невикористовуваних томів.

Приклади:

Створення окремого тому
docker volume create —-name my_volume
Перегляд списку томів
docker volume ls
Детальна інформація про обраний том
docker volume inspect my_volume
Видалення тому
docker volume rm
Видалення всіх невикористовуваних томів
docker volume prune
Загальні команди
docker my_command
  • version– інформація про версії клієнта і сервера Docker;
  • login– вхід до Docker-реєстру;
  • system prune– видалення невикористовуваних контейнерів, мереж та образів без тегів.

Приклади:

docker version

docker login

docker system prune

Часті помилки та їх вирішення

Помилка: Cannot connect to the Docker daemon

Причина: Docker-сервіс не запущений або проблеми з правами доступу.

Рішення:

# Переконайтесь, що сервіс Docker запущено
sudo systemctl status docker
# Якщо він не активний `inactive`, запустіть його:
sudo systemctl start docker
# Додайте сервіс Docker в автозавантаження, щоб він автоматично запускався при перезавантаженні сервера:
sudo systemctl enable docker
# Якщо проблема пов'язана з недостатніми правами, додайте поточного користувача до групи docker:
sudo usermod -aG docker $(whoami)
# Перезавантажте систему, щоб зміни набули чинності:
reboot
# Після перезапуску переконайтесь, що Docker працює:
docker run hello-world
Помилка: No space left on device

Причина: На диску сервера закінчилось місце, що заважає створенню нових контейнерів і образів.

Рішення:

  • Перевірте, які образи та контейнери займають місце на диску:
# Образи
docker images
# Контейнери
docker ps -a
  • Видаліть непотрібні дані Docker:
# Видалити непотрібні образи:
docker rmi <IMAGE_ID>
# Видалити всі контейнери
docker rm $(docker ps -aq)
# Видалити лише зупинені контейнери
docker container prune
# Обережно: ця команда видалить усі зупинені контейнери, невикористані образи та мережі.
docker system prune -a
  • Перевірте залишок вільного місця на диску
df -h

Помилка: Permission denied while trying to connect to the Docker daemon socket

Причина: Поточний користувач не має прав доступу до сокета Docker (/var/run/docker.sock).

Рішення:

  • Перевірте власника сокета:
# Якщо власник `root`, а поточний користувач не у групі `docker`, це може бути проблемою.
ls -l /var/run/docker.sock
  • Додайте користувача до групи docker:
sudo usermod -aG docker $(whoami)
  • Перезавантажте систему та перевірте доступ до Docker
reboot
# Якщо команда виконалась успішно — проблему вирішено.
docker run hello-world

Помилка: Bind for 0.0.0.0:80 failed: port is already allocated

Причина: Порт, який ви намагаєтесь використати (80 у цьому випадку), вже зайнятий іншим процесом.

Решение:

  • Знайти й завершити процес:
# Замість `port` вкажіть порт із помилки
sudo lsof -i :`port`
# (де `<PID>` — номер процесу з виводу `lsof`)
sudo kill -9 <PID>

  • Або запустити контейнер на іншому порту:
docker run -d -p 8081:80 nginx

Інформуємо: Для отримання додаткової інформації можете скористатися офіційними ресурсами: