Статические IP в Docker — настройка и Docker Compose

Быстрые ссылки
- Зачем использовать статический IP?
- Настройка статических IP
- Использование Docker Compose
Почему использовать статический IP
Существуют два сценария “статического IP”:
- Приватный IP — для внутренней сети хоста или пользовательских сетей Docker. Используется, когда один контейнер должен надёжно обращаться к другому по фиксированному адресу.
- Публичный IP — адрес за пределами хоста (интернет). Для внешнего доступа чаще применяют проброс портов (port binding), а не назначение публичного IP контейнеру.
Важно: если вы хотите, чтобы служба была доступна извне, проще и безопаснее публиковать порты хоста и использовать обратный прокси, например NGINX или Traefik.
Пример проброса порта 80 хоста на порт 8080 контейнера:
docker run --publish=80:8080 nginxЕсли задача — обеспечить устойчивую связь между контейнерами внутри сети, то Docker предоставляет alias-имена сервисов, которые автоматически резолвятся в IP контейнера. Например, один контейнер может подключаться к MongoDB через строку подключения вида mongodb://mongohost:27017 если вы подключили контейнер с алиасом mongohost.
docker network create exampledocker run --net example --name nginx -d nginxdocker network connect example --alias mongohost mongodbНастройка статических IP
Если вы всё же хотите назначить приватный статический IP, выполните следующие шаги:
- Создайте пользовательскую сеть с указанной подсетью. Подсеть фиксирует диапазон IP, из которого вы будете выдавать адреса.
docker network create --subnet=172.20.0.0/16 customnetwork- Запустите контейнер, указав сеть и желаемый IP:
docker run --net customnetwork --ip 172.20.0.10 -d --name my-container my-image- Проверьте адрес контейнера командой inspect или зайдя внутрь контейнера:
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my-containerdocker exec -it my-container /bin/bashВажно: вручную назначайте IP внутри диапазона подсети и следите, чтобы не было конфликтов с другими контейнерами или хостами.
Использование Docker Compose
Docker Compose упрощает запуск множества контейнеров и позволяет задать статические IP через блок networks + ipv4_address. Ниже — корректный пример docker-compose.yml в синтаксисе версии 2:
version: '2'
services:
webserver:
image: nginx
container_name: web-server
networks:
customnetwork:
ipv4_address: 172.20.0.10
networks:
customnetwork:
ipam:
config:
- subnet: 172.20.0.0/16После запуска с помощью docker-compose up -d контейнер web-server получит IP 172.20.0.10 в сети customnetwork.
Альтернативные подходы
- DNS-алиасы в пользовательской сети: вместо статического IP используйте алиасы контейнеров и встроенный DNS Docker. Это уменьшает риск конфликтов IP и упрощает миграцию.
- Reverse proxy / транспорт уровня 7: если нужно гарантировать доступ извне, публикуйте порты и направляйте трафик через обратный прокси. Это удобнее для SSL и маршрутизации по имени хоста.
- Macvlan сети: если требуется, чтобы контейнеры выглядели в сети как полноценные хосты с собственными MAC/IP, используйте драйвер macvlan (сложнее и требует сетевых прав).
Когда фиксированный IP не подходит
- Динамическая оркестрация (Kubernetes, Docker Swarm): в таких системах адреса могут меняться; лучше использовать сервисы, DNS или load balancer.
- Многообразие хостов: если контейнеры распределены по разным физических хостам, локальный статический IP внутри одного Docker-host мало помогает.
Чек-лист по ролям
Разработчик:
- Убедиться, что код использует DNS-имена сервиса, а не жёстко зашитые IP.
- Проверить конфигурацию окружений (dev/staging/prod).
DevOps / Системный администратор:
- Создать пользовательскую сеть с определённой подсетью.
- Назначить IP и проверить отсутствие конфликтов.
- Настроить мониторинг и резервирование адресов.
Системный архитектор:
- Оценить, нужен ли статический IP или лучше DNS/Load Balancer.
- Выбрать подходящий сетевой драйвер (bridge, macvlan).
Методология быстрого развертывания
- Спланируйте подсеть и диапазон адресов.
- Создайте сеть с ipam и subnet.
- Запустите контейнеры с –ip или через docker-compose с ipv4_address.
- Прогоните тесты доступности и проверку конфликтов.
- Документируйте сопоставление услуг ↔ IP.
Отладка и распространённые ошибки
- Ошибка: “IP already in use” — значит адрес занят. Проверьте другие контейнеры и освободите IP.
- Ошибка: контейнер не доступен с хоста — проверьте правила firewall, и что сеть действительно относится к текущему демону Docker.
- Неправильный формат команды — используйте –ip (две дефисные) и проверяйте синтаксис docker run.
Критерии приёмки
- Контейнер получает ожидаемый IPv4-адрес из заданной подсети.
- Связь между контейнерами по IP и по алиасам работает корректно.
- При перезапуске контейнера заданный IP сохраняется.
Глоссарий
- Подсеть — диапазон IP-адресов в сети, задаётся маской, например /16.
- IPAM — механизм управления адресами в Docker (IP Address Management).
- ipv4_address — параметр в docker-compose, который фиксирует IPv4-адрес.
Короткое резюме
Статические приватные IP в Docker полезны для прямого доступа между контейнерами и с хоста, но чаще стоит предпочесть DNS-алиасы и проброс портов для внешнего доступа. Для назначения статического IP создайте пользовательскую сеть с подсетью и выдавайте адреса через –ip или через docker-compose с ipv4_address. Всегда документируйте и проверяйте конфликты адресов.
Похожие материалы
Как запретить пересылку писем в Outlook
Как включить и настроить тёмную тему в Windows
Будильник, таймер и секундомер на Android
Как удалить аккаунт X (Twitter) — руководство
Автосубтитры в Zoom: как включить и улучшить точность