Назад | Перейти на главную страницу

Перенаправлять соединения из контейнера докеров на конкретный порт на локальный интерфейс на хосте

Я пытаюсь запускать службы в контейнерах внутри облачного провайдера. Я хотел бы, чтобы контейнерные приложения аутентифицировались на локальном сервере LDAP, который (в настоящее время) доступен через туннель SSH в облако. Туннель доступен на хост-машине докера на 127.0.0.1:6636.

Можно ли получить доступ к контейнерам 127.0.0.1:6636 на хост-машине, например через какую-то конфигурацию прокси или iptables?

Я могу заставить работать туннель, если установлю GatewayPorts=yes в хозяйской sshd_config и использовать docker run --add-host добавить хозяина docker0 IP в /etc/hosts в контейнере, но это означает, что туннель доступен на всех интерфейсах. Я предположительно могу заблокировать доступ к туннелю к docker0 интерфейс, но я бы предпочел, чтобы туннель был только на интерфейсе обратной связи.

Я не хочу использовать --net=host, потому что я хочу использовать связывание контейнеров.

Cloud                    |
                         |
+------------------+     |      +--------+     +----------+
| Host      Tunnel |     |      | Tunnel |     |   Tunnel |
|                O-------------------------------O Target |
| +-----------+  | |     |      |  Host  |     +----------+
| | Container |--+ |     |      +--------+
| +-----------+    |     |
+------------------+     |      Premises
                         |

Вы можете передать IP-адрес интерфейса docker0 вашего хоста в качестве переменной среды и подключиться к серверу LDAP. Например, на хосте:

$ ip addr show docker0
5: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
inet 10.1.42.1/16 scope global docker0
   valid_lft forever preferred_lft forever
inet6 fe80::60e4:ffff:fe97:1308/64 scope link 
   valid_lft forever preferred_lft forever
$ DOCKERADDR=$(ip addr show docker0 | grep inet\ | awk '{print $2}' | cut -d/ -f1)
$ docker run -it -e DOCKERADDR=${DOCKERADDR} image 

Внутри контейнера вы можете подключиться к $ {DOCKERADDR}: 6636

примечание: на coreos у вас уже есть эти переменные в вашей среде, если вы . /etc/environment: COREOS_PUBLIC_IPV4 и COREOS_PRIVATE_IPV4