在Mac和Windows上,可以在容器内使用docker.for.mac.host.internal
(替换docker.for.mac.localhost
)和docker.for.win.host.internal
(替换docker.for.win.localhost
)。
是否有一个可以在不传递env变量的情况下开箱即用的linux。
答案 0 :(得分:12)
对于linux系统,您可以–从主要版本docker引擎20.04
开始–现在也可以通过host.docker.internal
与主机进行通信。这将自动不起作用,但是您需要提供以下运行标志:
--add-host=host.docker.internal:host-gateway
答案 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> ...
答案 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可以做到。