什么是linux相当于“docker.for.mac.host.internal”

时间:2018-01-31 15:48:06

标签: docker docker-for-windows docker-for-mac docker-desktop

在Mac和Windows上,可以在容器内使用docker.for.mac.host.internal(替换docker.for.mac.localhost)和docker.for.win.host.internal(替换docker.for.win.localhost)。

是否有一个可以在不传递env变量的情况下开箱即用的linux。

11 个答案:

答案 0 :(得分:12)

对于linux系统,您可以–从主要版本docker引擎20.04开始–现在也可以通过host.docker.internal与主机进行通信。这将自动不起作用,但是您需要提供以下运行标志:

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

在此处查看答案:https://stackoverflow.com/a/61424570/3757139

答案 1 :(得分:11)

取决于你想要做的事情。如果您使用的是declare @tasks xml = ' <request> <task> <user>Q500</user> <tool>31</tool> <role> <roleID>w1234</roleID> <action>2</action> </role> </task> <task> <user>Q500</user> <tool>31</tool> <role> <roleID>w123456</roleID> <action>1</action> </role> </task> </request>' SELECT ROW_NUMBER() over (order by getdate()) as rn, ParamValues.x1.value('tool[1]', 'INT') as tool, ParamValues.x1.value('user[1]', 'VARCHAR(10)') as [user], r1.value('roleID[1]', 'VARCHAR(10)') as roleid, r1.value('action[1]', 'VARCHAR(10)') as [action] FROM @tasks.nodes('/request/task') AS ParamValues(x1) Cross Apply ParamValues.x1.nodes('./role') AS Roles(r1) --net=host应该可以正常运行。如果您使用的是默认网络,请使用静态IP localhost。我怀疑这两个域的行为都不一样。

答案 2 :(得分:9)

一种解决方案是使用特殊容器将流量重定向到主机。你可以在这里找到这样一个容器: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

答案 3 :(得分:8)

这是我的解决方案:

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}

答案 4 :(得分:6)

如果您使用 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

答案 5 :(得分:5)

对于Linux,没有主机的默认DNS名称。这可以通过运行命令来验证:

docker run -it alpine cat /etc/hosts

此功能已被请求,但尚未实施。您可以查看issue。如上所述,您可以使用以下命令从容器中查找主机的IP。

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

或者,您可以通过docker run --add-host dockerHost:<ip-address> ...

将主机ip提供给运行命令

答案 6 :(得分:5)

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配置中使用它。

以下是docker-compose.yml中的env变量的示例

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

答案 7 :(得分:4)

使用docker0接口ip(例如172.17.0.1)可能是一个不错的解决方法。

只需确保您需要访问的服务侦听外部连接即可。一个典型的例子是Mysql,默认情况下它绑定到127.0.0.1,导致在您允许外部连接(例如绑定到0.0.0.0)之前无法访问

答案 8 :(得分:2)

  • 为了在 Linux 中允许内部 HTTP 请求,请使用静态 IP 172.17.0.1

  • 运行以下命令获取静态IP

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

  • 将新 IP 添加到允许的主机

  • 现在用这个 IP 更改请求 URL

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

答案 9 :(得分:0)

对于linux,我可以使用尝试连接的服务名称,例如我的一个容器(php-fpm)试图连接到mysql,所以我使用mysql作为主机名,因为那是我的docker-compose中的服务名

答案 10 :(得分:0)

host.docker.internal仅存在于Windows WSL中,因为适用于Windows的Docker桌面在特殊的WSL VM Docker-Desktop中运行Docker守护程序。它具有自己的本地主机和与Windows通信的WSL2接口。该虚拟机没有静态IP。每次创建VM时都会生成IP,并通过生成的/ etc / hosts中的host.docker.internal将其传递给每个发行版。尽管没有网桥或真正的v-switch,但在VM内部网络eth0上打开的所有端口都映射在主机本地网络上,但不在主机的ETH0上。 没有真正的网桥和端口映射-无需配置。 在WSL VM中,其Localhost与Linux计算机的本地主机相同。 WSL VM中的2个进程可以通过本地主机进行通信。跨发行版IPC必须使用host.docker.internal。可以在WSL VM中创建网桥-Docker可以做到。