Что такое linux эквивалент "docker.for.mac.host.internal"

На Mac и Windows можно использовать docker.for.mac.host.internal (заменяет docker.for.mac.localhost) а также docker.for.win.host.internal (заменяет docker.for.win.localhost) внутри контейнера.

Есть ли один для Linux, который будет работать из коробки без передачи переменных env.

11 ответов

Зависит от того, что вы пытаетесь сделать. Если вы работаете с --net=host, localhost должно работать нормально. Если вы используете сеть по умолчанию, используйте статический IP 172.17.0.1, Я подозреваю, что ни один из них не будет вести себя так же, как эти домены.

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

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

См. Ответ здесь: /questions/46010012/kak-poluchit-dostup-k-portu-hosta-iz-docker-kontejnera/55275583#55275583

Если вы используете Docker Compose + Linuxвам нужно добавить его вручную (по крайней мере, пока). Использовать extra_hosts на ваше docker-compose.yaml файл:

      version: '3.7'

services:

  fpm:
    build:
      context: .
    extra_hosts:
      - "host.docker.internal:host-gateway"

Не забудьте обновить Docker, так как это работает только с Docker v20.10+.

Источник: https://github.com/docker/for-linux/issues/264#issuecomment-784985736

Одним из решений является использование специального контейнера, который перенаправляет трафик на хост. Вы можете найти такой контейнер здесь: https://github.com/qoomon/docker-host. Идея состоит в том, чтобы взять маршрут по умолчанию из контейнера и установить его в качестве шлюза NAT для входящих соединений.

Ниже воображаемый пример использования:

docker-host:
  image: qoomon/docker-host
  cap_add: [ 'NET_ADMIN', 'NET_RAW' ]
  restart: on-failure
  environment:
    - PORTS=999

some-service:
  image: ...
  environment:
    SERVER_URL: "http://docker-host:999"
  command: ...
  depends_on:
    - docker-host

Это мое решение:

IP_ADDRESS=$(ip addr show | grep "\binet\b.*\bdocker0\b" | awk '{print $2}' | cut -d '/' -f 1)

затем в docker-compose:

extra_hosts:
  docker.host: ${IP_ADDRESS}

Для Linux нет DNS-имени по умолчанию для хоста. Это можно проверить, выполнив команду:

docker run -it alpine cat /etc/hosts

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

netstat -nr | grep '^0\.0\.0\.0' | awk '{print $2}'

В качестве альтернативы вы можете указать IP-адрес хоста для команды запуска через docker run --add-host dockerHost:<ip-address> ...

https://github.com/docker/for-linux/issues/264

IP=$(ip -4 route list match 0/0 | awk '{print $3}')
echo "Host ip is $IP"
echo "$IP   host.docker.internal" | sudo tee -a /etc/hosts

Это добавит host.docker.internalсвоим хозяевам. Затем вы можете использовать его в конфигурации xdebug.

Вот пример переменной env в docker-compose.yml

XDEBUG_CONFIG: remote_host=host.docker.internal remote_autostart=On remote_enable=On idekey=XDEBUG remote_log=/tmp/xdebug.log remote_port=9999

  • Для разрешения внутренних HTTP-запросов в Linux используйте статический IP-адрес 172.17.0.1.

  • Выполните следующую команду, чтобы получить статический IP-адрес

$(ip addr show | grep "\binet\b.*\bdocker0\b" | awk '{print $2}' | cut -d '/' -f 1)

  • Добавьте новый IP-адрес к разрешенным хостам

  • Теперь измените URL-адрес запроса с этим IP-адресом.

req = requests.get('http://172.17.0.1:8000/api/YOUR_ENDPOINT')

Использование ip интерфейса docker0, скажем, 172.17.0.1, может быть хорошим решением.

Просто убедитесь, что служба, к которой вы хотите обратиться, слушает внешние соединения. Типичным примером является Mysql, который по умолчанию привязывается к 127.0.0.1, в результате чего недоступен, пока вы не разрешите внешние соединения (например, привязка к 0.0.0.0)

Host .docker.internal существует только в Windows WSL, потому что Docker Desktop для Windows запускает демон Docker внутри специальной WSL VM Docker-Desktop. У него есть собственный локальный хост и собственный интерфейс WSL2 для связи с Windows. У этой виртуальной машины нет статического IP-адреса. IP-адрес создается каждый раз, когда создается виртуальная машина, и передается через host.docker.internal в сгенерированном файле /etc/hosts каждому дистрибутиву. Несмотря на то, что нет моста или настоящего v-коммутатора, все порты, открытые на eth0 внутренней сети виртуальной машины, отображаются на локальной сети хоста, НО НЕ НА ETH0 ХОЗЯИНА. Настоящего моста и сопоставления портов нет - настраивать нечего. Внутри виртуальной машины WSL ее локальный хост такой же, как локальный хост машины Linux. 2 процесса внутри WSL VM могут обмениваться данными через localhost. Межраспределительный IPC должен использовать host.docker.internal. Можно создать мост внутри WSL VM -Docker это сделает.

Для linux я мог использовать имя службы, к которой я пытался подключиться, например, один из моих контейнеров (php-fpm) пытался подключиться к mysql, поэтому я использовал mysql как имя хоста, так как это имя службы в моем docker-compose

Другие вопросы по тегам