Невозможно связаться с веб-сервером контейнера с хоста localhost - PullRequest
0 голосов
/ 03 июля 2019

При использовании Docker v 17.03.1-ce на машине Linux linint я не могу подключиться к веб-серверу контейнера (порт контейнера 5000) с моим браузером (порт localhost 9000) на хосте.

Контейнер запущен командой:

sudo docker run -d -p 9000:5000 --name myContainer imageName
  • Я начал с проверки правильности запуска сервера (фляги) в моем контейнере. Запущено.
  • Я хотел проверить, правильно ли работает сервер, поэтому в контейнере, используя curl, я отправил запрос GET на локальный хост, порт 5000. Сервер вернул веб-страницу

Итак, сервер работает, поэтому проблема лежит где-то в связи между контейнером и хостом.

Я проверил iptables, но не уверен, что с ним делать:

sudo iptables -L

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy DROP)
target     prot opt source               destination         
DOCKER-ISOLATION  all  --  anywhere             anywhere            
DOCKER     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
DOCKER     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain DOCKER (2 references)
target     prot opt source               destination         
ACCEPT     tcp  --  anywhere             172.17.0.2           tcp dpt:5000

Chain DOCKER-ISOLATION (1 references)
target     prot opt source               destination         
DROP       all  --  anywhere             anywhere            
DROP       all  --  anywhere             anywhere            
RETURN     all  --  anywhere             anywhere 

sudo iptables -t nat -L -n

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DOCKER     all  --  0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
DOCKER     all  --  0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
MASQUERADE  all  --  172.17.0.0/16        0.0.0.0/0           
MASQUERADE  all  --  172.18.0.0/16        0.0.0.0/0           
MASQUERADE  tcp  --  172.17.0.2           172.17.0.2           tcp dpt:5000

Chain DOCKER (2 references)
target     prot opt source               destination         
RETURN     all  --  0.0.0.0/0            0.0.0.0/0           
RETURN     all  --  0.0.0.0/0            0.0.0.0/0           
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:9000 to:172.17.0.2:5000

Ожидаемый результат : используя мой браузер с URL "localhost: 9000", я могу получить домашнюю страницу, отправленную из контейнера, через порт 5000.

edit : Добавление журналов Docker и PS Docker

Docker PS

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
59a20248c5b2        apptest             "python3 src/jboos..."   12 hours ago        Up 12 hours         0.0.0.0:9000->5000/tcp   jboost

Журналы sudo docker jboost

 * Serving Flask app "jboost_app" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 310-292-856
127.0.0.1 - - [03/Jul/2019 04:12:54] "GET / HTTP/1.1" 200 -

edit 2 : добавление результатов для curl localhost: 9000 на хост-компьютере Поэтому при соединении с моим веб-браузером соединение не работает, но curl выдает более конкретное сообщение:

curl localhost:9000
curl: (56) Recv failure: Connection reset by peer

1 Ответ

1 голос
/ 03 июля 2019

Я нашел решение в этом посте: https://devops.stackexchange.com/questions/3380/dockerized-flask-connection-reset-by-peer

Сеть Docker и переадресация портов работали правильно.Проблема была с моим колбой сервером.Похоже, что по умолчанию сервер настроен на прием запросов только от локального хоста.

При запуске флэш-сервера с помощью команды «run» необходимо указать host = '0.0.0.0', чтобыЛюбой IP может быть подан.

if __name__ == "__main__":
    app.run(host='0.0.0.0')
...