ufw禁止docker容器连接到postgres



在启用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

您的防火墙正在阻止来自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。

相关内容

  • 没有找到相关文章

最新更新