Как Docker-контейнер в 2-х подсетях может получить доступ к Интернету?(используя docker-compose) - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть контейнер с 2 подсетями:

  • одна - подсеть обратного прокси
  • вторая - внутренняя подсеть для различных контейнеров этого проекта

Контейнеру требуется доступ к внешнему SMTP-серверу (на mailgun.com), но, похоже, с помощью docker-compose вы можете поместить контейнер в одну или несколько подсетей и предоставить ему доступ к сети хоста.в то же время.

Есть ли способ, позволяющий этому контейнеру инициировать соединения с внешним миром?

и, если нет, какие общие обходные пути используются?(например, добавление дополнительного IP-адреса в контейнер, который будет находиться в сети хоста и т. д.)

Это файл составления Docker:

version: '2.3'

services:

  keycloak:
    container_name: keycloak
    image: jboss/keycloak
    restart: unless-stopped
    volumes:
      - '/appdata/keycloak:/opt/jboss/keycloak/standalone/data'
    expose:
      - 8080
    external_links:
      - auth
    networks:
      - default
      - nginx
    environment:
      KEYCLOAK_USER: XXXX
      KEYCLOAK_PASSWORD: XXXX
      PROXY_ADDRESS_FORWARDING: 'true'
      ES_JAVA_OPTS: '-Xms512m -Xmx512m'
      VIRTUAL_HOST: auth.XXXX.com
      VIRTUAL_PORT: 80
      LETSENCRYPT_HOST: auth.XXXX.com
      LETSENTRYPT_EMAIL: admin@XXXX.com


networks:
  default:
    external:
      name: app-network
  nginx:
    external:
      name: nginx-proxy

Сети следующие:

$ dk network ls
NETWORK ID          NAME                DRIVER              SCOPE
caba49ae8b1c        bridge              bridge              local
2b311986a6f6        app-network         bridge              local
67f70f82aea2        host                host                local
9e0e2fe50385        nginx-proxy         bridge              local
dab9f171e37f        none                null                local

и информация о сети nginx-proxy:

$ dk network inspect nginx-proxy
[
{
    "Name": "nginx-proxy",
    "Id": "9e0e2fe503857c5bc532032afb6646598ee0a08e834f4bd89b87b35db1739dae",
    "Created": "2019-02-18T10:16:38.949628821Z",
    "Scope": "local",
    "Driver": "bridge",
    "EnableIPv6": false,
    "IPAM": {
        "Driver": "default",
        "Options": {},
        "Config": [
            {
                "Subnet": "172.18.0.0/16",
                "Gateway": "172.18.0.1"
            }
        ]
    },
    "Internal": false,
    "Attachable": false,
    "Ingress": false,
    "ConfigFrom": {
        "Network": ""
    },
    "ConfigOnly": false,
    "Containers": {
        "360b49ab066853a25cd739a4c1464a9ac25fe56132c596ce48a5f01465d07d12": {
            "Name": "keycloak",
            "EndpointID": "271ed86cac77db76f69f6e76686abddefa871b92bb60a007eb131de4e6a8cb53",
            "MacAddress": "02:42:ac:12:00:04",
            "IPv4Address": "172.18.0.4/16",
            "IPv6Address": ""
        },
        "379dfe83d6739612c82e99f3e8ad9fcdfe5ebb8cdc5d780e37a3212a3bf6c11b": {
            "Name": "nginx-proxy",
            "EndpointID": "0fcf186c6785dd585b677ccc98fa68cc9bc66c4ae02d086155afd82c7c465fef",
            "MacAddress": "02:42:ac:12:00:03",
            "IPv4Address": "172.18.0.3/16",
            "IPv6Address": ""
        },
        "4c944078bcb1cca2647be30c516b8fa70b45293203b355f5d5e00b800ad9a0d4": {
            "Name": "adminmongo",
            "EndpointID": "65f1a7a0f0bcef37ba02b98be8fa1f29a8d7868162482ac0b957f73764f73ccf",
            "MacAddress": "02:42:ac:12:00:06",
            "IPv4Address": "172.18.0.6/16",
            "IPv6Address": ""
        },
        "671cc99775e09077edc72617836fa563932675800cb938397597e17d521c53fe": {
            "Name": "portainer",
            "EndpointID": "950e4b5dcd5ba2a13acba37f50e315483123d7da673c8feac9a0f8d6f8b9eb2b",
            "MacAddress": "02:42:ac:12:00:02",
            "IPv4Address": "172.18.0.2/16",
            "IPv6Address": ""
        },
        "90a98111cbdebe76920ac2ebc50dafa5ea77eba9f42197216fcd57bad9e0516e": {
            "Name": "kibana",
            "EndpointID": "fe1768274eec9c02c28c74be0104326052b9b9a9c98d475015cd80fba82ec45d",
            "MacAddress": "02:42:ac:12:00:05",
            "IPv4Address": "172.18.0.5/16",
            "IPv6Address": ""
        }
    },
    "Options": {},
    "Labels": {}
}
]

Обновление:

Следующий тест был выполнен для проверки решения, предложенного lbndev:

была создана тестовая сеть:

# docker network create \
       -o "com.docker.network.bridge.enable_icc"="true" \
       -o "com.docker.network.bridge.enable_ip_masquerade"="true" \
       -o "com.docker.network.bridge.host_binding_ipv4"="0.0.0.0" \
       -o"com.docker.network.driver.mtu"="1500" \
       test_network
e21057cf83eec70e9cfeed459d79521fb57e9f08477b729a8c8880ea83891ed9

мы можем отобразить содержимое:

# docker inspect test_network
[
{
    "Name": "test_network",
    "Id": "e21057cf83eec70e9cfeed459d79521fb57e9f08477b729a8c8880ea83891ed9",
    "Created": "2019-02-24T21:52:44.678870135+01:00",
    "Scope": "local",
    "Driver": "bridge",
    "EnableIPv6": false,
    "IPAM": {
        "Driver": "default",
        "Options": {},
        "Config": [
            {
                "Subnet": "172.22.0.0/16",
                "Gateway": "172.22.0.1"
            }
        ]
    },
    "Internal": false,
    "Attachable": false,
    "Ingress": false,
    "ConfigFrom": {
        "Network": ""
    },
    "ConfigOnly": false,
    "Containers": {},
    "Options": {
        "com.docker.network.bridge.enable_icc": "true",
        "com.docker.network.bridge.enable_ip_masquerade": "true",
        "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
        "com.docker.network.driver.mtu": "1500"
    },
    "Labels": {}
}
]

Затем мы можем проверить контейнер:

Я положил содержимое наpastebin: https://pastebin.com/5bJ7A9Yp, поскольку он достаточно велик и сделает этот пост нечитабельным.

и тестирование:

# docker exec -it 5d09230158dd sh
sh-4.2$ ping 1.1.1.1
PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data.
^C
--- 1.1.1.1 ping statistics ---
11 packets transmitted, 0 received, 100% packet loss, time 10006ms

Итак, мы не смогли заставить это решение работать.

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

В итоге проблема оказалась очень простой:

В файле daemon.json , в конфигурации докера, была следующая строка:

{"iptables": false, "dns": ["1.1.1.1", "1.0.0.1"]}

Это происходит из сценариев установки, которые мы использовалии мы не знали о iptables: false

Он не позволяет докеру обновлять iptables хоста;хотя мостовые сети были настроены правильно, связь с внешним миром невозможна.

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

Спасибо всем, кто пытался решить эту проблему!

0 голосов
/ 27 февраля 2019

Похоже, что в вашей мостовой сети отсутствует несколько параметров, позволяющих ей достичь внешнего мира.

Попробуйте выполнить docker network inspect bridge (мостовая сеть по умолчанию).Вы увидите это в опциях:

...
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
...

В вашей прокси-сети nginx они отсутствуют.

Вы должны удалить свою сеть и заново создать ее с этими дополнительными опциями.Начиная с документация по пользовательским мостовым сетям и docker network create создает команду :

docker network create \
      -o "com.docker.network.bridge.enable_icc"="true" \
      -o "com.docker.network.bridge.enable_ip_masquerade"="true" \
      -o "com.docker.network.bridge.host_binding_ipv4"="0.0.0.0" \
      -o"com.docker.network.driver.mtu"="1500" \
      nginx-proxy

Включение или отключение ICC зависит от вас.

То, что позволит вам связаться с вашим почтовым сервером, это ip_masquerade, который будет включен.Без этой настройки ваша физическая инфраструктура (= сетевые маршрутизаторы) должна была бы правильно маршрутизировать IP-адреса подсети сети докера (что, как я полагаю, не так).

В качестве альтернативы, вы можете настроить подсеть вашей сети докера,диапазон ip и шлюз, чтобы соответствовать тем из вашей физической сети.

...