У меня есть докер-контейнер с Дженкинсом. Как часть процесса сборки, мне нужно получить доступ к веб-серверу, который работает локально на хост-компьютере. Есть ли способ, с помощью которого хост-веб-сервер (который можно настроить для работы на порте) может быть открыт для контейнера jenkins?
РЕДАКТИРОВАТЬ: я работаю Docker изначально на машине Linux.
ОБНОВИТЬ:
В дополнение к ответу @larsks ниже, чтобы получить IP-адрес Host IP от хост-машины, я делаю следующее:
ip addr show docker0 | grep -Po 'inet \K[\d.]+'
docker
docker-container
Три Нгуен
источник
источник
curl: (7) Failed to connect to 172.17.1.78 port 7000: No route to host
Ответы:
При исходном запуске Docker в Linux вы можете получить доступ к службам хоста, используя IP-адрес
docker0
интерфейса. Изнутри контейнера это будет ваш маршрут по умолчанию.Например, в моей системе:
И внутри контейнера:
Достаточно легко извлечь этот IP-адрес с помощью простого сценария оболочки:
Возможно, вам придется изменить
iptables
правила на вашем хосте, чтобы разрешить соединения из контейнеров Docker. Нечто подобное сделает свое дело:Это позволит получить доступ к любым портам на хосте из контейнеров Docker. Обратите внимание, что:
Правила iptables упорядочены, и это правило может или не может делать правильные вещи в зависимости от того, какие другие правила стоят перед ним.
вы сможете получить доступ только к хост-службам, которые либо (а) прослушивают
INADDR_ANY
(то есть 0.0.0.0), либо явно прослушиваютdocker0
интерфейс.источник
docker.for.mac.localhost
вместоlocalhost
или127.0.0.1
. Вот док .Для macOS и Windows
Docker v 18.03 и выше (с 21 марта 2018 г.)
Используйте свой внутренний IP-адрес или подключитесь к специальному DNS-имени,
host.docker.internal
которое будет преобразовано во внутренний IP-адрес, используемый хостом.Ожидается поддержка Linux https://github.com/docker/for-linux/issues/264
MacOS с более ранними версиями Docker
Докер для Mac v 17.12 до 18.02
То же, что и выше, но используйте
docker.for.mac.host.internal
вместо этого.Докер для Mac с 17.06 по 17.11
То же, что и выше, но используйте
docker.for.mac.localhost
вместо этого.Докер для Mac 17.05 и ниже
Чтобы получить доступ к хост-машине из док-контейнера, вы должны прикрепить псевдоним IP к вашему сетевому интерфейсу. Вы можете связать любой IP-адрес, который хотите, просто убедитесь, что вы не используете его ни с чем другим.
sudo ifconfig lo0 alias 123.123.123.123/24
Затем убедитесь, что ваш сервер прослушивает IP-адрес, упомянутый выше или
0.0.0.0
. Если он прослушивает localhost,127.0.0.1
он не примет соединение.Затем просто укажите свой док-контейнер на этот IP, и вы получите доступ к хост-машине!
Для проверки вы можете запустить что-то вроде
curl -X GET 123.123.123.123:3000
внутри контейнера.Псевдоним будет сбрасываться при каждой перезагрузке, поэтому при необходимости создайте сценарий запуска.
Решение и дополнительная документация здесь: https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds
источник
docker.for.mac.localhost
которое будет преобразовываться во внутренний IP-адрес, используемый хостом! ... Я проверил это, и это действительно работает! :)ip route show | awk '/default/ {print $3}'
давать один IP, аdocker.for.mac.localhost
другой.host.docker.internal
docs.docker.com/docker-for-mac/networking/…host.docker.internal
в контейнере Docker и настроить127.0.0.1 host.docker.internal
в файле hosts .Используйте
--net="host"
в вашейdocker run
команде, тогдаlocalhost
в вашем док-контейнере будет указывать на ваш докер хост.источник
network_mode: "host"
Решение с docker-compose: для доступа к сервису на основе хоста вы можете использовать
network_mode
параметр https://docs.docker.com/compose/compose-file/#network_modeРЕДАКТИРОВАТЬ 2020-04-27: рекомендуется для использования только в местной среде разработки.
источник
В настоящее время самый простой способ сделать это на Mac и Windows - использовать хост
host.docker.internal
, который разрешает IP-адрес хост-машины. К сожалению, он не работает на Linux (по состоянию на апрель 2018 года).источник
Я создал докер-контейнер для выполнения именно этого https://github.com/qoomon/docker-host
Затем вы можете просто использовать имя контейнера dns для доступа к хост-системе, например
curl http://dockerhost:9200
источник
Мы обнаружили, что более простым решением для всего этого сетевого мусора является использование доменного сокета для службы. Если вы все равно пытаетесь подключиться к хосту, просто смонтируйте сокет как том, и вы уже в пути. Для postgresql это было так просто:
Затем мы просто настраиваем соединение с нашей базой данных, чтобы использовать сокет вместо сети. Буквально так просто.
источник
Я исследовал различные решения и нашел это наименее хакерское решение:
extra_hosts
директиве.Единственным недостатком является то, что если у вас есть несколько сетей или проектов, вы должны убедиться, что их диапазон IP-адресов не конфликтует.
Вот пример Docker Compose:
Затем вы можете получить доступ к портам на хосте из контейнера, используя имя хоста "dockerhost".
источник
Для систем Linux вы можете - начиная с основной версии
20.04
- теперь также общаться с хостом черезhost.docker.internal
. Это не будет работать автоматически , но вам нужно указать следующий флаг запуска:Видеть
источник
Вы можете получить доступ к локальному веб-серверу, который работает на вашем хост-компьютере, двумя способами.
Подход 1 с публичным IP
Используйте общедоступный IP-адрес хост-машины для доступа к веб-серверу в контейнере док-станции Jenkins.
Подход 2 с хост-сетью
Используйте «--net host», чтобы добавить докер-контейнер Jenkins в сетевой стек хоста. Контейнеры, которые развернуты в стеке хоста, имеют полный доступ к интерфейсу хоста. Вы можете получить доступ к локальному веб-серверу в Docker-контейнере с частным IP-адресом хост-машины.
Запустите контейнер с хост-сетью
Eg: docker run --net host -it ubuntu
и запуститеifconfig
список всех доступных сетевых IP-адресов, доступных из док-контейнера.Например: я запустил сервер nginx на своем локальном хост-компьютере и смог получить доступ к URL-адресам веб-сайта nginx из док-контейнера Ubuntu.
docker run --net host -it ubuntu
Доступ к веб-серверу Nginx (работающему на локальном хосте) из док-контейнера Ubuntu с IP-адресом частной сети.
источник
Для
docker-compose
использования моста сети для создания частной сети между контейнерами Принятым решения с использованиемdocker0
не работает , потому что интерфейс выхода из контейнеров не ,docker0
но вместо этого он случайно сгенерированный идентификатора интерфейса, такие как:К сожалению, этот случайный идентификатор не предсказуем и будет меняться каждый раз, когда compose должен воссоздавать сеть (например, при перезагрузке хоста). Мое решение состоит в том, чтобы создать частную сеть в известной подсети и настроить
iptables
для принятия этого диапазона:Создать файл сниппета:
Вы можете изменить подсеть, если этого требует ваша среда. Я произвольно выбрал
192.168.32.0/20
с помощьюdocker network inspect
чтобы увидеть, что было создано по умолчанию.Настройте
iptables
на хосте, чтобы разрешить частную подсеть в качестве источника:Это самое простое из возможных
iptables
правил. Вы можете добавить другие ограничения, например, по порту назначения. Не забывайте сохранять свои правила iptables, когда вы счастливы, что они работают.Преимущество этого подхода в том, что он повторяется и, следовательно, автоматизирован. Я использую анзибль - х
template
модуль для развертывания моего файла с созданием сообщения подстановки переменной , а затем использоватьiptables
иshell
модули для настройки и сохраняются правила брандмауэра, соответственно.источник
iptables -A INPUT -i docker0 -j ACCEPT
, но это не помогло мне, в то время какiptables -I INPUT 1 -s 192.168.32.0/20 -j ACCEPT
предложенные здесь решили мою проблему.Это старый вопрос, на который было дано много ответов, но ни один из них не соответствовал моему контексту. В моем случае контейнеры очень скудны и не содержат никаких сетевых инструментов, необходимых для извлечения IP-адреса хоста из контейнера.
Кроме того, в этом
--net="host"
подходе используется очень грубый подход, который неприменим, когда требуется иметь хорошо изолированную конфигурацию сети с несколькими контейнерами.Итак, мой подход заключается в том, чтобы извлечь адрес хоста на стороне хоста, а затем передать его в контейнер с
--add-host
параметром:или, сохраните IP-адрес хоста в переменной среды и используйте переменную позже:
Затем
docker-host
он добавляется в файл хостов контейнера, и вы можете использовать его в строках подключения к базе данных или URL-адресах API.источник
Когда у вас есть два уже созданных образа Docker, и вы хотите установить два контейнера для связи друг с другом.
Для этого вы можете удобно запускать каждый контейнер со своим собственным именем - и использовать флаг --link для обеспечения связи между ними. Вы не получаете это во время сборки докера, хотя.
Когда вы находитесь в сценарии, как я, и это ваш
Это ломается, когда вы пытаетесь
и вы застреваете на "curl / wget", не возвращая "route to host".
Причина заключается в безопасности, установленной докером, который по умолчанию запрещает связь между контейнером к хосту или другим контейнерам, работающим на вашем хосте. Должен сказать, что для меня это было довольно неожиданным, вы ожидаете, что экосистема докеров, работающих на локальной машине, просто безупречно может получить доступ друг к другу без особых препятствий.
Объяснение этого подробно описано в следующей документации.
http://www.dedoimedo.com/computers/docker-networking.html
Предлагаются два быстрых обходных пути, которые помогут вам двигаться, понизив безопасность сети.
Надеюсь, эта информация поможет вам.
источник
--link
настоящее время устарелаДля меня (Windows 10, Docker Engine v19.03.8) это была смесь https://stackoverflow.com/a/43541732/7924573 и https://stackoverflow.com/a/50866007/7924573 .
например: LOGGER_URL = " http: //host.docker.internal: 8085 / log "
version: '3.7' services: server: build: . ports: - "5000:5000" network_mode: bridge
или альтернативно: используйте,--net="bridge"
если вы не используете docker-compose (аналогично https://stackoverflow.com/a/48806927/7924573 )Как указывалось в предыдущих ответах: это следует использовать только в локальной среде разработки .
Для получения дополнительной информации читайте: https://docs.docker.com/compose/compose-file/#network_mode и https://docs.docker.com/docker-for-windows/networking/#use-cases-and-workarounds
источник