[英]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.