LinuxNotes
← Все статьи

Сети Docker Compose: связь контейнеров по имени

Соединяем два контейнера в отдельной сети и проверяем HTTP-запрос без публикации порта.

Серверы и Docker2 мин чтения

Цель примера

Compose создаёт сеть проекта, где сервисы обращаются друг к другу по именам. Покажем это на тестовом Nginx и контейнере-клиенте. Требуются Docker Engine, Compose и доступ к реестру образов. Используйте отдельный каталог, чтобы не затронуть существующие проекты.

mkdir -p ~/network-demo
cd ~/network-demo

Конфигурация проекта

Создайте compose.yaml:

services:
  web:
    image: nginx:stable-alpine
    networks:
      - app

  client:
    image: alpine:3.22
    command: ["sleep", "infinity"]
    networks:
      - app

networks:
  app:
    driver: bridge

Оба сервиса входят в сеть app. Публикация ports отсутствует: этот пример не открывает HTTP-порт на адресе хоста. Теги образов меняются со временем, поэтому для воспроизводимого production-развёртывания фиксируйте проверенный digest.

Проверка соединения

sudo docker compose config
sudo docker compose up -d
sudo docker compose ps
sudo docker compose exec client wget -qO- http://web:80/

В ответе появится HTML стандартной страницы Nginx. Имя web разрешается средствами сети Docker. Оно не становится DNS-именем на хосте или в домашней сети. Если первый запрос выполнен слишком рано, проверьте журнал web и повторите после запуска сервера.

Почему localhost не подходит

Внутри client адрес 127.0.0.1 относится к самому client, а не к web и не к хосту. Для связи используйте имя сервиса и внутренний порт приложения. Порт, опубликованный через ports, нужен другим клиентам, например браузеру на хосте.

Не записывайте IP контейнеров в конфигурацию: адрес может измениться при пересоздании, а имя сервиса остаётся стабильным. При длительно живущих соединениях приложению всё равно нужен механизм переподключения.

Если соединение не работает

sudo docker compose logs --tail=50 web
sudo docker compose exec client nslookup web

Проверьте, запущен ли web и состоят ли сервисы в одной сети. Успешное разрешение имени не гарантирует работающий HTTP-сервер. Ошибка connection refused обычно требует проверки приложения и его слушающего порта.

Завершение

sudo docker compose down

Команда удалит контейнеры и сеть этого учебного проекта. Сеть Docker обеспечивает связность, но не заменяет аутентификацию приложения и продуманное разделение сервисов.

Дальше: хранение данных в томах.

Документация: Networking in Compose.

Читайте дальше