从 docker 容器启用 ubuntu 防火墙对主机服务的访问

从 docker 容器启用 ubuntu 防火墙对主机服务的访问

我在主机的端口上运行一项服务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

> 

相关内容