簡體   English   中英

ufw 禁止 docker 容器連接到 postgres

[英]ufw forbids docker container to connect to 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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM