Docker端口映射外网访问:小白也能懂:用Docker端口
前置准备
开始 Docker端口映射外网访问 之前,请先确认你手头有以下条件:
- 一台已安装 Docker 的云服务器(推荐 CentOS 7+ 或 Ubuntu 20.04+)
- 服务器拥有 公网 IP(弹性公网 IP 或固定公网 IP 都可以)
- 知道你的服务监听的 内部端口(比如 Nginx 默认 80,MySQL 默认 3306)
- 云平台安全组或服务器防火墙已开放你想映射的 外部端口(见下文避坑指南)
- 能够在服务器上执行
docker ps和docker run命令(建议用 root 用户或 sudo)
还没装 Docker?执行curl -fsSL https://get.docker.com | bash然后systemctl start docker即可快速安装。
分步操作
第一步:确认容器内部端口
先拉一个测试镜像并运行,例如 Nginx:
docker run -d --name my-nginx nginx查看容器状态:
docker ps你会看到类似 0.0.0.0:80->80/tcp 的信息?
不,默认并没有对外映射端口。
记住容器内部端口(Nginx 是 80)。
第二步:执行端口映射启动容器
关键命令使用 -p 参数,格式为 主机端口:容器端口:
docker run -d --name my-web -p 8080:80 nginx解释:-p 8080:80 表示将宿主机的 8080 端口映射到容器的 80 端口。
外网用户访问 http://你的公网IP:8080 就能看到 Nginx 默认页面。
如果你想映射多个端口,可以用多个 -p:
docker run -d --name my-app -p 8080:80 -p 8443:443 my-image第三步:对于已运行容器的端口映射
如果想给已经运行的容器添加新的端口映射,推荐用下面两种方法(二选一):
- 方法A:重新创建容器(最简单)
docker stop my-web
docker rm my-web
docker run -d --name my-web -p 8080:80 -p 9090:9090 nginx- 方法B:提交为新镜像再运行(不推荐新手,略复杂,可跳过)
避坑指南
常见错误1:宿主机端口被占用
执行 netstat -tulpn | grep :8080 查看端口是否被其他进程监听。
如果被占用,换一个端口,比如 -p 8081:80。
常见错误2:云平台安全组未放行
这是最多新手忽略的地方。
请登录你的云服务商控制台(阿里云、腾讯云、华为云等),找到 安全组 或 防火墙,添加入站规则:
- 协议:TCP
- 端口:你映射的外部端口(如 8080)
- 来源:0.0.0.0/0(允许所有外网访问)
一定记得同时检查服务器内部防火墙(如 iptables / firewalld):
firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd --reload常见错误3:Docker容器内服务绑定到127.0.0.1
如果容器内的服务(如 MySQL)配置只监听 localhost,即使做了端口映射也无法从外网访问。
检查容器内服务的绑定地址,确保是 0.0.0.0。
效果验证
验证步骤
- 查看容器运行状态:
docker ps | grep my-web应该显示端口映射如 0.0.0.0:8080->80/tcp。
- 在服务器本机测试:
curl http://localhost:8080应返回 Nginx 欢迎页 HTML。
- 从另一台机器或手机浏览器访问:
http://你的服务器公网IP:8080如果看到 Nginx 默认页面,Docker端口映射外网访问 就成功了。
高频问题解答
Q1:为什么外网访问超时?
最常见原因是 安全组/防火墙 没有开放外部端口。检查云平台入站规则和服务器防火墙。
Q2:容器重启后端口映射会失效吗?
不会,只要你使用相同的 docker run -p 命令启动(或者容器自动重启 --restart=always),映射规则会保留。
Q3:如何让外网访问 MySQL 容器?
类似:docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql。但注意生产环境不建议直接暴露 3306 到公网,建议使用 VPN 或 SSH 隧道。
Q4:一个宿主机可以映射多个相同外部端口吗?
不行,每个外部端口只能被一个容器使用。如果多个容器需要同一个内部端口(如 80),请映射不同外部端口,比如 8080, 8081。
如果你正在处理 Docker端口映射外网访问,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。