klo*_*lor 22 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
).
是否有一个Linux将开箱即用而不传递env变量.
Sam*_*uel 81
对于 linux 系统,您可以——从20.04
docker 引擎的主要版本开始——现在也可以通过host.docker.internal
. 这不会自动工作,但您需要提供以下运行标志:
--add-host=host.docker.internal:host-gateway
Run Code Online (Sandbox Code Playgroud)
在此处查看答案:https : //stackoverflow.com/a/61424570/3757139
另请参阅下面的答案以添加到 docker-compose 文件 - /sf/answers/4701074871/
jaw*_*ira 26
如果您使用Docker Compose
+ Linux
,则必须手动添加它(至少现在是这样)。extra_hosts
在您的docker-compose.yaml
文件上使用:
version: '3.7'
services:
fpm:
build:
context: .
extra_hosts:
- "host.docker.internal:host-gateway"
Run Code Online (Sandbox Code Playgroud)
文档 - https://docs.docker.com/compose/compose-file/compose-file-v3/#extra_hosts
不要忘记更新 Docker,因为这仅适用于Docker v20.10+。
来源:https : //github.com/docker/for-linux/issues/264#issuecomment-784985736
Ant*_*cca 18
这是我的解决方案:
IP_ADDRESS=$(ip addr show | grep "\binet\b.*\bdocker0\b" | awk '{print $2}' | cut -d '/' -f 1)
Run Code Online (Sandbox Code Playgroud)
然后在 docker-compose 中:
IP_ADDRESS=$(ip addr show | grep "\binet\b.*\bdocker0\b" | awk '{print $2}' | cut -d '/' -f 1)
Run Code Online (Sandbox Code Playgroud)
dev*_*nev 15
取决于你想要做什么.如果你正在运行--net=host
,localhost
应该工作正常.如果您使用的是默认网络,请使用静态IP 172.17.0.1
.我怀疑这两个域的行为都不一样.
dPa*_*Pac 15
太棒了;通过静态IP地址访问主机172.17.0.1
向主机发出 HTTP 请求:
运行以下命令获取静态IP地址:ip addr show | grep "\binet\b.*\bdocker0\b" | awk '{print $2}' | cut -d '/' -f 1
将新的 IP 地址添加到允许的主机
使用刚刚在您的请求中找到的 IP 地址:req = requests.get('http://172.17.0.1:8000/api/YOUR_ENDPOINT')
小智 11
host.docker.internal仅存在于 Windows WSL中,因为 Docker Desktop for Windows 在特殊的 WSL VM Docker-Desktop 内运行 Docker 守护进程。
\n它有自己的本地主机和自己的 WSL2 接口来与 Windows 进行通信。此虚拟机\xe2\x80\x99t 没有任何静态 IP 地址。每次创建 VM 时都会生成 IP 地址,并通过生成的主机文件中的host.docker.internal传递到每个发行版。虽然没有\xe2\x80\x99t任何网桥或真正的v-switch,但VM内部网络的eth0上打开的所有端口都映射到主机本地网络上,而不是映射到主机的本地网络上。eth0
没有任何真正的网桥和端口映射 - 无需配置。
\n在 WSL VM 内部,其 Localhost 与 Linux 计算机的 localhost 相同。WSL VM 内的两个进程可以通过本地主机进行通信。跨发行版IPC必须使用host.docker.internal。可以在 WSL VM 内创建桥 - Docker 可以做到这一点。
\nJon*_*uis 10
一种解决方案是使用特殊容器将流量重定向到主机.你可以在这里找到这样一个容器: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
Run Code Online (Sandbox Code Playgroud)
mat*_*ish 10
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
Run Code Online (Sandbox Code Playgroud)
它将添加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
Run Code Online (Sandbox Code Playgroud)
小智 8
使用 docker0 接口 ip,比如 172.17.0.1,可能是一个很好的解决方法。
只需确保您需要访问的服务侦听外部连接。一个典型的例子是 Mysql 默认绑定到 127.0.0.1,导致无法访问,直到您允许外部连接(例如绑定到 0.0.0.0)
对于Linux,主机没有默认的DNS名称。可以通过运行以下命令来验证:
docker run -it alpine cat /etc/hosts
Run Code Online (Sandbox Code Playgroud)
已请求此功能,但尚未实现。您可以检查此问题。如前所述,您可以使用以下命令从容器中查找主机的IP。
netstat -nr | grep '^0\.0\.0\.0' | awk '{print $2}'
Run Code Online (Sandbox Code Playgroud)
或者,您可以通过以下方式将host ip提供给run命令: docker run --add-host dockerHost:<ip-address> ...
归档时间: |
|
查看次数: |
18060 次 |
最近记录: |