Гид по технологиям

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

• 5 min read • Docker • Обновлено 18 Nov 2025
Несколько IP с Docker на одном сервере
Несколько IP с Docker на одном сервере

Схема: контейнеры на одном хосте с разными IP-адресами

Ключевые вопросы

  • Как работают сетевые интерфейсы в Linux
  • Как привязывать Docker-контейнеры к конкретным IP
  • Как получить дополнительные IP-адреса и настроить их в системе

Как работают сетевые интерфейсы

В Linux сетевой стек разделяет понятие интерфейса и IP-адреса. Интерфейс — это сущность, представляющая физическое устройство или виртуальный объект (VLAN, мост, alias). Посмотреть список интерфейсов можно командой:

ip addr show

В выводе вы увидите интерфейсы вроде:

eth0

и

eno1

— это реальные сетевые устройства или их имена, зависящие от дистрибутива.

IP-адреса — это отдельный слой: на один интерфейс можно настроить несколько адресов. Каждый сервис в системе получает сетевое соединение через пару IP:PORT. Пример модели: интерфейс -> IP -> порт -> сокет -> процесс.

Иллюстрация: интерфейс, IP и порты в Linux

Для диагностики полезны команды:

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 для крупных закупок).
  • Можно арендовать адреса через брокера (для крупных организаций).

После получения адресов нужно:

  1. На стороне провайдера «привязать» адреса к вашему инстансу или сделать маршрутизацию.
  2. На стороне ОС добавить адреса к сетевому интерфейсу (динамически или через конфигурацию 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-балансировщик на фронте, который распределяет трафик между контейнерами.

Мини-методология: как внедрять пошагово

  1. Получите дополнительные IP у провайдера и убедитесь, что они маршрутизируются к вашему хосту.
  2. Настройте адреса в ОС (netplan / ip addr add).
  3. Проверьте, что адреса видны: ip addr show.
  4. Тестируйте доступность: ping/сокетные утилиты (curl, ss).
  5. Запустите контейнеры с привязкой IP:PORT:CONTAINER_PORT.
  6. Проверьте прослушивание: ss -tuln и docker ps / docker inspect.
  7. Настройте брандмауэр и мониторинг.

Роли и чек-листы

Системный администратор:

  • Проверить маршрут и таблицы провайдера
  • Настроить 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 на одном сервере — простой способ изолировать сервисы по сетевым адресам и запускать несколько приложений, слушающих одинаковые порты. Необходимо корректно получить адреса у провайдера, настроить их в системе и привязать контейнеры через синтаксис IP:HOST_PORT:CONTAINER_PORT. Альтернатива — использовать обратный прокси или сетевые плагины Docker.

Важно: всегда проверяйте прослушиваемые порты и политики брандмауэра перед тем, как открывать сервисы в публичный интернет.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро