如何让经VPN容器联网的Docker应用容器同时访问本地容器,并保证数据库可被非VPN容器访问?
解决VPN容器下App同时访问外网和本地数据库的问题
我来帮你搞定这个问题,核心思路是把数据库和非VPN应用放进一个自定义Docker网络,让VPN容器接入这个网络并配置本地路由白名单,这样既能让App通过VPN访问外网,又能正常连接本地数据库,同时数据库也能被非VPN容器访问。
具体调整步骤:
创建自定义本地网络
我们需要一个独立的Docker网络来承载数据库和非VPN应用,确保它们之间能正常通信,同时让VPN容器也能接入这个网络。修改VPN容器配置
- 让VPN容器加入这个自定义网络
- 添加
WHITELIST环境变量,指定所有RFC1918本地网段(或你需要的特定网段),保证这些流量不会走VPN隧道,而是走本地路由。
修正数据库容器配置
- 删掉
network_mode: service:vpn(这是导致非VPN容器无法访问数据库的关键原因) - 将数据库加入自定义本地网络
- 删掉
保持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
相关产品推荐
相关产品推荐

