Процесс Docker открывает порт TCP, но в соединении отказано - PullRequest
0 голосов
/ 23 мая 2019

Как запустить простой сервер, прослушивающий порт внутри контейнера Docker?

(Если это имеет значение, то это хост MacOS X 10.13.6.)

Когда я запускаю простой HTTP-сервер:

python3 -m http.server 8001

процесс запускается правильно, и он правильно прослушивает этот порт (подтверждается telnet localhost 8001).

Когда я запускаю контейнер Docker, он также правильно запускает процесс, но теперь в соединении отказано.

Веб-апи / Dockerfile:

FROM python:3.7
CMD python3 -m http.server 8001

докер-compose.yaml:

version: '3'
services:
  web-api:
    hostname: web-api
    build:
      context: ./web-api/
      dockerfile: Dockerfile
    expose:
      - "8001"
    ports:
      - "8001:8001"
    networks:
      - api_network
networks:
  api_network:
    driver: bridge

Когда я запускаю контейнер (ы), он запускает HTTP-сервер:

$ docker-compose up --detach --build
Building web-api
[…]

$ docker ps
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                    NAMES
1db4cd1daaa4        ipsum_web-api        "/bin/sh -c 'python3…"   8 minutes ago       Up 8 minutes        0.0.0.0:8001->8001/tcp   ipsum_web-api_1

$ docker-machine ssh lorem

docker@lorem:~$ ps -ef | grep http.server
root     12883 12829  0 04:40 ?        00:00:00 python3 -m http.server 8001

docker@lorem:~$ telnet localhost 8001
[connects successfully]
^D

docker@lorem:~$ exit

$ telnet localhost 8001
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
telnet: connect to address 127.0.0.1: Connection refused
telnet: Unable to connect to remote host

Что настроено здесь неправильно, так что сервер работает внутри контейнера Docker; но я получаю Отказ в соединении через порт 8001 при подключении из за пределами контейнера на его открытый порт?

1 Ответ

0 голосов
/ 23 мая 2019

Попробуйте telnet lorem 8001.

Ваш контейнер python открыт для порта 8001 на хосте докера, который вы используете в ssh (lorem).

Когда вы запускаете команды docker, docker-compose или docker-machine, он использует значение DOCKER_HOST, чтобы выяснить, к какому хосту подключаться. Я предполагаю, что ваш DOCKER_HOST имеет тот же ip, что и lorem.

...