首页 > 解决方案 > 如何使用容器化 VPN 并从 docker python 应用程序写入主机 PostgreSQL 数据库

问题描述

我试图实现的目标如下:

使用以下项目在 docker 容器内的一台主机上启动 1-n 个 VPN 客户端:https ://hub.docker.com/r/qmcgaw/private-internet-access/ 。主机已关闭 VPN。然后连接 1-N 个不同的 Python 应用程序,这些应用程序也在容器中运行,每个 Python 应用程序都使用其中一个 VPN 作为与外部世界的连接,同时写入主机的 postgresql 数据库。

实际上,起作用的是

  1. VPN 容器的连接(使用https://ipinfo.io进行测试)
  2. 使用 VPN 容器作为 python 应用程序的网络容器
# create VPN docker and start it
docker run -d --init --name=pia --cap-add=NET_ADMIN --device=/dev/net/tun -e REGION="someregion" -e USER=username -e PASSWORD='password' qmcgaw/private-internet-access

# run python application with VPN IP
docker run --rm --name python_app --network=container:pia mypythonappimage

什么不工作

  1. 将 python docker 容器连接到主机数据库,同时阻止该容器使用主机互联网连接
# Errors returned from python app
could not connect to server: Connection refused
        Is the server running on host "localhost" (127.0.0.1) and accepting
        TCP/IP connections on port 5432?
could not connect to server: Cannot assign requested address
        Is the server running on host "localhost" (::1) and accepting
        TCP/IP connections on port 5432?

我试图做的

  1. 如果我为 python 容器指定 --net=host 我可以写入主机数据库,但我在这里缺少 VPN 连接
  2. 创建了第二个 docker hostonly 网络,并将已经连接到 pia-network 的 python 容器也连接到该 hostonly 网络:

    docker network create -d bridge --internal hostonly
    docker create --name python_app --network=container:pia mypythonappimage
    docker network connect hostonly python_app
    docker start python_app
    
  3. 使用关键字--add-host时不允许添加到 python_app 容器--network

但也在这里,与上述相同的错误。

假设

我可以在标准 docker bridge 网络中看到 pia 容器。也许我必须创建一些自己的桥接网络并进行配置?或者我必须在 VPN 容器内为我的主机路由 IP,以便使用与 VPN 相同的网络堆栈的任何容器都可以连接到主机(同时防止使用主机外部 IP)。但是我在哪里以及如何正确路由该 IP?

此外,我假设我必须配置 postgresql.conf 和 g_hba.conf。出于测试目的,我信任 127.17.0.0/24 作为 pg_hba.conf 和 listen_addresses = '*' 内的主机连接。但是这里正确(和保存)的配置是什么?

这甚至是我在这里采取的合理方法吗?昨天才真正开始使用docker。我可以想象使用 dockerized postgresql 数据库也可以工作(同时将其绑定到静态卷)。但是现在使用 hosts postgresql 数据库就足够了。

非常感谢任何帮助!

标签: pythonpostgresqldockeropenvpndocker-networking

解决方案


好的,就像 larsks 评论的那样简单。我在 linux 上,ip a给了我docker0接口,把那个 IP 用于数据库连接,一切都很好。谢谢你。


推荐阅读