docker - VPN 连接的 Docker 容器无法访问其他容器

标签 docker docker-compose vpn

我有一个应用程序容器 (app) 通过 VPN 容器 (vpn) 连接到互联网。虽然该连接有效,但应用程序容器现在无法连接到数据库容器 (db)。

有没有办法让 app 容器连接到本地容器(或任何 RFC1918 地址),同时还通过 vpn 连接?我会简单地将 db 添加到相同的 network_modedb 非常特别需要由另一个未通过 vpn 连接的容器访问(将从 db 读取的第二个应用程序)。

VPN容器正在运行bubuntux/nordvpn,我的docker-compose.yml如下:

version: "3.9"

services:
  app:
    build: app/
    depends_on:
      - db
    network_mode: service:vpn
    depends_on:
      - vpn
  db:
    image: postgres:alpine
    restart: always
    network_mode: service:vpn
    environment:
      POSTGRES_USER: PASSWORD
      POSTGRES_PASSWORD: PASSWORD
      POSTGRES_DB: PASSWORD
  vpn:
    image: bubuntux/nordvpn
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    sysctls:
      - net.ipv4.conf.all.rp_filter=2
    devices:
      - /dev/net/tun
    environment:
      - USER=EMAIL@EMAIL.COM
      - "PASS=PASSWORD"
      - CONNECT=United_States
      - TECHNOLOGY=NordLynx
    ulimits:
      memlock:
        soft: -1
        hard: -1

我曾尝试使用链接,如下:

app:
   links:
      - db

但是,我收到一个启动错误,特别是container type network can't be used with links。

重述问题:如何让容器通过 VPN 容器(在本例中为 bubuntux/nordvpn)连接到 Internet,并且非 VPN 连接的容器也可以访问该容器?

谢谢!

最佳答案

当您在 app 的配置中使用 network_mode: service:vpn 时,appvpn 服务似乎在同一个容器网络中运行(具体来说,它们在同一个网络命名空间中)。它们共享接口(interface)、路由规则、端口等。值得注意的是,它们还共享 /etc/resolv.conf/etc/hosts。由于 links 只是将相关条目添加到 /etc/hosts,您可以通过 (违反直觉)添加一个 db 链接到 vpn 服务。

尝试以下配置:

version: "3.9"

services:
  app:
    build: app/
    depends_on:
      - db
    network_mode: service:vpn
  db:
    image: postgres:alpine
    network_mode: bridge
    restart: always
    environment:
      POSTGRES_USER: USER
      POSTGRES_PASSWORD: PASSWORD
      POSTGRES_DB: DB
  vpn:
    image: bubuntux/nordvpn
    network_mode: bridge
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    sysctls:
      - net.ipv4.conf.all.rp_filter=2
    devices:
      - /dev/net/tun
    environment:
      - USER=EMAIL@EMAIL.com
      - "PASS=PASSWORD"
      - CONNECT=foo
      - TECHNOLOGY=NordLynx
    links:
      - db # <----- This makes `db` accessible to `app`
    ulimits:
      memlock:
        soft: -1
        hard: -1

关于docker - VPN 连接的 Docker 容器无法访问其他容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66279975/

相关文章:

docker - 多阶段构建中的最终输出图像是什么?

c# - 在 Linux Docker 中使用 .Net Standard 库运行 .Net Core 应用程序

MYSQL_ROOT_PASSWORD_FILE 正在读取 '/run/secrets/mypassword' 作为密码而不是路径

linux - 权限被拒绝(公钥),在 Linux AWS 服务器上我可以修复它吗?

linux - 将代理设置应用于Linux上的应用程序,代理主要针对Windows下的浏览器运行

java - 确定 Android VPN 接口(interface)/IP?

macos - Docker:无法读取 CA 证书:没有此类文件或目录

Docker:有什么方法可以列出正在运行的 docker 容器中打开的套接字?

配置文件的 docker secret

为非 root 用户创建 Docker-compose 卷