Задать вопрос
hostadmin
@hostadmin

Как группу контейнеров, в docker-compose, связать с одним из внешних IP хоста?

Есть классическая связка контейнеров nginx/php-fpm/mariadb/postfix, настроенных в docker-compose. Так вот, стоит задача связать эту группу с конкретным внешний IP хостовой машины, чтобы IP был связан не только на вход, но и на "выход".
NGINX сейчас настроен просто:
ports: 
               - ext_ip:80:80
               - ext_ip:443:443

Всё работает. Но вот если из скрипта запросить что-нибудь из интернета или postfix'ом отправить письмо, то ip-источником будет основной ip хоста, а нужно, чтобы был указан дополнительный ip хоста.

Понимаю, что надо настроить сеть в docker-compose, но не понимаю как именно. Все примеры из гугла предлагают вариант со статическими ip самих контейнеров, а мне нужно именно ip хоста.
  • Вопрос задан
  • 704 просмотра
Подписаться 2 Средний 3 комментария
Решения вопроса 1
hostadmin
@hostadmin Автор вопроса
Короче решение нашёл такое.
Я использую ipv6, поэтому есть свои нюансы. Версия docker-compose должна быть из серии 2.x, т.к. в версии 3 еще не доступна настройка enable_ipv6. Так же нужно добавить контейнер robbertkl/ipv6nat, помогающий с работой ipv6.
___IPv6___ - ваш внешний ip v6
___IPv4___ - ваш внешний ip v4
В docker-compose.yml,:
version: '2.4'
services:
#...
  ipv6nat:
    container_name: ipv6nat
    restart: always
    image: robbertkl/ipv6nat
    privileged: true
    network_mode: host
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - /lib/modules:/lib/modules:ro

networks:
  default:
    driver: bridge
    driver_opts:
      com.docker.network.bridge.host_binding_ipv4: "___IPv4___"
      com.docker.network.bridge.enable_ip_masquerade: "false"
      com.docker.network.bridge.host_binding_ipv6: "___IPv6___"
    enable_ipv6: true
    ipam:
      driver: default
      config:
#наши ip, которые будут выдаваться контейнерам, указанным внутри docker-compose
      - subnet: 172.16.238.0/24
      - subnet: 2001:3984:3989::/64

Далее в iptables (и ip6tables) нужно прописать следующие правила:
sudo iptables -D -t nat -A POSTROUTING -s 172.16.238.0/16 ! -o __NETWORKNAME__ -j SNAT --to-source ___IPv4___
sudo ip6tables -t nat -A POSTROUTING -s 2001:3984:3989::/64 ! -o __NETWORKNAME__ -j SNAT --to-source ___IPv6___

Где __NETWORKNAME__ это название сети, которую создает docker-compose при запуске. По умолчанию она имеет вид %username%_default

ПС. Не забываем, что после перезагрузки хоста, правила iptables пропадут, поэтому нужно предусмотреть их внесение при загрузке хоста.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы