Тайм-аут при доступе к другим сервисам Docker в контейнере Docker - PullRequest
0 голосов
/ 04 сентября 2018

У меня на хосте работают 2 док-контейнера, web1 и web2. Контейнер web1 отображает порт 8080 на порт 18080 хоста, а web2 отображает порт 8080 на порт 28080 хоста. IP-адрес хоста - 192.168.20.111 (да, это локальная сеть). Я могу получить доступ к 192.168.20.111:18080 и 192.168.20.111:28080 с других машин в той же локальной сети.

Когда я пытался получить доступ к 192.168.20.111:18080 (curl 192.168.20.111:18080) или 192.168.20.111:28080 из контейнера web1 / web2, я получил ошибку тайм-аута.

Однако к серверу Apache, работающему через порт 8080 хоста, можно получить доступ 192.168.20.111:8080 из контейнера web1 / web2, что означает, что маршрут от контейнера к хосту свободен.

Итак, мой вопрос: почему возникает ошибка тайм-аута и как получить доступ к 192.168.20.111:18080 из контейнера Docker?

Это файл docker-compose, который я использовал для запуска web2 (web1 почти такой же):

version: '2' 
services:
    web:
        build: .
        ports:
          - "28080:8080"
        expose:
          - "8080"
        environment:
          - TALENTS_AUTH_HOST=192.168.20.111
          - TALENTS_AUTH_PORT=18080
          - TALENTS_ANALYSIS_HOST=192.168.20.111
          - TALENTS_ANALYSIS_PORT=18082

И это вывод curl:

root@ea49393e56a4:/# curl -v http://192.168.20.111:28080
* Rebuilt URL to: http://192.168.20.111:28080/
*   Trying 192.168.20.111...
* TCP_NODELAY set
* connect to 192.168.20.111 port 28080 failed: Connection timed out
* Failed to connect to 192.168.20.111 port 28080: Connection timed out
* Closing connection 0
curl: (7) Failed to connect to 192.168.20.111 port 28080: Connection timed out
root@ea49393e56a4:/# 

Это ip-маршрут контейнера web2:

root@ea49393e56a4:/# ip route
default via 172.25.0.1 dev eth0 
172.25.0.0/16 dev eth0 proto kernel scope link src 172.25.0.2 
root@ea49393e56a4:/# 

Это вывод curl с использованием шлюза ip:

root@ea49393e56a4:/# curl -v http://172.25.0.1:28080
* Rebuilt URL to: http://172.25.0.1:28080/
*   Trying 172.25.0.1...
* TCP_NODELAY set
* connect to 172.25.0.1 port 28080 failed: Connection timed out
* Failed to connect to 172.25.0.1 port 28080: Connection timed out
* Closing connection 0
curl: (7) Failed to connect to 172.25.0.1 port 28080: Connection timed out
root@ea49393e56a4:/# 

И, кстати, хост-машина (192.168.20.111) - это виртуальная машина VirtualBox с Ubuntu-16.04, размещенная на рабочем столе Windows-10 с использованием мостовой сети для подключения к локальной сети.

1 Ответ

0 голосов
/ 04 сентября 2018

Большое спасибо @ atline

Проверка IP-адреса хоста изнутри контейнера в порядке:

root@ea49393e56a4:/# ping 192.168.20.111
PING 192.168.20.111 (192.168.20.111) 56(84) bytes of data.
64 bytes from 192.168.20.111: icmp_seq=1 ttl=64 time=0.046 ms
64 bytes from 192.168.20.111: icmp_seq=2 ttl=64 time=0.038 ms
64 bytes from 192.168.20.111: icmp_seq=3 ttl=64 time=0.036 ms
64 bytes from 192.168.20.111: icmp_seq=4 ttl=64 time=0.036 ms
64 bytes from 192.168.20.111: icmp_seq=5 ttl=64 time=0.036 ms
64 bytes from 192.168.20.111: icmp_seq=6 ttl=64 time=0.039 ms
64 bytes from 192.168.20.111: icmp_seq=7 ttl=64 time=0.038 ms
^C
--- 192.168.20.111 ping statistics ---
7 packets transmitted, 7 received, 0% packet loss, time 6000ms
rtt min/avg/max/mdev = 0.036/0.038/0.046/0.006 ms

, что означает, что маршрут свободен. Как подсказывает @atline, я останавливаю ufw на хосте с помощью «sudo service ufw stop», тогда все в порядке.

Полагаю, проблема в том, что область действия ufw разрешает запросы локальной сети, но контейнер находится в подсети "172.25.0.0/16", а не в той же локальной сети, что и хост (192.168.0.0/16), поэтому запрос был заблокирован UFW.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...