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 и так далее. Также мы будем использовать некоторые флаги. Более детально c командами и флагами к ним можете ознакомиться в официальной документации Docker.

Управление образами
docker image my_command
  • build – сборка образа;
  • push – отправка образа в удалённый реэстр;
  • ls – вывод списка образов;
  • history – вывод информации о слоях образа;
  • inspect – вывод подробной информации об образах;
  • rm – удаление образа.

Примеры:

Cбор образа с указанием тега
docker image build -t my_repo/my_image:my_tag
  • -t(--tag) – указывает, что создаваемоум образу необходимо назначить тег. В данном случае это my_tag.
Создание контейнера и его запуск
docker image ls

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

Примеры:

Создание контейнера
docker container create my_repo/my_image:my_tag
Cоздание и запуск контейнера
docker container run -i -t -p 1000:8000 --rm my_repo/my_image:my_tag
  • -i(--interactive) – поток STDIN поддерживается в открытом состоянии даже если контейнер к STDIN не подключён;
  • -t(--tty) – выделяется псевдотерминал, который соединяет используемый терминал с потоками STDIN и STDOUT контейнера;
  • -p(--port) – маппинг порта на сервере к порту контейнера;

Примеры подобного маппинга:

  • “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

Информируем: Для получения дополнительной информации можете воспользоваться официальными ресурсами: