Docker host internal mac os

Networking features in Docker Desktop for Mac

Estimated reading time: 4 minutes

Docker Desktop for Mac provides several networking features to make it easier to use.

Features

VPN Passthrough

Docker Desktop for Mac’s networking can work when attached to a VPN. To do this, Docker Desktop for Mac intercepts traffic from the containers and injects it into Mac as if it originated from the Docker application.

Port Mapping

When you run a container with the -p argument, for example:

Docker Desktop for Mac makes whatever is running on port 80 in the container (in this case, nginx ) available on port 80 of localhost . In this example, the host and container ports are the same. What if you need to specify a different host port? If, for example, you already have something running on port 80 of your host machine, you can connect the container to a different port:

Now, connections to localhost:8000 are sent to port 80 in the container. The syntax for -p is HOST_PORT:CLIENT_PORT .

HTTP/HTTPS Proxy Support

Known limitations, use cases, and workarounds

Following is a summary of current limitations on the Docker Desktop for Mac networking stack, along with some ideas for workarounds.

Changing internal IP addresses

The internal IP addresses used by Docker can be changed via the Settings (Windows) or Preferences (Mac). After changing IPs, it is necessary to reset the Kubernetes cluster and to leave any active Swarm.

There is no docker0 bridge on macOS

Because of the way networking is implemented in Docker Desktop for Mac, you cannot see a docker0 interface on the host. This interface is actually within the virtual machine.

I cannot ping my containers

Docker Desktop for Mac can’t route traffic to containers.

Per-container IP addressing is not possible

The docker (Linux) bridge network is not reachable from the macOS host.

Use cases and workarounds

There are two scenarios that the above limitations affect:

I want to connect from a container to a service on the host

The host has a changing IP address (or none if you have no network access). We recommend that you connect to the special DNS name host.docker.internal which resolves to the internal IP address used by the host. This is for development purpose and will not work in a production environment outside of Docker Desktop for Mac.

You can also reach the gateway using gateway.docker.internal .

If you have installed Python on your machine, use the following instructions as an example to connect from a container to a service on the host:

Run the following command to start a simple HTTP server on port 8000.

python -m http.server 8000

If you have installed Python 2.x, run python -m SimpleHTTPServer 8000 .

Now, run a container, install curl , and try to connect to the host using the following commands:

I want to connect to a container from the Mac

Port forwarding works for localhost ; —publish , -p , or -P all work. Ports exposed from Linux are forwarded to the host.

Our current recommendation is to publish a port, or to connect from another container. This is what you need to do even on Linux if the container is on an overlay network, not a bridge network, as these are not routed.

For example, to run an nginx webserver:

To clarify the syntax, the following two commands both expose port 80 on the container to port 8000 on the host:

To expose all ports, use the -P flag. For example, the following command starts a container (in detached mode) and the -P exposes all ports on the container to random ports on the host.

See the run command for more details on publish options used with docker run .

Источник

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

Как говорится в названии. Мне нужно иметь возможность получить IP-адрес хостов docker и portmaps от хоста к контейнеру и сделать это внутри контейнера.

13 ответов

Как заметил @MichaelNeale, нет смысла использовать этот метод в Dockerfile (за исключением случаев, когда нам нужен этот IP только во время сборки), потому что этот IP будет жестко закодирован во время сборки.

On Docker для Mac, начиная с версии 18.03, вы можете использовать host.docker.internal как IP хоста.

Читайте также:  Драйвера для windows видеокарту nvidia 8600 gt

Примечание, как в документация, » это для целей разработки[s] и не будет работать в производственной среде за пределами Docker для Mac.»Это потому, что в Docker для Mac «вы не можете увидеть интерфейс docker0 на хосте. Этот интерфейс фактически находится внутри виртуальной машины.»

это обновление от docker.for.mac.localhost , доступен, начиная с версии 17.06, и docker.for.mac.host.internal , доступно с версии 17.12, которая также может работать.

например, у меня есть переменные среды, установленные на моем хосте:

в своем docker-compose.yml файл, у меня есть это:

Обновление: On настройки для Mac, начиная с версии 18.03, вы можете использовать хоста.докер.внутренний как IP хоста. См.allanberry это!—15—>. Для предыдущих версий Docker для Mac может быть полезен следующий ответ:

на Docker для Mac docker0 мост не существует, поэтому другие ответы здесь могут не работать. Однако весь исходящий трафик маршрутизируется через родительский хост, поэтому, пока вы пытаетесь подключиться к IP-адресу, он распознает как сам по себе (и контейнер docker не думает, что это сам по себе), вы должны быть в состоянии подключиться. Например, если вы запустите это с родительского компьютера, запустите:

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

затем вы можете проверить соединение из контейнера docker с telnet. В моем случае я хотел подключиться к удаленному серверу xdebug:

теперь, когда трафик входит в ваш Mac, адресованный для 192.168.46.49 (и весь трафик, выходящий из вашего контейнера, проходит через ваш Mac), ваш Mac будет считать, что IP-это сам. Когда вы закончите использовать этот IP, вы можете удалить псевдоним loopback как это:

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

в моем случае, это показал inet 127.0.0.1/8 что означает, что я не мог использовать IPs в

Источник

Docker Tip — How to use the host’s IP Address inside a Docker container on macOS, Windows, and Linux

Once in a while, you may need your Docker host’s IP address. For instance, you need to be able to connect to the host network from inside a Docker container to access your app or database running locally on the host. Debugging or reverse proxies running on your host are two additional example use-cases.

I’ll show you how to easily make this work simultaneously for macOS, Windows, and Linux — because their docker networking settings differ.

Docker Networking on macOS and Windows vs. Linux

For macOS and Windows the following special DNS name can be used:

The host has a changing IP address (or none if you have no network access). From 18.03 onwards our recommendation is to connect to the special DNS name host.docker.internal , which resolves to the internal IP address used by the host. This is for development purpose and will not work in a production environment outside of Docker Desktop for Mac/Windows.

The gateway is also reachable as gateway.docker.internal .

On Docker for Linux, the IP address of the gateway between the Docker host and the bridge network is 172.17.0.1 if you are using default networking.

Do you see the problem already? They are different, so you cannot simply run docker-compose up -d and all operating systems behave the same. But I got you covered, there’s an easy approach to make this work.

Setup docker-compose

I’ve seen some suggestions, like creating a Linux-specific config file docker-compose.override.yml (docs), but the solution a co-worker of mine came up with seems more elegant and less complex to me.

Exit fullscreen mode

So, what is happening here? The DB_UPSTREAM should point to the host’s IP and port 3000. $ is the critical piece here. This expression tells docker-compose to either us the environment variable DOCKER_GATEWAY_HOST or use the fallback host.docker.internal when resolving this value.

On both macOS and Windows it works out of the box now without anything left to do. 🚀

If you are running this stack on Linux you need to have the DOCKER_GATEWAY_HOST environment variable set for the Docker gateway host. Simply put this line into your .bashrc ( .bash_profile or .zshrc ):

Exit fullscreen mode

Now you can start the stack from macOS, Windows, and Linux without further configuration or overwrites. If you stick to this pattern — as we do — this works for every project of your company.

Great, isn’t it? I hope this saves you some time!

Источник

What is linux equivalent of «host.docker.internal»

On Mac and Windows it is possible to use docker.for.mac.host.internal (replaces docker.for.mac.localhost ) and docker.for.win.host.internal (replaces docker.for.win.localhost ) host.docker.internal (Docker 18.03+) inside container.

Is there one for Linux that will work out of the box without passing env variables or extracting it using various CLI commands?

Читайте также:  Обновить драйвера bluetooth windows 10 x64 xbox one

11 Answers 11

Depends what you’re trying to do. If you’re running with —net=host , localhost should work fine. If you’re using default networking, use the static IP 172.17.0.1 . I suspect neither will behave quite the same as those domains.

For linux systems, you can – starting from major version 20.04 of the docker engine – now also communicate with the host via host.docker.internal . This won’t work automatically, but you need to provide the following run flag:

See also this answer below to add to a docker-compose file — https://stackoverflow.com/a/67158212/243392

If you are using Docker Compose + Linux , you have to add it manually (at least for now). Use extra_hosts on your docker-compose.yaml file:

Do not forget to update Docker since this only works with Docker v20.10+.

One solution is to use a special container which redirects traffic to the host. You can find such a container here: https://github.com/qoomon/docker-host. The idea is to grab the default route from within the container and install that as a NAT gateway for incoming connections.

An imaginary example usage:

For linux there isn’t a default DNS name for the host machine. This can be verified by running the command:

This feature has been requested, however wasn’t implemented. You can check this issue. As discussed you can use the following command to find the IP of the host from the container.

Alternatively, you can provide the host ip to the run command via docker run —add-host dockerHost: .

This is my solution:

then in docker-compose:

It will add host.docker.internal to your hosts. Then you can use it in xdebug config.

Here is example of env variable in docker-compose.yml

Using the docker0 interface ip, say 172.17.0.1, could be a good workaround.

Just be sure that the service you need to reach listens to external connections. A typical example is Mysql who binds to 127.0.0.1 by default, resulting unreachable until you allow external connections (es. binding to 0.0.0.0)

For allowing internal HTTP requests in Linux, use the static IP 172.17.0.1

Run the following command to get the static IP

$(ip addr show | grep «\binet\b.*\bdocker0\b» | awk ‘‘ | cut -d ‘/’ -f 1)

Источник

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

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

РЕДАКТИРОВАТЬ: я работаю Docker изначально на машине Linux.

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

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

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

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

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

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

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

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

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

Для macOS и Windows

Docker v 18.03 и выше (с 21 марта 2018 г.)

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

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 внутри контейнера.

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

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

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

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

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

Читайте также:  Драйвера via hd audio для windows 10 x64

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

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

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

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

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

  1. Определите статический IP-адрес для IP-адреса шлюза моста.
  2. Добавьте IP-адрес шлюза в качестве дополнительной записи в 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 модули для настройки и сохраняются правила брандмауэра, соответственно.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Источник

Оцените статью