Порт не открыт, но все еще доступен во внутренней докерной сети - PullRequest
1 голос
/ 29 июня 2019

(У меня проблема с раскрытием порта, но он недоступен.)

В моем случае у меня есть 2 контейнера в одной сети.Одним из них является Alpine Python с приложением Python Flask.Другой - это Ubuntu 18.04.Службы инициализируются в основном так:

docker-compose.yml :

version: '3'

services:
  pythonflask:
    build: someDockerfile # from python:3.6-alpine
    restart: unless-stopped

  ubuntucontainer:
    build: someOtherDockerfile #from ubuntu:18.04
    depends_on:
      - pythonflask
    restart: unless-stopped

Приложение Python Flask работает на порту 5000. Обратите внимание на отсутствие expose: - 5000 в файле docker-compose.yml .Проблема в том, что я могу получить правильный ответ, когда cURLing http://pythonflask:5000 изнутри ubuntucontainer

Шаги:

$ docker exec -it ubuntucontainer /bin/bash

... и затем внутриконтейнер ...

root@ubuntucontainer:/# curl http://pythonflask:5000/

... правильно возвращает мой ответ из приложения Flask.

Однако с моего компьютера, на котором запущен Docker:

$ curl http://localhost:5000/

Невернуть что-нибудь (как и ожидалось).

Когда я тестирую разные порты, они автоматически выставляются каждый раз.Что это делает?

Ответы [ 2 ]

3 голосов
/ 29 июня 2019

Связь между контейнерами достигается путем помещения контейнеров в одну и ту же сеть докеров и обмена данными через ip и порт контейнера (а не через опубликованный порт хоста).Так что же делает тогда expose?

Expose - это документация

Expose in docker используется создателями изображений для документирования ожидаемого порта, который приложение будет прослушивать внутри контейнера.За исключением некоторых инструментов и флага в докере, который использует эту документацию метаданных, он не используется для управления доступом между контейнерами или изменения сети докера.Приложения могут быть переконфигурированы во время выполнения для прослушивания другого порта, и вы можете подключаться к портам, которые не были открыты.

Для поиска DNS между контейнерами сеть должна создаваться пользователем, а не по умолчаниюсети из докера (например, DNS не включен в сети моста по умолчанию с именем "bridge").С помощью DNS вы можете искать имя контейнера, имя службы (из файла компоновки) и любые псевдонимы сети, созданные для этого контейнера в этой сети.

Другая половина уравнения - это «публикация» в докере.Это создает отображение от хоста к контейнеру, чтобы разрешить внешний доступ.Он реализован с помощью прокси-процесса, который выполняется на хосте и пересылает новые соединения.Благодаря реализации вы можете опубликовать порт на хосте, даже если контейнер не прослушивает порт, хотя вы получите сообщение об ошибке при попытке подключения к этому порту в этом сценарии.

1 голос
/ 29 июня 2019

Отсутствие expose: ... просто означает, что нет порта, доступного из группы сервисов, которую вы определили в вашем docker-compose.yml

В используемых вами изображениях все еще есть открытые порты, которые доступны из сети, автоматически создаваемой docker-compose.

Вот почему вы достигаете одного контейнера из другого. Кроме того, каждый контейнер может быть доступен через имя службы из docker-compose.yml во внутренней сети.

У вас не должно быть доступа к флешке с вашего хоста (http://localhost:5000)

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