Попробую разоблачить порт докера - PullRequest
0 голосов
/ 21 июня 2019

Я застрял на сопоставлении портов в Docker.

Я хочу сопоставить порт 8090 на внешней стороне контейнера с портом 80 на внутренней стороне контейнера.

Вотконтейнер работает:

ea41c430105d        tag-xx   "/usr/local/openrest…"   4 minutes ago     Up 4 minutes          8090/tcp, 0.0.0.0:8090->80/tcp     web

Обратите внимание, что он говорит, что порт 8090 сопоставлен с портом 80.

Теперь внутри другого контейнера я делаю

curl web                                                                                                                                

Я получаю 401 ответ.Что означает, что контейнер отвечает.Пока все хорошо.

Но когда я делаю curl web:8090, я получаю:

curl: (7) Failed to connect to web port 8090: Connection refused

Почему у меня не работает сопоставление портов?

Спасибо

PS Я знаю, что конкретно мой контейнер отвечает на curl web 401, потому что, когда я останавливаюсь docker stop web и снова curl web, я получаю could not resolve host: web.

Ответы [ 3 ]

0 голосов
/ 21 июня 2019

Docker-контейнеры, если не указано иное, подключаются к мосту по умолчанию сети.Эта мостовая сеть по умолчанию не поддерживает автоматическое разрешение DNS между контейнерами.Похоже, вы, скорее всего, находитесь в мостовой сети по умолчанию.Однако в мостовой сети по умолчанию вы можете подключиться, используя IP-адрес контейнера, который можно узнать с помощью следующей команды

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container name>

Итак, curl <IP Address of web container>:8090 должно работать.

Этовсегда лучше создать определяемую пользователем мостовую сеть и присоединить контейнеры к этой сети.В пользовательской мостовой сети подключенные контейнеры открывают свои порты друг для друга, а не для внешнего мира.Пользовательская мостовая сеть также поддерживает автоматическое разрешение DNS, и вы можете ссылаться на имя контейнера вместо IP-адреса.Вы можете попробовать следующие команды, чтобы создать пользовательскую мостовую сеть и присоединить к ней ваши контейнеры.

docker network create --driver bridge my-net
docker attach web
docker attach <other container name>

Теперь из другого контейнера вы сможете запускать curl в контейнере 'web'.

0 голосов
/ 22 июня 2019

Вы можете создать сеть для соединения между контейнерами.Или вы можете использовать --link:

Docker run --name container1 -p 80: ????-d образ (выставить на порт 80)

запуск Docker --name container2 - links lcontainer1: container1

и внутри container2 вы можете использовать:

curl lcontainer1

Надеюсь, это поможет

0 голосов
/ 21 июня 2019

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

с хоста:

  • curl localhost:8090 подключится к вашему контейнеру
  • curl localhost:80 не будет подключаться к вашему контейнеру, поскольку порт не опубликован

Из другого контейнера в той же сети

  • curl web будет работать
  • curl web:8090 не будет работать, потому что единственным портом, доступным и прослушивающим для веб-службы, является 80.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...