Как получить доступ к внутреннему IP-адресу контейнера Docker с хоста? - PullRequest
0 голосов
/ 01 января 2019

У меня на хосте Mac работает 2 контейнера докеров - контейнер 1 равен Jenkins из Docker Hub , а контейнер 2 - SonarQube из Docker Hub .У меня оба контейнера успешно работают.Я могу получить доступ к Jenkins с моего хоста, перейдя на http://localhost:8080/, и я могу получить доступ к своему SonarQube, перейдя на http://localhost:9000/.

Контейнер Jenkins был запущен так:

docker run -d -p 8080:8080 -p 50000:50000 jenkins/jenkins:latest

Контейнер SonarQube был запущен так:

docker run -d -p 9000:9000 sonarqube

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

Я получил IP-адрес каждого контейнера , выполнив это:

docker inspect --format '{{ .NetworkSettings.IPAddress }}' container_name_or_id

Это возвращает IP-адрес 172.17.0.2 для контейнера Jenkins и 172.17.0.3 для контейнера SonarQube.Но когда я пытаюсь получить доступ к контейнеру Jenkins с моего хоста, перейдя на http://172.17.0.2:8080, я получаю тайм-аут запроса.То же самое происходит, когда я пытаюсь получить доступ к контейнеру SonarQube с моего хоста, перейдя к http://172.17.0.3:9000

Это нормальное поведение?

Разве я не могу получить доступ к каждому контейнеру из моегохост по их внутреннему IP-адресу?

И как я могу проверить, что один контейнер (например, Jenkins) может обращаться к другому контейнеру (например, SonarQube) по IP-адресу?

Ответы [ 2 ]

0 голосов
/ 01 января 2019

Это нормальное поведение?Разве я не могу получить доступ к каждому контейнеру с моего хоста по их внутреннему IP-адресу?

То, что вы описываете, является нормальным поведением: вы не можете напрямую получить внутренние IP-адреса Docker из MacOSхост.См. «IP-адресация для каждого контейнера невозможна» в документации Docker для Mac .

Как проверить, что один контейнер (например, Jenkins) может получить доступ к другому контейнеру (например, SonarQube) по IP-адресу?

Это не то, что я обычно "тестирую" как таковую .Запустите оба процесса и попросите их установить нормальные (HTTP) соединения;если он работает, вы увидите соответствующие сообщения журнала, а если он не работает, вы увидите жалобы.(Получение корневой оболочки в контейнере для отправки ICMP-пакетов из одного контейнера в другой, кажется популярным вариантом, но это мало что дает.)

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

docker network create jenkinsnet
docker run --name sonarqube -d --net jenkinsnet \
  -p 9000:9000 \
  sonarqube
docker run --name jenkins -d --net jenkinsnet \
  -p 8080:8080 -p 50000:50000 \
  -e SONARQUBE_URL=http://sonarqube:9000 \
  jenkins/jenkins:latest

Итак, я явно создал сеть;запустил оба подключенных к нему контейнера;и сообщил клиентскому контейнеру (через переменную окружения), где находится серверный контейнер.Вам не нужно публиковать порты с docker run -p, чтобы достичь их таким образом;используете ли вы порт или нет, используйте порт, который прослушивает процесс сервера (номер порта секунда в опции docker run -p).

С хоста ваш единственный (портативный, надежный)) путь к контейнеру - через опубликованные порты.

0 голосов
/ 01 января 2019

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

Для вас есть несколько вариантов.

  1. Вы можете настроить http://172.17.0.3:9000 в качестве конечной точки сонара в Jenkins.
  2. Вы можетенастройте http://172.17.0.2:8000 в качестве конечной точки jenkins в сонаре.
  3. Если вы не хотите жестко кодировать выше Ips, то оба ваших контейнера могут общаться с каждым, используя Docker Default GatewayIp (172.17.0.1) и их internal порт.по сути, вы также можете настроить http://172.17.0.1.

Примечание - Изменение IP-адреса шлюза по умолчанию, если вы определите пользовательскую мостовую сеть .

https://docs.docker.com/v17.09/engine/userguide/networking/#the-default-bridge-network

https://docs.docker.com/network/network-tutorial-standalone/

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

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