Docker: подключение изнутри контейнера к localhost: порт отказано - PullRequest
0 голосов
/ 15 мая 2018

Я пытаюсь застраховать соединение между различными контейнерами и адресом локального хоста ( 127.0.0.1 ), используемым с портом 8040 . (Мой контейнер веб-приложения запускается с использованием этого порта .)

 root@a70b20fbda00:~# curl -v http://127.0.0.1
 * Rebuilt URL to: http://127.0.0.1/
 * Hostname was NOT found in DNS cache
 *   Trying 127.0.0.1...
 * connect to 127.0.0.1 port 80 failed: Connection refused
 * Failed to connect to 127.0.0.1 port 80: Connection refused
 * Closing connection 0
 curl: (7) Failed to connect to 127.0.0.1 port 80: Connection refused

Это то, что я получаю, когда хочу подключиться к localhost изнутри контейнера

root@a70b20fbda00:~# curl -v http://127.0.0.1:8040
* Rebuilt URL to: http://127.0.0.1:8040/
* Hostname was NOT found in DNS cache
*   Trying 127.0.0.1...
* connect to 127.0.0.1 port 8040 failed: Connection refused
* Failed to connect to 127.0.0.1 port 8040: Connection refused
* Closing connection 0
curl: (7) Failed to connect to 127.0.0.1 port 8040: Connection refused

О iptables в каждом контейнере:

 root@a70b20fbda00:~# iptables
 bash: iptables: command not found

Связь между контейнером хорошая

root@635114ca18b7:~# ping 172.17.0.1
PING 172.17.0.1 (172.17.0.1) 56(84) bytes of data.
64 bytes from 172.17.0.1: icmp_seq=1 ttl=64 time=0.061 ms
64 bytes from 172.17.0.1: icmp_seq=2 ttl=64 time=0.253 ms
--- 172.17.0.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
root@635114ca18b7:~# ping 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.080 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.100 ms
--- 127.0.0.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
root@635114ca18b7:~# ping 172.17.0.3
PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data.
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.149 ms
64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.180 ms
--- 172.17.0.3 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.149/0.164/0.180/0.020 ms

Пинг 127.0.0.1:8040

root@635114ca18b7:~# ping 127.0.01:8040
ping: unknown host 127.0.0.1:8040

Что мне нужно сделать в этом случае?

Итак, глобальное изображение, что есть два контейнера,

  • Первый контейнер содержит сервер tomcat , который развертывает мое веб-приложение , и он отлично работает.
  • Второй - это контейнер, который необходимо подключить к веб-приложению URL. http://127.0.0.1:8040/my_app

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Судя по предоставленной информации, похоже, что есть два контейнера.Если эти два контейнера запускаются Docker без --net=host, то каждый из них получает два разных IP-адреса.Скажем, ваш первый контейнер получил 172.17.0.2, а второй 172.17.0.3.

В этом сценарии каждый контейнер получает свой собственный сетевой стек.Так что 127.0.0.1 относится к своему собственному сетевому стеку, а не к тому же.

Как указал @kakabali, возможно запускать контейнеры с сетью хоста, разделяя сетевой стек хоста.

Один из других вариантов - использовать фактический IP-адрес первого контейнера во втором.

second-container# curl http://172.17.0.2

Или другой вариант - запускать второй контейнер в качестве сообщника /Контейнер с коляской, разделяющий сетевой стек первого.

docker run --net=container:${ID_OF_FIRST_CONTAINER} ${IMAGE_SECOND}:${IMAGE_TAG_SECOND}

Или, если вы правильно используете links: docker run --name web -itd ${IMAGE_FIRST}:${TAG_FIRST} docker run --link web -itd ${IMAGE_SECOND}:${TAG_SECOND}

Примечание: докер --linkфункция устарела.

Другой вариант - использовать платформы управления контейнерами, которые автоматически позаботятся об обнаружении службы.

PS: Вы не можете пропинговать IP-адрес на другом порту.Для получения дополнительной информации нажмите здесь .

0 голосов
/ 15 мая 2018

вам нужно будет использовать docker run --network host IMAGE:TAG для достижения желаемого соединения

далее читайте здесь

пример: -

docker run --network host --name CONTAINER1 IMAGE:tag

docker run --network host --name CONTAINER2 IMAGE:tag

внутри контейнера - CONTAINER2 вы сможете получить доступ к другому контейнеру в качестве хоста CONTAINER1

А для доступа к услуге вам нужно будет сделать КОНТЕЙНЕР:

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