【问题标题】:ufw forbids docker container to connect to postgresufw 禁止 docker 容器连接到 postgres
【发布时间】:2021-02-22 08:59:20
【问题描述】:

在启用了 ufw 的 ubuntu 18.04 上,我运行 docker 容器,它应该将 django 应用程序连接到本地安装的 Postgresql 服务器。

ufw 被禁用时,一切运行完美

docker-compose -f docker-compose.prod.yml run --rm app  sh -c 'python manage.py createsuperuser'

但启用 ufw 我得到以下错误:

 conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
django.db.utils.OperationalError: could not connect to server: Operation timed out
    Is the server running on host "host.docker.internal" (172.17.0.1) and accepting
    TCP/IP connections on port 5432?

我有以下 ufw 规则

$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
Nginx Full                 ALLOW       Anywhere                  
OpenSSH                    ALLOW       Anywhere                  
20/tcp                     ALLOW       Anywhere                  
21/tcp                     ALLOW       Anywhere                  
990/tcp                    ALLOW       Anywhere                  
40000:50000/tcp            ALLOW       Anywhere                  
Nginx Full (v6)            ALLOW       Anywhere (v6)             
OpenSSH (v6)               ALLOW       Anywhere (v6)             
20/tcp (v6)                ALLOW       Anywhere (v6)             
21/tcp (v6)                ALLOW       Anywhere (v6)             
990/tcp (v6)               ALLOW       Anywhere (v6)             
40000:50000/tcp (v6)       ALLOW       Anywhere (v6)  

如何正确配置ufw,让容器连接Postgres?

【问题讨论】:

    标签: django postgresql docker ubuntu ufw


    【解决方案1】:

    您的防火墙正在阻止来自 docker 容器的连接,因为它源自另一个网络。

    要解决此问题,您应该启用从该 docker 网络访问您的 Postgres 实例(我假设它的端口为 5432)。

    因此,当您使用 docker-compose up 时,会创建一个特定的 docker 网络。您可以使用命令查找它:

    docker network ls

    当您找到您的网络时,使用命令docker inspect {network name} 获取有关它的更多信息。您正在寻找的信息是网络的网关。它的部分应该如下所示:

    ...
    "IPAM": {
                "Driver": "default",
                "Options": {},
                "Config": [
                    {
                        "Subnet": "172.18.0.0/16",
                        "Gateway": "172.18.0.1"
                    }
                ]
            },
    ...
    

    您要查找的 ip 在此示例中为 172.18.0.1

    所以现在您知道您的容器从哪个接口连接到 Postgres,您可以在防火墙中启用它。由于您不想为所有人打开防火墙,因此您可以使用以下方式:

    ufw allow in from 172.18.0.0/16

    这也将允许整个网络访问,而不仅仅是特定的 IP。这是一个有用的选项,因为容器可以在重启时更改 IP。

    【讨论】:

    • 非常感谢。我不明白我是如何完全错过文档中关于另一个 docker 网络的部分
    猜你喜欢
    • 2016-07-20
    • 1970-01-01
    • 2022-06-10
    • 2019-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多