6.21 Налаштування Docker на сервері
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 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”
docker container run -it my_repo/my_image:my_tag sh
- Спільне використання прапорів -i -t дозволяє керувати контейнером через термінал;
docker container ls
docker container rename CONTAINER NEW_NAME
docker container inspect CONTAINER_ID
docker container logs
docker container stop
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
Інформуємо: Для отримання додаткової інформації можете скористатися офіційними ресурсами: