«

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

解决

  1. 换个端口:-p 8080:80
  2. 或者把占用端口的程序关掉

八、端口映射的坑

坑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。

总结

记住:

  1. 基本格式:-p 宿主机端口:容器端口
  2. 多个端口就写多个 -p
  3. 端口被占用就换一个
  4. 防火墙也要开

常用:

docker run -d -p 80:80 --name nginx nginx

遇到问题加QQ23979811 协助处理

标签: Docker 容器网络 端口映射 -p参数 端口配置