Теперь, когда некоторые из моих серверных приложений упакованы в контейнеры Docker, я пытаюсь развернуть их на своих производственных серверах. Мои контейнеры должны быть доступны по IPv4 и IPv6 одновременно. Обычно это не проблема: если вы сопоставляете порты контейнера с портами хоста, например через docker-compose Docker будет использовать доступные адреса IPv6 и IPv4.
Моя проблема: на моем сервере не только один адрес IPv4 и IPv6, но и несколько. Контейнер моего приложения должен использовать только один конкретный адрес IPv4 и один конкретный IPv6-адрес хоста. Вы можете привязать порт контейнера к IPv4-адресу, используя следующий синтаксис docker-compose:
ports:
- "127.0.0.1:8001:8001"
(Видеть https://docs.docker.com/compose/compose-file/#ports)
К сожалению, я не смог найти никакой информации, как это сделать с адресами IPv6. Есть ли способ привязать порт контейнера к одному, конкретный IPv6-адрес на моем хосте Docker?
Начиная с версии 1.15 docker-compose (возможно, 1.14) теперь вы можете использовать дополнительные двоеточия в определении порта для IPv6:
version: '3.3'
services:
app:
image: nginx
ports:
- "::1:8080:80"
Соответствующий вопрос можно найти здесь: https://github.com/docker/compose/issues/2663
Мое решение - привязать все открытые порты контейнера к 127.0.0.1, а затем перенаправить внешние IP-соединения v4 и v6 через HAProxy на 127.0.0.1. Возможно, это не лучший способ, но решение для меня.