我有一个应用程序容器 (app) 通过 VPN 容器 (vpn) 连接到互联网。虽然该连接有效,但应用程序容器现在无法连接到数据库容器 (db)。
有没有办法让 app
容器连接到本地容器(或任何 RFC1918 地址),同时还通过 vpn
连接?我会简单地将 db
添加到相同的 network_mode
但 db
非常特别需要由另一个未通过 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
时,app
和 vpn
服务似乎在同一个容器网络中运行(具体来说,它们在同一个网络命名空间中)。它们共享接口(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/