Использование нескольких IP-адресов с Docker на одном сервере

Ключевые вопросы
- Как работают сетевые интерфейсы в Linux
- Как привязывать Docker-контейнеры к конкретным IP
- Как получить дополнительные IP-адреса и настроить их в системе
Как работают сетевые интерфейсы
В Linux сетевой стек разделяет понятие интерфейса и IP-адреса. Интерфейс — это сущность, представляющая физическое устройство или виртуальный объект (VLAN, мост, alias). Посмотреть список интерфейсов можно командой:
ip addr showВ выводе вы увидите интерфейсы вроде:
eth0и
eno1— это реальные сетевые устройства или их имена, зависящие от дистрибутива.
IP-адреса — это отдельный слой: на один интерфейс можно настроить несколько адресов. Каждый сервис в системе получает сетевое соединение через пару IP:PORT. Пример модели: интерфейс -> IP -> порт -> сокет -> процесс.

Для диагностики полезны команды:
ss -tuln # показать прослушиваемые TCP/UDP порты
netstat -tuln # альтернативная команда на старых системах
ip addr show # список интерфейсов и адресовОпределение: сетевой интерфейс — программный объект в ядре, связывающий аппаратный стек и IP-адреса.
Привязка Docker-контейнеров к конкретным IP-адресам
Docker позволяет не только пробрасывать порт с хоста в контейнер, но и указать, на каком IP хоста слушать этот порт. Общий формат проброса порта в Docker CLI — это “host:container”:
5000:80Это означает: хост-порт 5000 -> контейнерный порт 80.
Если нужно привязать к конкретному IP, используйте синтаксис:
IP:HOST_PORT:CONTAINER_PORTПример:
docker run -it -d 123.0.0.1:80:80 --name web nginxИ второй контейнер на другом IP:
docker run -it -d 123.0.0.2:80:80 --name web2 nginxВажно: имена контейнеров должны быть уникальными.
Если вы используете Docker Compose, то в разделе ports можно использовать тот же синтаксис. Пример docker-compose.yml:
version: "3"
services:
nginx:
image: nginx
restart: always
ports:
- "123.0.0.1:80:80"Замечание: если опустить IP и указать только порт (например, “80:80”), контейнер будет слушать на всех интерфейсах (0.0.0.0) — это часто является ошибкой, если вы хотите изолировать сервисы по IP.
Как получить дополнительные IP-адреса
Большинство серверов по умолчанию имеют один публичный IP. Дополнительные адреса можно получить у вашего провайдера:
- В облаках (AWS, GCP, Azure) это отдельная функциональность (например, Elastic IP в AWS). В исходном материале указан тариф Elastic IP: $3.65 в месяц за дополнительный адрес при определённых условиях.
- Хостеры вроде OVH продают блоки IP (например, /29 или даже /24 для крупных закупок).
- Можно арендовать адреса через брокера (для крупных организаций).
После получения адресов нужно:
- На стороне провайдера «привязать» адреса к вашему инстансу или сделать маршрутизацию.
- На стороне ОС добавить адреса к сетевому интерфейсу (динамически или через конфигурацию netplan/ifupdown).
Пример конфигурации netplan для Ubuntu (статический alias):
network:
version: 2
renderer: networkd
ethernets:
ens3:
dhcp4: no
addresses:
- 203.0.113.10/24
- 203.0.113.11/24
gateway4: 203.0.113.1
nameservers:
addresses: [8.8.8.8, 1.1.1.1]После изменения примените:
sudo netplan applyАльтернативы для старых систем — ifupdown (/etc/network/interfaces) или ip addr add для временной настройки:
sudo ip addr add 203.0.113.11/24 dev ens3Когда это работает плохо: контрпримеры и подводные камни
- Привязка к 0.0.0.0: если забыть указать IP, сервис будет доступен на всех адресах — потенциальная утечка трафика.
- Конфликты маршрутов: если провайдер делает NAT или маршрутизирует IP через другой хост, локальная привязка не сработает без правильной маршрутизации у провайдера.
- Ограничения хостинга: некоторые провайдеры не позволяют привязывать произвольные вторичные IP без специальной поддержки.
- IPv6 отличается по порядку настройки и маршрутизации — проверяйте совместимость.
Альтернативные подходы
- Обратный прокси (nginx, Traefik): слушаете один IP и распределяете по доменным именам/путям. Это удобнее для HTTP(S) и упрощает SSL-терминацию.
- Сетевые плагины Docker (macvlan): позволяют контейнерам получить свои IP в той же подсети, что и хост.
- Использовать L4-балансировщик на фронте, который распределяет трафик между контейнерами.
Мини-методология: как внедрять пошагово
- Получите дополнительные IP у провайдера и убедитесь, что они маршрутизируются к вашему хосту.
- Настройте адреса в ОС (netplan / ip addr add).
- Проверьте, что адреса видны: ip addr show.
- Тестируйте доступность: ping/сокетные утилиты (curl, ss).
- Запустите контейнеры с привязкой IP:PORT:CONTAINER_PORT.
- Проверьте прослушивание: ss -tuln и docker ps / docker inspect.
- Настройте брандмауэр и мониторинг.
Роли и чек-листы
Системный администратор:
- Проверить маршрут и таблицы провайдера
- Настроить netplan/ifupdown и применить конфигурацию
- Настроить брандмауэр (UFW/iptables)
Разработчик/DevOps:
- Убедиться, что контейнеры используют правильную привязку IP
- Настроить docker-compose с корректными портами
- Добавить healthchecks и мониторинг
Специалист по безопасности:
- Ограничить доступ по IP/портам в брандмауэре
- Настроить мониторинг входящего трафика и логирование
- При необходимости использовать TLS и централизованную авторизацию
Критерии приёмки
- Все дополнительные IP видны в ip addr show
- Для каждого IP соответствующий контейнер прослушивает нужный порт (ss -tuln)
- Нет конфликтов имен контейнеров (docker ps)
- Брандмауэр блокирует нежелательный доступ
Тесты и отладка
Проверьте:
ip addr show
ss -tuln | grep :80
curl -v http://123.0.0.1/ # должен ответить первый nginx
curl -v http://123.0.0.2/ # должен ответить второй nginx
sudo docker inspect web | grep IPAddress -A 3Если не работает: проверьте, не слушает ли контейнер на 0.0.0.0 внутри контейнера, проверьте маршрутизацию у провайдера, убедитесь в отсутствии SELinux/AppArmor блокировок.
Безопасность и приватность
- Не делайте публичными административные сервисы на дополнительных IP без авторизации.
- Ограничьте доступ к SSH по IP, если это возможно.
- Следите за логами доступа и устанавливайте лимиты соединений, чтобы избежать злоупотребления.
Совместимость и миграция
- Проверьте, поддерживает ли ваш облачный провайдер вторичные IP и какова их схема биллинга.
- При переносе на другой хост сперва переназначьте IP у провайдера, затем обновите netplan на новом хосте.

Краткое резюме
Использование нескольких IP на одном сервере — простой способ изолировать сервисы по сетевым адресам и запускать несколько приложений, слушающих одинаковые порты. Необходимо корректно получить адреса у провайдера, настроить их в системе и привязать контейнеры через синтаксис IP:HOST_PORT:CONTAINER_PORT. Альтернатива — использовать обратный прокси или сетевые плагины Docker.
Важно: всегда проверяйте прослушиваемые порты и политики брандмауэра перед тем, как открывать сервисы в публичный интернет.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента