如何使用容器化 VPN 并从 docker python 应用程序写入主机 PostgreSQL 数据库

How to use containerized VPN and write into hosts PostgreSQL database from docker python application

我试图实现的目标如下:

使用此项目在 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 网络的 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. 在使用 --network 关键字时不允许将 --add-host 添加到 python_app 容器

但是这里也是,和上面一样的错误。

假设

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

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

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

非常感谢任何帮助!

将某物放入容器与它使用多少互联网无关。 运行 通过 vpn 也一样。

好的, 就像 larsks 评论的那样真的很简单。我在 linux 上,ip a 给了我 docker0 接口,使用该 IP 进行数据库连接,一切正常。 谢谢。