我在主机的端口上运行一项服务8545
。我有多个 docker 容器需要访问主机上的这项服务。主机正在运行 ubuntu。我已成功配置
extra_hosts:
- "host.docker.internal:host-gateway"
在用于启动 Docker 容器的 docker-compose 文件中。但是,我发现host.docker.internal:8545
除非我在主机上使用以下命令打开该端口,否则容器无法访问
ufw allow 8545
然而,这将向任何人开放端口,这是不可取的。
我如何才能打开这个端口只是主机上运行的docker容器?
编辑:我看到docker0
接口的 IP 为172.17.0.1
。我尝试运行,sudo ufw allow from 172.17.0.1
但这并没有使我的容器能够访问8545
主机上的端口。
root@localhost:~/code/metis/ops# ufw status
Status: active
To Action From
-- ------ ----
22/tcp ALLOW Anywhere
Anywhere ALLOW 172.17.0.1
22/tcp (v6) ALLOW Anywhere (v6)
root@localhost:~/code/metis/ops# docker exec -it ops_l2geth-mainnet_1 /bin/sh
/ # geth attach http://host.docker.internal:8545
Fatal: Failed to start the JavaScript console: api modules: Post "http://host.docker.internal:8545": context deadline exceeded
编辑2:我还尝试了另一个建议这里这也不起作用:
root@localhost:~/code/metis/ops# ufw allow out on docker0 from 172.17.0.0/16
Rule added
root@localhost:~/code/metis/ops# docker exec -it ops_l2geth-mainnet_1 /bin/sh
/ # geth attach http://host.docker.internal:8545
Fatal: Failed to start the JavaScript console: api modules: Post "http://host.docker.internal:8545": context deadline exceeded
编辑 3:我忘了说我正在用 docker-compose 运行这些容器。据我了解,docker-compose 使用自定义网络,这也许可以解释为什么上述ufw allow
命令没有帮助。
答案1
搞定了!虽然我不确定这是否是一个通用的解决方案。
事实证明,因为我使用docker-compose
默认的 docker0 接口启动容器,而 IP172.17.0.1
并不是容器与主机通信的方式。就我而言,docker-compose
我创建了一个名为 的新网络ops_default
:
❯❯❯ docker network ls
NETWORK ID NAME DRIVER SCOPE
2774ed101a84 bridge bridge local
a6176c796a29 host host local
dfcd1606b19d none null local
7415a4410daf ops_default bridge local
检查ops_default
结果如下
❯❯❯ docker network inspect ops_default
[
{
"Name": "ops_default",
"Id": "7415a4410daf3df718ce957787abd1b9842e4e914fd1b2ff549c80e56d032265",
"Created": "2022-03-10T16:14:13.789181757Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.22.0.0/16",
"Gateway": "172.22.0.1"
}
]
},
"Internal": false,
"Attachable": true,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
}
}
]
看来此网络在子网上运行172.22.0.0/16
。运行ufw allow from 172.22.0.0/16
解决了我的问题!
root@localhost:~/code/metis/ops# ufw status
Status: active
To Action From
-- ------ ----
22/tcp ALLOW Anywhere
Anywhere ALLOW 172.22.0.0/16
22/tcp (v6) ALLOW Anywhere (v6)
root@localhost:~/code/metis/ops# docker exec -it ops_l2geth-mainnet_1 /bin/sh
/ # geth attach http://host.docker.internal:8545
Welcome to the Geth JavaScript console!
instance: Geth/v1.10.17-unstable-19c2c60b-20220308/linux-amd64/go1.17.8
at block: 14360238 (Thu, 10 Mar 2022 16:44:29 UTC)
modules: eth:1.0 net:1.0 rpc:1.0 web3:1.0
>