Цель примера
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.