You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让经VPN容器联网的Docker应用容器同时访问本地容器,并保证数据库可被非VPN容器访问?

解决VPN容器下App同时访问外网和本地数据库的问题

我来帮你搞定这个问题,核心思路是把数据库和非VPN应用放进一个自定义Docker网络,让VPN容器接入这个网络并配置本地路由白名单,这样既能让App通过VPN访问外网,又能正常连接本地数据库,同时数据库也能被非VPN容器访问。

具体调整步骤:

  1. 创建自定义本地网络
    我们需要一个独立的Docker网络来承载数据库和非VPN应用,确保它们之间能正常通信,同时让VPN容器也能接入这个网络。

  2. 修改VPN容器配置

    • 让VPN容器加入这个自定义网络
    • 添加WHITELIST环境变量,指定所有RFC1918本地网段(或你需要的特定网段),保证这些流量不会走VPN隧道,而是走本地路由。
  3. 修正数据库容器配置

    • 删掉network_mode: service:vpn(这是导致非VPN容器无法访问数据库的关键原因)
    • 将数据库加入自定义本地网络
  4. 保持App容器的网络模式
    App继续使用network_mode: service:vpn,这样它和VPN容器共享网络栈,既能通过VPN访问外网,又能借助VPN的路由访问自定义网络里的数据库。

完整的docker-compose.yml配置:

version: "3.9"

# 定义自定义本地网络
networks:
  local_network:
    driver: bridge
    ipam:
      config:
        - subnet: 192.168.100.0/24  # 选一个不与你本地局域网冲突的RFC1918网段

services:
  app:
    build: app/
    depends_on:
      - vpn
      - db
    network_mode: service:vpn  # 保持与VPN共享网络栈

  db:
    image: postgres:alpine
    restart: always
    environment:
      POSTGRES_USER: your_db_user  # 替换为你的实际数据库用户名
      POSTGRES_PASSWORD: your_db_password  # 替换为你的实际数据库密码
      POSTGRES_DB: your_db_name  # 替换为你的实际数据库名
    networks:
      - local_network  # 加入自定义本地网络
    # 可选:如果需要宿主机或外部非Docker容器访问数据库,取消下面的端口映射
    # ports:
    #   - "5432:5432"

  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  # 替换为你的NordVPN账号
      - "PASS=PASSWORD"  # 替换为你的NordVPN密码
      - CONNECT=United_States
      - TECHNOLOGY=NordLynx
      # 白名单所有RFC1918本地网段,确保本地流量不走VPN
      - WHITELIST=192.168.100.0/24,192.168.0.0/16,10.0.0.0/8,172.16.0.0/12
    ulimits:
      memlock:
        soft: -1
        hard: -1
    networks:
      - local_network  # 加入自定义本地网络

  # 你的第二个非VPN应用示例,加入local_network即可直接访问db
  # second_app:
  #   image: your_second_app_image
  #   depends_on:
  #     - db
  #   networks:
  #     - local_network

配置生效的原理:

  • 自定义网络的DNS解析:Docker在自定义桥接网络中会自动为服务名提供DNS解析,所以App(通过VPN容器的网络)可以直接用db作为主机名访问数据库。
  • VPN白名单路由:WHITELIST是bubuntux/nordvpn镜像支持的功能,它会自动添加路由规则,让指定网段的流量绕过VPN隧道,直接走本地网络,避免App访问数据库的流量被VPN拦截。
  • 数据库的可访问性:数据库不再绑定到VPN的网络栈,而是处于独立的本地网络中,非VPN的第二个应用只要加入同一个网络,就能直接访问数据库。

常见问题排查:

  • 如果App仍无法访问数据库,检查VPN容器的日志,确认WHITELIST配置生效,路由规则已正确添加。
  • 确保自定义网络的网段没有和你的本地局域网网段冲突,否则可能导致路由混乱。

内容的提问来源于stack exchange,提问作者Farhan Yusufzai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 07:47:33