Docker容器网络配置:避免不必要端口暴露与内部连通
解决方案
1. 创建自定义Docker网络(解决容器名连接问题)
默认Docker桥接网络不支持容器名的DNS解析,先创建自定义网络让容器间能通过名称互访:
docker network create my-internal-network
2. 重新启动容器,调整端口映射与网络归属
先停止并删除旧容器(若需保留数据,提前做好备份),再重新创建容器,确保加入自定义网络且仅暴露必要公网端口:
数据库容器sqldb(禁止公网访问,仅内部通信)
不要加-p 3306:3306,避免端口映射到公网,仅同网络容器可访问:
docker stop sqldb && docker rm sqldb docker run -d --name sqldb --network my-internal-network [你的MySQL镜像名]
应用容器applet2(禁止公网访问,仅内部通信)
同样移除公网端口映射:
docker stop applet2 && docker rm applet2 docker run -d --name applet2 --network my-internal-network [你的applet2镜像名]
应用容器applet1(仅暴露主机80端口到公网)
注意:你原配置里80:3306大概率是笔误(Java应用一般不用3306端口),请替换为applet1实际内部端口(比如8080),这里以内部80端口为例:
docker stop applet1 && docker rm applet1 # -p 80:80 表示将主机80端口映射到容器80端口 docker run -d --name applet1 --network my-internal-network -p 80:80 [你的applet1镜像名]
3. 调整内部连接地址
所有容器在同一自定义网络内,直接用容器名替代内部IP:
- JDBC连接改为:
jdbc:mysql://sqldb:3306/db - applet1连接applet2的地址改为:
http://applet2:4444(根据applet2实际服务端口调整)
4. 配置主机防火墙,锁定公网访问端口
确保VPS仅对外开放SSH(22)和80端口,以ufw为例(Debian/Ubuntu常用):
# 重置防火墙规则(操作前确保SSH连接稳定) ufw reset # 允许SSH连接 ufw allow 22/tcp # 允许80端口访问 ufw allow 80/tcp # 启用防火墙 ufw enable
若为CentOS/RHEL系统,用firewalld:
firewall-cmd --add-port=22/tcp --permanent firewall-cmd --add-port=80/tcp --permanent firewall-cmd --reload
验证效果
- 公网访问
123.xxx.xxx.xxx:80可正常打开applet1 - 公网访问
123.xxx.xxx.xxx:3306和4444会被拒绝 - 进入applet1容器测试:
docker exec -it applet1 ping sqldb,能ping通则容器名解析正常;用curl测试连接applet2也应正常
内容的提问来源于stack exchange,提问作者Clone
相关产品推荐
相关产品推荐

