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 и так далее. Также мы будем использовать некоторые флаги. Более детально c командами и флагами к ним можете ознакомиться в официальной документации 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 ls
Управление контейнерами
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 поддерживается в открытом состоянии даже если контейнер к STDIN не подключён; - -t(
--tty
) – выделяется псевдотерминал, который соединяет используемый терминал с потоками STDIN и STDOUT контейнера; - -p(
--port
) – маппинг порта на сервере к порту контейнера;
Примеры подобного маппинга:
- “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
Информируем: Для получения дополнительной информации можете воспользоваться официальными ресурсами: