Как получить доступ к порту хоста из контейнера докеров

У меня есть докер-контейнер под управлением jenkins. В рамках процесса сборки мне нужно получить доступ к веб-серверу, который запускается локально на хост-машине. Есть ли способ, которым веб-сервер хоста (который можно настроить для работы через порт) может быть открыт для контейнера jenkins?

РЕДАКТИРОВАТЬ: Я запускаю докер изначально на машине Linux.

ОБНОВИТЬ:

В дополнение к ответу @larsks ниже, чтобы получить IP-адрес IP-адреса хоста с хост-машины, я делаю следующее:

ip addr show docker0 | grep -Po 'inet \K[\d.]+'

person Tri Nguyen    schedule 09.07.2015    source источник
comment
Используя комментарий, поскольку это ужасный ответ, но я считаю, что вы обычно можете получить к нему доступ на 172.17.1.78 - если это не установка boot2docker.   -  person CashIsClay    schedule 09.07.2015
comment
@CashIsClay Я пробовал это, но ошибка по-прежнему curl: (7) Failed to connect to 172.17.1.78 port 7000: No route to host   -  person Tri Nguyen    schedule 09.07.2015
comment
Вы не указали; вы используете boot2docker или Docker изначально работает в Linux?   -  person larsks    schedule 09.07.2015
comment
@larsks извините, я только что обновил вопрос - я запускаю его изначально в Linux.   -  person Tri Nguyen    schedule 09.07.2015
comment
Возможный дубликат Как мне подключиться к локальному хосту машины из контейнера Docker?   -  person joragupra    schedule 07.06.2016
comment
Возможный дубликат Как получить IP-адрес хоста докера из контейнера докера   -  person Nick Grealy    schedule 07.11.2019
comment
Теперь для Docker Desktop в Win 10 (с контейнером Linux) host.docker.internal также работает, мне просто нужно добавить http:// перед ним для моих файлов конфигурации Java для URL-адреса. Надеюсь, это кому-то поможет.   -  person WesternGun    schedule 10.08.2020
comment
Скорее всего внутри контейнера у вас нет ip. Если это контейнер на основе Ubuntu, вы можете сделать apt-get install iproute2.   -  person Xavi Montero    schedule 09.01.2021


Ответы (16)


При запуске Docker в Linux вы можете получить доступ к службам хоста, используя IP-адрес интерфейса docker0. Изнутри контейнера это будет ваш маршрут по умолчанию.

Например, в моей системе:

$ ip addr show docker0
7: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::f4d2:49ff:fedd:28a0/64 scope link 
       valid_lft forever preferred_lft forever

А внутри контейнера:

# ip route show
default via 172.17.0.1 dev eth0 
172.17.0.0/16 dev eth0  src 172.17.0.4 

Достаточно легко извлечь этот IP-адрес с помощью простого сценария оболочки:

#!/bin/sh

hostip=$(ip route show | awk '/default/ {print $3}')
echo $hostip

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

# iptables -A INPUT -i docker0 -j ACCEPT

Это позволит получить доступ к любым портам на хосте из контейнеров Docker. Обратите внимание, что:

  • Правила iptables упорядочены, и это правило может или не может работать правильно, в зависимости от того, какие другие правила предшествуют ему.

  • вы сможете получить доступ только к службам хоста, которые либо (а) слушают INADDR_ANY (также известный как 0.0.0.0), либо явно прослушивают интерфейс docker0.


Если вы используете Docker на MacOS или Windows 18.03+, вы можете подключиться к волшебному имени хоста host.docker.internal.


Наконец, в Linux вы можете запустить свой контейнер в пространстве имен хост-сети, установив --net=host; в этом случае localhost на вашем хосте совпадает с localhost внутри контейнера, поэтому контейнерная служба будет действовать как неконтейнерные службы и будет доступна без какой-либо дополнительной настройки.

person larsks    schedule 09.07.2015
comment
У меня такая же проблема с возвратом Нет маршрута к хосту, @TriNguyen, что вы сделали после получения IP-адреса хоста, чтобы он работал? Спасибо - person mino.me; 12.01.2016
comment
@ mino.me как для вас выглядит ip хоста? не совсем уверен, почему это не сработает - person Tri Nguyen; 12.01.2016
comment
Соответствующая ссылка: добавление записей в контейнер / etc / hosts - person chronos; 22.03.2016
comment
Как насчет Docker для MAC? AFAIK нет сети docker0, доступной для Docker для MAC. В таком случае, как я могу подключиться к хосту из контейнера? - person Vijay; 27.07.2016
comment
Если вы используете Docker для MAC версии 17.06 или выше, просто используйте docker.for.mac.localhost вместо localhost или 127.0.0.1. Вот документ < / а>. - person merito; 24.11.2017
comment
Это работает, но если вы пытаетесь подключиться к такой службе, как redis, вам нужно добавить IP-адрес в команде ip addr show docker0 в привязку в redis.conf и перезапустить redis. - person James O'Brien; 01.04.2018
comment
Я использовал имя хоста своего хоста вместо получения IP-адреса (команда hostname на хосте) - person Marek F; 09.04.2019
comment
Я обнаружил один сценарий, когда это не работает должным образом: запуск Jenkins в контейнере Docker с установленным /var/run/docker.sock для создания другого контейнера из задания Jenkins (что является довольно распространенной настройкой). Сетевой адаптер docker0 не существует в контейнере Jenkins. - person Dirk; 22.08.2019
comment
Соответствующие firewall-cmd команды для CentOS: firewall-cmd --zone=internal --change-interface=docker_gwbridge && firewall-cmd --zone=internal --add-port=$MYPORT/tcp - person bekce; 12.07.2020
comment
Я обнаружил, что оба IP-адреса, то есть адрес docker0 на хосте, а также адрес шлюза по умолчанию в контейнере, могут использоваться внутри контейнера для доступа к хосту. (В этом ответе они такие же, но в моей настройке - нет.) Ожидается ли это? Если это так, было бы полезно отредактировать, чтобы прояснить это. - person David Z; 06.12.2020
comment
Любой IP-адрес хоста может использоваться для связи со службами на хосте. Идея использования адреса моста докеров заключается в том, что это единственный видимый адрес (как шлюз по умолчанию) внутри контейнера. - person larsks; 06.12.2020
comment
Скорее всего внутри контейнера у вас нет ip. Если это контейнер на основе Ubuntu, вы можете сделать apt-get install iproute2. - person Xavi Montero; 09.01.2021
comment
host.docker.internal работал у меня на Mac - person user3785966; 12.04.2021
comment
После установки команд ip dig ping и т. Д. В контейнер (службу) для тестирования я обнаружил ... Пинг всегда успешен, но попытка доступа к опубликованным портам другой службы приводит к отказу от маршрута к хосту. Однако отключение iptables, и это изменяется на Не удалось разрешить хост, и использование IP напрямую для подключения работает! Поэтому я снова включил iptables и добавил соответствующие правила ACCEPT, но мне все равно не повезло. Работа продолжается. - person anthony; 29.04.2021

Для всех платформ

Docker v 20.10 и выше (с 14 декабря 2020 г.)

В Linux добавьте --add-host=host.docker.internal:host-gateway в команду Docker, чтобы включить эту функцию. (См. Ниже конфигурацию Docker Compose.)

Используйте свой внутренний IP-адрес или подключитесь к специальному DNS-имени host.docker.internal, которое будет преобразовано во внутренний IP-адрес, используемый хостом.

Чтобы включить это в Docker Compose в Linux, добавьте следующие строки в определение контейнера:

extra_hosts:
- "host.docker.internal:host-gateway"

Для 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 версий 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

person Janne Annala    schedule 21.04.2017
comment
Я это успешно проверил. Нет необходимости отключать брандмауэр - person alvaro g; 22.05.2017
comment
Начиная с 17.06, выпуска в июне 2017 года, они рекомендуют подключаться к специальному DNS-имени только для Mac docker.for.mac.localhost, которое будет преобразовываться во внутренний IP-адрес, используемый хостом! ... Я проверил это, и он действительно работает! :) - person Kyr; 05.07.2017
comment
docker.for.mac.localhost работает нормально - за исключением случаев использования Chrome для тестирования браузера (он запрещает *.localhost обращение к хост-машине, а не к непосредственному контейнеру, согласно: github.com/docker/for-mac/issues/1837). Я обнаружил, что 192.168.65.1 работает вместо этого. - person Peter Westmacott; 25.09.2017
comment
изменен на host.docker.internal docs.docker.com/ docker-for-mac / сеть / - person Snowball; 27.03.2018
comment
host.docker.internal должен ли работать и в Ubuntu? После запуска docker run -it ubuntu:trusty bash команда root@40a5887b060d:/# ping host.docker.internal дает мне ping: unknown host host.docker.internal - person Simon Forsberg; 14.04.2018
comment
@SimonForsberg Предполагается, но, судя по всему, на данный момент он работает только в Windows и macOS. Здесь есть открытый билет github.com/docker/for-linux/issues/264 - person Janne Annala; 15.04.2018
comment
Рекомендуем использовать host.docker.internal в контейнере докеров и настроить 127.0.0.1 host.docker.internal в файле hosts. - person junlin; 19.06.2018
comment
Я бы добавил здесь комментарий @ junlin, чтобы добавить запись в /etc/hosts файл вашей хост-системы - 127.0.0.1 host.docker.internal - после того, как я добавил эту недостающую запись (и в macOS, по крайней мере, перезапустил mDNSResponder с sudo killall -HUP mDNSResponder для перезагрузки измененного файла hosts), я смог успешно подключиться к службам, работающим на моем хост-компьютере из Docker, где другие подходы не сработали! - person bluebinary; 27.06.2019
comment
host.docker.internal работа идеальна для меня! в моем случае WSL меняет IP-адрес при каждой перезагрузке: / - person Albert Hidalgo; 24.06.2021

Используйте --net="host" в своей docker run команде, тогда localhost в вашем докер-контейнере будет указывать на ваш докер-хост.

person samthebest    schedule 15.02.2018
comment
Не будет работать для тех, кто использует Dpcker для Windows / Docker для Mac, насколько я понимаю, из-за того, что контейнеры работают в виртуализированных средах: Hyper-V (Windows) / xhyve (Mac) - person ninjaboy; 09.05.2018
comment
ЭТО! Это ответ! - person user3751385; 27.09.2018
comment
Для справки: в Docker Componse network_mode: "host" - person jbarros; 09.02.2019
comment
У меня это не работает в Docker для Mac версии 19.03.1 на клиенте и сервере. Хотелось бы, чтобы это работало, но это не так. - person clay; 12.08.2019
comment
это работает для меня (к счастью, мне не нужно отказываться от системы Linux, в которой работает Docker, например, Mac или Windows), однако мне было бы интересно узнать, как я мог бы просто поделиться одним сетевым портом вместо всей сети между основной системой и контейнерной системой. - person hakre; 17.08.2019
comment
Даже если я нахожусь на Mac, он работает, когда вам нужна связь между двумя контейнерами докеров, и когда я преобразую все приложение в образ докера, мне этого достаточно - person bormat; 11.12.2019
comment
Это должен быть принятый ответ. Намного проще и безопаснее, чем возиться с iptables - person Guilherme Garnier; 05.03.2020
comment
Если я правильно понимаю, это не ответ, потому что он заставляет Docker использовать сеть хоста: сетевой стек не изолирован от хоста Docker (контейнер разделяет сетевое пространство имен хоста). Что может сработать, но может быть не тем, что нужно или намеревается OP. - person Raketenolli; 29.07.2020

Для систем linux вы можете - начиная с основной версии 20.04 движка докеров - теперь также связываться с хостом через host.docker.internal. Это не будет работать автоматически, но вам необходимо указать следующий флаг выполнения:

--add-host=host.docker.internal:host-gateway

Видеть

person Samuel    schedule 25.04.2020
comment
вы знаете, когда эта версия будет доступна? - person freak0; 27.07.2020
comment
@ freak0 согласно этой доске канбан github.com/moby/moby/projects/9 , похоже, у них есть дюжина незавершенных проблем, а еще несколько - TODO. - person Samuel; 27.07.2020
comment
Для более ранних версий Linux Docker мы можем легко обойти это аналогичным образом, используя --add-host host.docker.internal:$(ip addr show docker0 | grep -Po 'inet \K[\d.]+') - person conny; 01.09.2020
comment
Основная версия чего? - person 0xC0000022L; 16.09.2020
comment
Я имею в виду основную версию движка докеров, см. docs.docker.com/engine/release-notes - person Samuel; 29.09.2020
comment
это ключевое слово host-gatewaya или это должен быть явный шлюз хоста? хм - person enrm; 09.11.2020
comment
Я получил ошибку с host-gateway, использование волшебного IP работает: --add-host=host.docker.internal:172.17.0.1 - person mummybot; 03.12.2020
comment
Только что был выпущен Docker Engine 20.10, и с ним host-gateway должен, наконец, быть доступен. - person Cellane; 14.12.2020
comment
Будет ли это работать через extra_hosts в docker-compose? - person Szczepan Hołyszewski; 12.05.2021
comment
@ SzczepanHołyszewski Просто попробовал и ДА. - person zaf; 06.07.2021

Решение с docker-compose: для доступа к сервису на основе хоста вы можете использовать параметр network_mode https://docs.docker.com/compose/compose-file/#network_mode

version: '3'
services:
  jenkins:
    network_mode: host

РЕДАКТИРОВАТЬ 2020-04-27: рекомендуется для использования только в локальной среде разработки.

person vovan    schedule 14.06.2018
comment
Тогда как получить доступ к Дженкинсу? Кажется, переадресация портов не работает, если используется режим сети хоста - person Jeff Tian; 24.03.2020
comment
это очень рискованное решение и совсем не рекомендуется. мы НЕ должны открывать нашу хост-сеть для контейнеров, если явно не требуется - person Fatemeh Majd; 24.04.2020
comment
Пожалуйста, отредактируйте этот ответ. Это не работает для Mac и Windows. Вариант поддерживается только для Linux - person IHaveHandedInMyResignation; 20.11.2020

Я создал контейнер докеров для выполнения именно этого https://github.com/qoomon/docker-host

Затем вы можете просто использовать имя контейнера dns для доступа к хост-системе, например. curl http://dockerhost:9200

person qoomon    schedule 06.08.2018
comment
Это умное решение. Вы знаете что-нибудь, использующее это с большим трафиком? Могут возникнуть накладные расходы на проксирование всего трафика через этот контейнер. - person bcoughlan; 04.09.2018
comment
Да, он работает довольно хорошо, почти без накладных расходов, потому что он просто работает через loopback-устройство - person qoomon; 06.09.2018
comment
Супер чистое решение, спасибо! - person silencej; 21.07.2020
comment
Отличное решение, спасибо! - person mrded; 03.12.2020

В настоящее время самый простой способ сделать это на Mac и Windows - использовать host host.docker.internal, который преобразуется в IP-адрес хост-машины. К сожалению, он еще не работает в Linux (по состоянию на апрель 2018 г.).

person Tomáš Fejfar    schedule 20.04.2018
comment
Это решение работало с Docker версии 19.03.1. Многие другие приведенные здесь решения не работают. Это задокументировано на странице docs.docker.com/docker. -for-mac / сеть / - person clay; 12.08.2019
comment
отлично. ping host.docker.internal показал IP-адрес хост-машины, и я смог подключиться к нему. благодарю вас! - person Tamas Kalman; 28.04.2021

Я изучил различные решения и считаю это наименее хакерским решением:

  1. Определите статический IP-адрес для IP-адреса шлюза моста.
  2. Добавьте IP-адрес шлюза в качестве дополнительной записи в директиве extra_hosts.

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

Вот пример Docker Compose:

version: '2.3'

services:
  redis:
    image: "redis"
    extra_hosts:
      - "dockerhost:172.20.0.1"

networks:
  default:
    ipam:
      driver: default
      config:
      - subnet: 172.20.0.0/16
        gateway: 172.20.0.1

Затем вы можете получить доступ к портам на хосте изнутри контейнера, используя имя хоста dockerhost.

person bcoughlan    schedule 06.09.2018

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

docker run -v /var/run/postgresql:/var/run/postgresql

Затем мы просто настраиваем соединение с нашей базой данных, чтобы использовать сокет вместо сети. Буквально так просто.

person mlissner    schedule 07.05.2019
comment
Это отличное решение. Хорошая работа! - person a paid nerd; 12.09.2019
comment
К вашему сведению, мы столкнулись с большой проблемой: Docker для Mac не поддерживает сокеты в качестве подключенных томов. Это шло гладко, пока человек Mac не попробовал это. :( - person mlissner; 13.09.2019

Для docker-compose, использующего мостовую сеть для создания частной сети между контейнерами, принятое решение с использованием docker0 не работает, потому что выходной интерфейс из контейнеров не docker0, а вместо этого это случайно сгенерированный идентификатор интерфейса, например:

$ ifconfig

br-02d7f5ba5a51: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.32.1  netmask 255.255.240.0  broadcast 192.168.47.255

К сожалению, этот случайный идентификатор непредсказуем и будет меняться каждый раз, когда compose необходимо воссоздавать сеть (например, при перезагрузке хоста). Мое решение - создать частную сеть в известной подсети и настроить iptables для принятия этого диапазона:

Составьте фрагмент файла:

version: "3.7"

services:
  mongodb:
    image: mongo:4.2.2
    networks:
    - mynet
    # rest of service config and other services removed for clarity

networks:
  mynet:
    name: mynet
    ipam:
      driver: default
      config:
      - subnet: "192.168.32.0/20"

Вы можете изменить подсеть, если этого требует ваша среда. Я произвольно выбрал 192.168.32.0/20, используя docker network inspect, чтобы увидеть, что создается по умолчанию.

Настройте iptables на хосте, чтобы разрешить частную подсеть в качестве источника:

$ iptables -I INPUT 1 -s 192.168.32.0/20 -j ACCEPT

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

Этот подход имеет то преимущество, что он воспроизводим и, следовательно, автоматизируем. Я использую модуль ansible template для развертывания моего файла compose с подстановкой переменных, а затем использую модули iptables и shell для настройки и сохранения правил брандмауэра соответственно.

person Andy Brown    schedule 01.01.2020
comment
Я видел несколько ответов, предлагающих iptables -A INPUT -i docker0 -j ACCEPT, но это мне не помогло, тогда как предложенный здесь iptables -I INPUT 1 -s 192.168.32.0/20 -j ACCEPT решил мою проблему. - person Terry Brown; 09.06.2020

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

  1. Подход 1 с публичным IP

    Используйте общедоступный IP-адрес хост-машины для доступа к веб-серверу в контейнере докеров Jenkins.

  2. Подход 2 с хост-сетью

    Используйте «--net host», чтобы добавить контейнер докеров Jenkins в сетевой стек хоста. Контейнеры, развернутые в стеке хоста, имеют полный доступ к интерфейсу хоста. Вы можете получить доступ к локальному веб-серверу в контейнере докеров с частным IP-адресом хост-машины.

NETWORK ID          NAME                      DRIVER              SCOPE
b3554ea51ca3        bridge                    bridge              local
2f0d6d6fdd88        host                      host                local
b9c2a4bc23b2        none                      null                local

Запустите контейнер с хост-сетью Eg: docker run --net host -it ubuntu и запустите ifconfig, чтобы вывести список всех доступных сетевых IP-адресов, доступных из контейнера Docker.

Например: я запустил сервер nginx на своем локальном хост-компьютере, и я могу получить доступ к URL-адресам веб-сайта nginx из контейнера докеров Ubuntu.

docker run --net host -it ubuntu

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
a604f7af5e36        ubuntu              "/bin/bash"         22 seconds ago      Up 20 seconds                           ubuntu_server

Доступ к веб-серверу Nginx (работающему на локальном хост-компьютере) из контейнера докеров Ubuntu с IP-адресом частной сети.

root@linuxkit-025000000001:/# curl 192.168.x.x -I
HTTP/1.1 200 OK
Server: nginx/1.15.10
Date: Tue, 09 Apr 2019 05:12:12 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 26 Mar 2019 14:04:38 GMT
Connection: keep-alive
ETag: "5c9a3176-264"
Accept-Ranges: bytes
person Sreenivasa Reddy    schedule 09.04.2019

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

Кроме того, использование подхода --net="host" - это очень грубый подход, который неприменим, когда нужно иметь хорошо изолированную конфигурацию сети с несколькими контейнерами.

Итак, мой подход состоит в том, чтобы извлечь адрес хоста на стороне хоста, а затем передать его в контейнер с параметром --add-host:

$ docker run --add-host=docker-host:`ip addr show docker0 | grep -Po 'inet \K[\d.]+'` image_name

или сохраните IP-адрес хоста в переменной среды и используйте эту переменную позже:

$ DOCKERIP=`ip addr show docker0 | grep -Po 'inet \K[\d.]+'`
$ docker run --add-host=docker-host:$DOCKERIP image_name

Затем docker-host добавляется в файл hosts контейнера, и вы можете использовать его в строках подключения к базе данных или URL-адресах API.

person Passiday    schedule 24.03.2020

Для меня (Windows 10, Docker Engine v19.03.8) это было сочетание https://stackoverflow.com/a/43541732/7924573 и https://stackoverflow.com/a/50866007/7924573.

  1. измените host / ip на host.docker.internal
    например: LOGGER_URL = "http://host.docker.internal:8085/log"
  2. установите для параметра network_mode значение мост (если вы хотите сохранить переадресацию портов; если не используете хост):
    version: '3.7' services: server: build: . ports: - "5000:5000" network_mode: bridge или альтернативно: используйте --net="bridge", если вы не используете докер -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
person tschomacker    schedule 02.06.2020
comment
host.docker.internal решил проблему для меня. Разрешил мне получить доступ к postgres разработчика из другого контейнера, у которого не было доступа к другому контейнеру. DATABASE_URL = jdbc: postgresql: //host.docker.internal: 5432 / mirthdb - person Michael Hobbs; 16.08.2020

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

Вы можете найти это с помощью команды ifconfig

e.g

ifconfig

en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        options=400<CHANNEL_IO>
        ether f0:18:98:08:74:d4 
        inet 192.168.178.63 netmask 0xffffff00 broadcast 192.168.178.255
        media: autoselect
        status: active

а затем использовал inet-адрес. Это помогло мне подключить любые порты на моей машине.

person Amrut Prabhu    schedule 22.04.2021

Мой поиск в Google привел меня сюда, и, покопавшись в комментариях, я обнаружил, что это дубликат Как мне подключиться к локальному хосту машины изнутри контейнера Docker?. Я проголосовал за то, чтобы закрыть это как дубликат, но поскольку люди (включая меня!) Часто прокручивают ответы вниз, а не внимательно читают комментарии, вот короткий ответ.

TL;DR:

Замените http://127.0.0.1 или http://localhost на http://host.docker.internal. (Источник)

person Aidin    schedule 26.04.2021

Когда у вас есть два образа докеров, которые «уже созданы», и вы хотите разместить два контейнера для связи друг с другом.

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

Когда вы находитесь в таком же сценарии, как я, и это ваша

docker build -t "centos7/someApp" someApp/ 

Это ломается, когда вы пытаетесь

curl http://172.17.0.1:localPort/fileIWouldLikeToDownload.tar.gz > dump.tar.gz

и вы застреваете на "curl / wget", не возвращая "route to host".

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

Объяснение этого подробно описано в следующей документации.

http://www.dedoimedo.com/computers/docker-networking.html

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

Самая простая альтернатива - просто выключить брандмауэр или разрешить все. Это означает выполнение необходимой команды, которая может быть systemctl stop firewalld, iptables -F или аналогичной.

Надеюсь, эта информация вам поможет.

person 99Sono    schedule 16.11.2016
comment
Напомним, что --link устарел. - person Mr.Budris; 22.09.2017