如何配置Docker容器网络?实现Postgres隔离与Server外部可访问
Docker容器隔离与访问配置方案
核心思路
通过自定义Docker网络+端口映射控制就能完美满足你的三个需求:
- 不给postgres做端口映射,仅让它加入自定义网络,禁止外部访问
- 让server和postgres在同一自定义网络内,实现容器间通信
- 给server配置端口映射,允许外部通过宿主机端口访问
具体操作步骤
- 创建自定义Docker网络(官方推荐,比默认桥接网络隔离性更好、解析更稳定)
docker network create app-internal-net
- 启动postgres容器,仅加入自定义网络,不暴露任何端口
docker run -d \ --name postgres \ --network app-internal-net \ -e POSTGRES_USER=dbuser \ -e POSTGRES_PASSWORD=dbpass \ postgres:latest
此时postgres的5432端口仅对app-internal-net网络内的容器可见,外部(包括宿主机)无法直接访问,满足需求1。
- 启动server容器,加入同一自定义网络,同时映射端口到宿主机
docker run -d \ --name server \ --network app-internal-net \ -p 8080:80 \ # 示例:将宿主机8080端口映射到容器的80端口,可根据实际调整 your-server-image:tag
- 外部用户可以通过
宿主机IP:8080访问server,满足需求3 - server容器内部可以直接用
postgres:5432作为连接地址访问postgres(自定义网络支持容器名解析),满足需求2
你之前的误解澄清
你提到“在Docker网络内使用--publish仅能让端口在网络内部访问”是错误的:--publish(或-p)的作用是将容器端口映射到宿主机的端口,和容器所在网络无关,只要配置了-p,外部就能通过宿主机IP+映射端口访问容器。之前的问题可能是你测试时没有用宿主机IP访问,或者映射端口配置错误。
内容的提问来源于stack exchange,提问作者God I Am Clown
相关产品推荐
相关产品推荐

