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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 12:15:31