如何为Azure虚拟机上已运行的MySQL Docker容器配置对外端口映射
可行解决方案
生产环境操作前建议先对MySQL做全量备份,避免操作异常导致数据丢失。
方案1:无需重启现有MySQL容器(无停机风险,生产优先选择)
通过iptables端口转发实现宿主机端口到容器端口的映射,不需要改动现有运行的容器:
- 先获取MySQL容器的内部IP地址:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 67b7d4f1eca6
命令执行后会输出容器的内网IP,例如172.17.0.2,下面以该IP为例操作。
2. 配置iptables转发规则,将宿主机3306端口的流量转发到容器的3306端口:
# 配置DNAT转发 iptables -t nat -A DOCKER -p tcp --dport 3306 -j DNAT --to-destination 172.17.0.2:3306 # 允许转发流量通过 iptables -A FORWARD -p tcp -d 172.17.0.2 --dport 3306 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
- 持久化iptables规则,避免宿主机重启后规则失效:
# 保存规则 iptables-save > /etc/sysconfig/iptables # 安装iptables服务实现开机自动加载规则 yum install iptables-services -y systemctl enable --now iptables
注意:该方案依赖容器固定内网IP,如果后续容器重启,内网IP可能发生变化,转发规则会失效,需要重新配置。
方案2:重启容器配置端口映射(配置更稳定,可接受短暂停机可选)
将现有运行的容器提交为镜像,再用新镜像启动带端口映射的容器,操作前请确认可以接受数秒到数分钟的MySQL服务中断:
- 提交现有容器为镜像,保留所有现有配置和数据:
docker commit 67b7d4f1eca6 mysql:prod-backup
- 查看原有容器的启动参数,确认挂载卷、环境变量等配置,保证新容器启动参数和旧容器完全一致,避免配置或数据丢失。
- 停止旧容器,启动带端口映射的新容器:
# 停止旧容器 docker stop 67b7d4f1eca6 # 启动新容器,下面示例的-v、-e等参数请替换为你原有容器的实际配置 docker run -d \ -p 3306:3306 \ --name mysql-prod \ -v /你的宿主机数据目录:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=你的root密码 \ mysql:prod-backup
- 验证新容器运行正常、数据完整后,可以自行删除旧容器。
必要的额外配置
配置完成后还需要放开两层访问限制才能从外部访问:
- 放开宿主机操作系统防火墙的对应端口:
# firewalld防火墙执行以下命令 firewall-cmd --add-port=3306/tcp --permanent firewall-cmd --reload
- 登录Azure控制台,为该虚拟机关联的网络安全组(NSG)添加入站规则,允许你办公网的公网IP访问3306端口,请勿放开0.0.0.0/0全网段访问,避免安全风险。
安全建议:MySQL端口不建议直接暴露到公网,优先通过VPN、跳板机的方式访问,同时MySQL账号仅配置指定IP的访问权限,不要使用%通配符开放全IP访问。
内容的提问来源于stack exchange,提问作者Pradip
相关产品推荐
相关产品推荐

