Docker端口映射,-p参数用法详解
时间:2026-10-8 08:18 作者:emer 分类: 无
前言
容器跑起来了,但外部访问不了,就是端口没映射好。本文讲Docker端口映射的各种用法。
一、什么是端口映射
Docker容器有自己的内部网络,外部要访问容器里的服务,得把宿主机的端口映射到容器的端口。
二、基本用法
格式
-p 宿主机端口:容器端口
例子
docker run -d -p 8080:80 nginx
意思:访问宿主机的8080端口,转发到容器的80端口。
浏览器访问
http://服务器IP:8080
三、各种写法
1. 指定宿主机端口和容器端口
-p 8080:80
2. 只指定容器端口,宿主机随机分配
docker run -d -P nginx
大写P,宿主机随机找个空闲端口。
3. 绑定指定IP
-p 127.0.0.1:8080:80
只允许本机访问,外网访问不了。
4. UDP端口
-p 53:53/udp
5. 映射多个端口
docker run -d \
-p 80:80 \
-p 443:443 \
-p 2222:22 \
nginx
四、查看端口映射
查看容器端口
docker port 容器名
输出:
80/tcp -> 0.0.0.0:8080
查看详细信息
docker ps
看PORTS列。
五、Docker Compose里的端口映射
services:
nginx:
image: nginx
ports:
- "80:80"
- "443:443"
- "127.0.0.1:8080:80"
六、常见场景
场景1:跑Nginx
docker run -d -p 80:80 --name mynginx nginx
场景2:跑MySQL
docker run -d -p 3306:3306 --name mysql \
-e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
场景3:跑Redis
docker run -d -p 6379:6379 --name redis redis
场景4:多个容器跑同一个端口
比如跑两个Nginx,分别用不同端口:
docker run -d -p 8081:80 --name nginx1 nginx
docker run -d -p 8082:80 --name nginx2 nginx
七、端口被占用怎么办
报错
Bind for 0.0.0.0:80 failed: port is already allocated
查谁占用了80端口
netstat -tlnp | grep :80
# 或者
lsof -i:80
解决
- 换个端口:
-p 8080:80 - 或者把占用端口的程序关掉
八、端口映射的坑
坑1:只映射了容器端口,没映射宿主机端口
docker run -d -p 80 nginx
这样宿主机随机分配端口,不好记。
坑2:防火墙没开
端口映射了,但防火墙挡了,外网还是访问不了。
解决: 开放端口:
firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd --reload
坑3:改不了端口映射
容器启动后,想改端口映射,改不了。
解决: 删掉容器重新跑。容器数据用卷挂载了就不怕丢。
坑4:绑定127.0.0.1后外网访问不了
-p 127.0.0.1:8080:80
这个只能本机访问,外网访问不了。
原因: 故意绑的本机。
解决: 改成 0.0.0.0:8080:80 或者直接 8080:80。
总结
记住:
- 基本格式:
-p 宿主机端口:容器端口 - 多个端口就写多个
-p - 端口被占用就换一个
- 防火墙也要开
常用:
docker run -d -p 80:80 --name nginx nginx
遇到问题加QQ23979811 协助处理