Как использовать Docker Compose с настройкой сетевого интерфейса хоста

DockerDockerBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом руководстве показано, как использовать Docker Compose с настройкой сетевого интерфейса хоста на виртуальной машине (VM) в облаке LabEx. Docker Compose - это инструмент, который помогает управлять несколькими контейнерами. Контейнеры можно представить как легковесные изолированные среды, в которых запускаются приложения, например, веб-сервер. Обычно Docker изолирует сеть контейнера от хост-машины (виртуальной машины, на которой вы работаете), но параметр сетевого интерфейса хоста позволяет контейнеру напрямую использовать сеть хоста. Это полезно, когда ваше приложение должно работать так, как если бы оно запускалось непосредственно на хосте, например, когда оно должно иметь доступ к портам хоста без дополнительной настройки. В конце вы настроите Docker Compose, создадите, развернете и протестируете простой веб-сервис с использованием сетевого интерфейса хоста. Docker уже предустановлен в среде LabEx, но мы также убедимся, что Docker Compose готов к использованию.

Для прохождения этого практикума требуется подключение к интернету, поэтому запустить виртуальную машину могут только пользователи LabEx Pro. Перейдите на тариф Pro.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/SystemManagementGroup(["System Management"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/restart("Restart Container") docker/ContainerOperationsGroup -.-> docker/logs("View Container Logs") docker/ContainerOperationsGroup -.-> docker/create("Create Container") docker/SystemManagementGroup -.-> docker/version("Show Docker Version") subgraph Lab Skills docker/run -.-> lab-394882{{"Как использовать Docker Compose с настройкой сетевого интерфейса хоста"}} docker/ps -.-> lab-394882{{"Как использовать Docker Compose с настройкой сетевого интерфейса хоста"}} docker/restart -.-> lab-394882{{"Как использовать Docker Compose с настройкой сетевого интерфейса хоста"}} docker/logs -.-> lab-394882{{"Как использовать Docker Compose с настройкой сетевого интерфейса хоста"}} docker/create -.-> lab-394882{{"Как использовать Docker Compose с настройкой сетевого интерфейса хоста"}} docker/version -.-> lab-394882{{"Как использовать Docker Compose с настройкой сетевого интерфейса хоста"}} end

Настройка Docker Compose

Перед тем как приступить к настройке, убедимся, что Docker Compose установлен на вашей виртуальной машине в облаке LabEx. Хотя Docker предустановлен, Docker Compose (отдельный инструмент для управления многоконтейнерными настройками) может отсутствовать. Мы быстро установим его с помощью терминала.

Откройте терминал на виртуальной машине LabEx. В приглашении командной строки должно быть /home/labex/project - это ваша рабочая директория по умолчанию. Выполните следующие команды по одной:

sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose-install

Вот что делают эти команды:

  • curl: Скачивает бинарный файл Docker Compose с официального релиза на GitHub. В URL-адресе используется $(uname -s)-$(uname -m) для соответствия системе вашей виртуальной машины (например, Linux-x86_64). Версия 2.20.2 является стабильной и имеет широкую совместимость.
  • -o /usr/local/bin/docker-compose: Сохраняет файл в /usr/local/bin, стандартной директории для исполняемых инструментов. sudo обеспечивает необходимые права на запись в эту директорию.
  • chmod +x: Делает файл исполняемым, чтобы вы могли запускать его как команду. Опять же, sudo предоставляет необходимые права.

Чтобы убедиться, что установка прошла успешно, выполните команду:

docker-compose --version

Вы должны увидеть вывод, похожий на Docker Compose version v2.20.2. Если вы получите сообщение "command not found", внимательно повторите выполнение команд - проверьте на наличие опечаток или проблем с доступом в Интернет (для скачивания виртуальная машина должна иметь доступ к сети). Этот шаг гарантирует, что вы готовы использовать docker-compose в следующих шагах.

Создание файла Docker Compose с сетью узла

Теперь, когда Docker Compose готов, давайте создадим файл docker-compose.yml — вашу схему для запуска веб-сервиса с сетью узла. Мы будем использовать nano, простой и удобный для начинающих текстовый редактор в терминале.

Чтобы создать и отредактировать файл, следуйте шагам:

  1. В терминале убедитесь, что вы находитесь в каталоге проекта:

    cd /home/labex/project
  2. Создайте и откройте файл с nano:

    nano docker-compose.yml
  3. Введите или вставьте следующее содержимое в nano:

version: "3"
services:
  web:
    image: nginx:latest
    network_mode: host

Вот, что означает каждая часть:

  • version: "3": Устанавливает формат файла Docker Compose. Версия 3 — это общее стандарт, как выбор шаблона.
  • services: Перечисляет контейнеры (или «сервисы») для запуска, как рабочих для вашего проекта.
  • web: Называет ваш сервис — можно назвать его как угодно, но «web» подходит для веб-сервера.
  • image: nginx:latest: Указывает на программное обеспечение — Nginx, популярный веб-сервер, с latest получающим самую новую версию из Docker Hub (библиотеки контейнерных образов).
  • network_mode: host: Ключевое настройка. Обычно Docker дает контейнерам свою собственную приватную сеть, изолируя их от узла. Режим host позволяет контейнеру использовать сеть ВМ напрямую, так что Nginx может получить доступ к портам узла (например, 80) без дополнительных шагов.
  1. Чтобы сохранить файл в nano:
    • Нажмите Ctrl + X, чтобы выйти
    • Нажмите Y, чтобы подтвердить сохранение изменений
    • Нажмите Enter, чтобы подтвердить имя файла

Теперь файл сохранен в /home/labex/project, и вы готовы к следующему шагу.

Развертывание приложения с использованием Docker Compose

Теперь, когда файл docker-compose.yml настроен, развернем контейнер Nginx, то есть скажем Docker запустить его на основе вашего плана. Для этого перейдем в терминал.

В терминале в директории /home/labex/project выполните команду:

docker-compose up -d

Разберем эту команду по частям:

  • docker-compose: Инструмент, который считывает файл docker-compose.yml и управляет вашими сервисами.
  • up: Запускает сервис web (Nginx), определенный в файле.
  • -d: Запускает сервис в фоновом режиме ("detached mode"), чтобы вы могли продолжать использовать терминал.

Docker Compose загрузит образ nginx:latest с Docker Hub, если он еще не находится на виртуальной машине (возможно, вы увидите сообщения о загрузке), а затем запустит контейнер. Проверьте, что контейнер запущен, выполнив команду:

docker ps

Эта команда выводит список активных контейнеров. Найдите nginx:latest в столбце "IMAGE" и "Up" в столбце "STATUS" (например, "Up 5 seconds"). Вы не увидите отображения портов (например, 0.0.0.0:80->80/tcp), так как параметр network_mode: host использует порты хоста напрямую. Если ничего не отображается, убедитесь, что вы находитесь в директории /home/labex/project (используйте команду pwd для проверки) и повторите выполнение команды docker-compose up -d.

Тестирование сервиса Nginx на сетевом интерфейсе хоста

Теперь, когда контейнер запущен с использованием сетевого интерфейса хоста, проверим, может ли Nginx предоставлять веб-страницы на порту 80 хоста - стандартном веб-порту.

В терминале в директории /home/labex/project выполните команду:

curl localhost:80

Вот что происходит:

  • curl: Получает данные с веб-адреса, подобно браузеру, работающему в терминале.
  • localhost:80: Подключается к самой виртуальной машине (localhost) на порту 80. При использовании параметра network_mode: host контейнер с Nginx использует сеть хоста, поэтому его порт 80 совпадает с портом 80 хоста.

Вы должны увидеть HTML-код, начинающийся с <!DOCTYPE html> - это стандартная приветственная страница Nginx. Обычно Docker изолирует сети контейнеров, что требует отображения портов (например, отображения порта 80 хоста на порт 80 контейнера). Режим хоста позволяет обойти эту настройку, позволяя Nginx напрямую привязываться к порту 80 виртуальной машины.

Если вы получите сообщение "connection refused", проверьте Шаг 3 - выполните команду docker ps, чтобы убедиться, что контейнер запущен ("Up"). Если необходимо, перезапустите контейнер с помощью команды docker-compose up -d, или проверьте статус Docker с помощью команды sudo service docker status. Поскольку мы не используем браузер, curl является инструментом для тестирования.

Просмотр журналов и очистка

Давайте проверим журналы контейнера, чтобы понять, что происходит внутри - это важный навык по устранению неполадок, а затем удалим контейнер для очистки.

Просмотр журналов

Выполните команду:

docker-compose logs web
  • docker-compose logs: Отображает вывод от ваших сервисов.
  • web: Целевой сервис web из файла docker-compose.yml.

Ищите строки, такие как "nginx starting" или "listening on 0.0.0.0:80". Если вы использовали curl, вы можете увидеть запись "GET /". Здесь также будут отображаться ошибки (например, "port 80 failed"), что полезно, если Nginx перестает работать.

Очистка

Выполните команду:

docker-compose down
  • docker-compose down: Останавливает и удаляет контейнер, освобождая порт 80 и очищая систему.

Проверьте с помощью команды:

docker ps

Если строки с nginx нет, значит, контейнер удален. Если он по-прежнему отображается, повторите выполнение команды docker-compose down. Файл docker-compose.yml остается, поэтому вы можете перезапустить контейнер позже с помощью команды docker-compose up -d. Это завершает жизненный цикл: настройка, развертывание, тестирование и удаление.

Устранение неполадок и рекомендации по использованию

Вот как справиться с проблемами и использовать Docker Compose эффективно.

Советы по устранению неполадок

  • Контейнер не запускается: Если команда docker ps не выводит никаких контейнеров, проверьте логи с помощью команды docker-compose logs web на наличие ошибок, таких как "port in use". Освободите порт 80 с помощью команд sudo lsof -i :80 и sudo kill <PID>, а затем запустите контейнер с помощью команды docker-compose up -d.
  • Нет ответа от curl: Убедитесь, что контейнер запущен (docker ps) и Docker работает (sudo service docker status). Перезапустите контейнер с помощью команды docker-compose up -d или перезапустите Docker с помощью команды sudo service docker restart.
  • Проблемы с файлом: Если команда docker-compose up не может найти файл, убедитесь, что вы находитесь в директории /home/labex/project (pwd) и файл docker-compose.yml существует (ls).

Рекомендации по использованию

  • Ограничьте использование сетевого интерфейса хоста: Это простой способ, но он исключает изоляцию, что может создать угрозу безопасности, если на хосте работают другие сервисы. Используйте этот режим только в учебных целях, а не в производственной среде, если это не обязательно.
  • Проверяйте доступность портов заранее: Проверьте доступность порта 80 с помощью команды sudo netstat -tuln | grep :80 и освободите его, если он занят.
  • Сохраняйте файлы: Сохраните файл docker-compose.yml в директории /home/labex/project для повторного использования.
  • Следите за логами: Регулярно проверяйте логи, чтобы своевременно обнаружить проблемы.

Привычки, описанные выше, помогут сделать вашу работу с Docker надежнее и научат вас основным навыкам.

Итог

Вы установили Docker Compose, создали файл docker-compose.yml с использованием сетевого интерфейса хоста, развернули контейнер Nginx, протестировали его, проверили логи и удалили контейнер. Сетевой интерфейс хоста позволяет контейнерам напрямую использовать сеть хоста, обходя изоляцию Docker - это мощный прием. Эти шаги заложили основу для управления приложениями, созданными с использованием Docker Compose, и устранения неполадок, подготовив вас к работе над более крупными проектами.