Docker端口映射,-p参数用法详解

前言

容器跑起来了,但外部访问不了,就是端口没映射好。本文讲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 协助处理


emer 发布于  2026-10-8 08:18 

Docker查看容器IP,docker inspect命令

前言

容器之间要互相通信,得知道容器的IP。本文讲怎么用docker inspect查看容器IP和详细信息。

一、查看容器IP

最简单的方法

docker inspect 容器名

输出一大串JSON,找IPAddress字段。

只看IP

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 容器名

直接输出IP地址,比如:172.17.0.2

查看所有运行中容器的IP

docker ps -q | xargs docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}'

输出:

/mynginx - 172.17.0.2
/mymysql - 172.17.0.3
/myphp - 172.17.0.4

二、docker inspect常用用法

查看容器挂载

docker inspect -f '{{.Mounts}}' 容器名

查看容器启动命令

docker inspect -f '{{.Config.Cmd}}' 容器名

查看容器环境变量

docker inspect -f '{{.Config.Env}}' 容器名

查看容器端口映射

docker inspect -f '{{.NetworkSettings.Ports}}' 容器名

查看容器网络

docker inspect -f '{{.NetworkSettings.Networks}}' 容器名

查看容器状态

docker inspect -f '{{.State.Status}}' 容器名

查看容器启动时间

docker inspect -f '{{.State.StartedAt}}' 容器名

查看容器日志路径

docker inspect -f '{{.LogPath}}' 容器名

三、查看镜像信息

查看镜像详细信息

docker inspect 镜像名

查看镜像作者

docker inspect -f '{{.Author}}' nginx

查看镜像默认启动命令

docker inspect -f '{{.Config.Cmd}}' nginx

四、容器之间怎么通信

用容器名通信(推荐)

Docker默认网络里,容器可以用容器名互相访问:

# 在nginx容器里ping mysql
docker exec mynginx ping mysql

不用记IP,直接用容器名就行。

用自定义网络

# 创建网络
docker network create mynet

# 容器加入网络
docker run --name mysql --network mynet -d mysql:5.7
docker run --name nginx --network mynet -d nginx

五、常见场景

场景1:Nginx反向代理连PHP

nginx配置里:

fastcgi_pass php:9000;

这里的php就是容器名,Docker会自动解析成容器IP。

场景2:PHP连MySQL

<?php
$pdo = new PDO('mysql:host=mysql;dbname=mydb', 'root', '123456');
?>

host填mysql,就是MySQL容器的名字。

六、容器IP会变吗?

会的。

容器重启后,IP可能会变。所以不要硬编码IP,用容器名通信最稳。

如果要固定IP: 用自定义网络,指定静态IP。

# docker-compose.yml
services:
  mysql:
    networks:
      mynet:
        ipv4_address: 172.20.0.10

常见坑

坑1:inspect输出太多,找不到IP

解决: 用 -f 参数过滤,只看你要的字段。

坑2:容器停了就看不到IP

容器停止状态下,IPAddress是空的。

解决: 先启动容器:docker start 容器名

坑3:不同网络的容器互相ping不通

原因: 容器在不同网络里。

解决: 把它们加到同一个网络:

docker network connect mynet 容器名

坑4:用容器名ping不通

原因: 不是默认网络,或者Docker版本太老。

解决: 用自定义网络,或者直接用IP。

坑5:host网络模式看不到IP

用 --network=host 启动的容器,IP和宿主机一样。

解决: 不用查了,就是宿主机的IP。

总结

常用命令:

命令 说明
docker inspect 容器名 看容器全部信息
docker inspect -f '{{.NetworkSettings.IPAddress}}' 容器名 只看IP
docker inspect -f '{{.Mounts}}' 容器名 看挂载
docker inspect -f '{{.Config.Env}}' 容器名 看环境变量

记住: 容器之间用容器名通信,别硬编码IP,重启就变了。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-8 08:15