Что такое 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