Docker 端口映射 20 个实用例子(覆盖 TCP/UDP、单机 / 集群、基础 / 进阶)【20251203】001篇

文章目录

一、Docker端口映射20个实用例子(覆盖TCP/UDP、单机/集群、基础/进阶)基础映射(1-8)进阶映射(9-16)集群/特殊场景(17-20)
二、Docker网络20个实用例子(覆盖默认网络、自定义网络、集群网络)默认网络(1-3)自定义bridge网络(4-10)跨主机/集群网络(11-16)网络管理与优化(17-20)
关键总结

一、Docker端口映射20个实用例子(覆盖TCP/UDP、单机/集群、基础/进阶)

端口映射核心语法:
-p [宿主机IP:][宿主机端口]:[容器端口][/协议]

-P
(大写)随机映射容器暴露的所有端口。

基础映射(1-8)

TCP基础映射(宿主机8080 → 容器80,默认TCP)


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

说明:外部通过
http://宿主机IP:8080
访问容器Nginx。

随机端口映射(容器80暴露为宿主机随机端口)


docker run -d -P --name nginx-random nginx

说明:用
docker port nginx-random
查看随机映射的宿主机端口。

多端口映射(同时映射80和443端口)


docker run -d -p 8080:80 -p 8443:443 --name nginx-multi nginx

说明:支持HTTP(8080)和HTTPS(8443)访问。

UDP端口映射(宿主机53 → 容器53,DNS服务常用)


docker run -d -p 53:53/udp --name dns-server bind9

说明:必须显式指定
/udp
,否则默认TCP。

绑定宿主机特定IP(仅192.168.1.100可访问容器80)


docker run -d -p 192.168.1.100:8080:80 --name nginx-ip nginx

说明:限制访问来源IP,增强安全性。

绑定宿主机所有IP(显式声明0.0.0.0,默认行为)


docker run -d -p 0.0.0.0:8080:80 --name nginx-all-ip nginx

说明:局域网和公网(若有公网IP)均可访问。

容器间端口依赖映射(先启MySQL,应用映射3306连接)


# 启动MySQL(暴露3306)
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql-db mysql:8
# 启动应用(连接宿主机3306 → 容器MySQL)
docker run -d -p 8080:8080 -e SPRING_DATASOURCE_URL=jdbc:mysql://宿主机IP:3306/test --name app-java java:17

说明:应用容器通过宿主机端口访问依赖服务(推荐生产用自定义网络,而非端口映射)。

持久化端口映射(容器重启后映射不变)


docker run -d -p 8080:80 --restart=always --name nginx-persist nginx

说明:
--restart=always
确保容器宕机后自动重启,端口映射同步生效。

进阶映射(9-16)

只读模式下的端口映射(容器文件系统只读,仅保留端口映射)


docker run -d -p 8080:80 --read-only --name nginx-readonly nginx

说明:增强容器安全性,防止恶意写入,仅端口映射正常工作。

跨网段IP映射(宿主机多网卡,绑定内网网段IP)


docker run -d -p 10.0.0.5:8080:80 --name nginx-inner nginx

说明:仅允许10.0.0.0/24网段访问容器。

环境变量动态指定端口(Dockerfile定义EXPOSE,运行时传参)


# Dockerfile
FROM nginx
EXPOSE 80

# 构建镜像后,通过环境变量指定宿主机端口
docker run -d -p ${HOST_PORT:-8080}:80 --name nginx-env nginx-custom

说明:未设置
HOST_PORT
时默认用8080。

Docker Compose单服务多端口(yaml配置)


# docker-compose.yml
version: '3'
services:
  nginx:
    image: nginx
    ports:
      - "8080:80"
      - "8443:443"

说明:执行
docker-compose up -d
启动,支持多端口批量配置。

Docker Compose多服务端口(前后端分离)


# docker-compose.yml
version: '3'
services:
  frontend:
    image: vue-app
    ports:
      - "80:80"
  backend:
    image: springboot-app
    ports:
      - "8080:8080"

说明:前端80端口、后端8080端口分别映射,独立访问。

端口映射+健康检查(健康时才提供服务)


docker run -d -p 8080:80 --health-cmd "curl -f http://localhost:80 || exit 1" --health-interval 10s --name nginx-health nginx

说明:10秒检查一次容器内80端口,不健康时
docker ps
显示
unhealthy

限制访问来源的端口映射(结合iptables,仅允许192.168.1.0/24访问)


docker run -d -p 8080:80 --name nginx-restrict nginx
# 配置iptables规则
iptables -A INPUT -p tcp --dport 8080 ! -s 192.168.1.0/24 -j DROP

说明:仅内网网段可访问,拒绝外部IP。

动态端口映射脚本(批量启动3个Nginx,映射8081-8083)


for i in {1..3}; do
  docker run -d -p 808$i:80 --name nginx-$i nginx
done

说明:循环创建容器,端口按序号递增,适合测试集群。

集群/特殊场景(17-20)

Swarm服务端口映射(集群暴露端口,支持服务发现)


# 先初始化Swarm
docker swarm init
# 部署服务,映射宿主机80 → 服务80(集群内自动负载均衡)
docker service create --name nginx-swarm -p 80:80 --replicas 3 nginx

说明:Swarm模式下,所有节点的80端口均可访问,自动转发到健康副本。

容器端口映射到宿主机临时端口(测试用,避免端口冲突)


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

说明:宿主机随机分配一个空闲端口(可通过
docker port nginx-temp
查看)。

TCP+UDP混合映射(同时映射两种协议,如游戏服务器)


docker run -d -p 27015:27015/tcp -p 27015:27015/udp --name game-server steamcmd

说明:支持TCP(连接)和UDP(数据传输)协议。

Dockerfile声明暴露端口后映射(规范容器端口)


# Dockerfile
FROM nginx
EXPOSE 80 443  # 声明暴露的端口(仅文档作用,运行时仍需-p映射)

docker build -t nginx-expose .
docker run -d -p 8080:80 -p 8443:443 --name nginx-expose-run nginx-expose

说明:
EXPOSE
仅用于说明容器需暴露的端口,不自动映射,需配合
-p
使用。

二、Docker网络20个实用例子(覆盖默认网络、自定义网络、集群网络)

Docker网络类型:
bridge
(默认)、
host
(共享宿主机网络)、
none
(无网络)、
overlay
(跨主机集群网络)、
macvlan
/
ipvlan
(物理网络直连)。

默认网络(1-3)

使用默认bridge网络运行容器(无需手动创建)


docker run -d --name nginx-bridge nginx

说明:默认加入
bridge
网络,容器间可通过IP通信(需
docker inspect
获取IP),不支持容器名互通。

使用host网络(共享宿主机网络栈)


docker run -d --net=host --name nginx-host nginx

说明:容器直接使用宿主机IP和端口,无需
-p
映射(容器80端口=宿主机80端口),性能最优但隔离性差。

使用none网络(容器无网络连接)


docker run -d --net=none --name nginx-none nginx

说明:容器无法访问外部网络,外部也无法访问容器,仅用于内部处理(如离线任务)。

自定义bridge网络(4-10)

创建自定义bridge网络(支持容器名互通)


# 创建网络
docker network create my-bridge
# 启动容器加入网络
docker run -d --net=my-bridge --name nginx1 nginx
docker run -d --net=my-bridge --name nginx2 nginx

说明:
nginx1
可通过
ping nginx2
通信(默认bridge网络不支持),自动DNS解析。

容器加入多个自定义网络(多网络互通)


# 创建两个网络
docker network create net1
docker network create net2
# 启动容器加入net1
docker run -d --net=net1 --name app app-image
# 再将容器加入net2(--network-alias指定别名)
docker network connect --network-alias app-net2 net2 app

说明:
app
容器可与
net1

net2
中的所有容器通信,不同网络用不同别名。

自定义bridge网络指定子网和网关


docker network create --subnet=172.20.0.0/16 --gateway=172.20.0.1 my-subnet-bridge

说明:指定容器IP网段为172.20.0.0/16,网关172.20.0.1,避免IP冲突。

将运行中的容器加入网络


# 启动容器(默认加入bridge)
docker run -d --name nginx-run nginx
# 加入自定义网络my-bridge
docker network connect my-bridge nginx-run

说明:容器可同时属于多个网络,灵活调整网络环境。

自定义网络DNS配置(指定DNS服务器)


docker network create --dns=8.8.8.8 --dns=114.114.114.114 my-dns-bridge

说明:该网络下的容器优先使用指定的DNS(谷歌DNS+国内DNS),解决DNS解析问题。

自定义网络限速(限制容器带宽)


docker network create --limit-rate 10mbps my-limit-bridge
docker run -d --net=my-limit-bridge --name nginx-limit nginx

说明:限制容器上行/下行带宽为10Mbps,支持
kbps
/
mbps
单位。

网络隔离(不同自定义网络容器不通)


# 创建两个独立网络
docker network create net-a
docker network create net-b
# 分别启动容器
docker run -d --net=net-a --name app-a app-image
docker run -d --net=net-b --name app-b app-image

说明:
app-a
无法访问
app-b
,实现网络隔离(适合多环境隔离)。

跨主机/集群网络(11-16)

创建overlay网络(Swarm跨主机集群网络)


# 初始化Swarm(管理节点)
docker swarm init
# 创建overlay网络(自动跨主机同步)
docker network create -d overlay my-overlay
# 部署服务到overlay网络
docker service create --name nginx-overlay --net=my-overlay -p 80:80 --replicas 5 nginx

说明:Swarm集群中,不同节点的容器通过overlay网络互通,支持服务发现和负载均衡。

创建macvlan网络(容器直连物理网络)


# 父网卡为eth0(宿主机物理网卡),子网与物理网络一致
docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 -o parent=eth0 my-macvlan
# 启动容器,指定静态IP
docker run -d --net=my-macvlan --ip=192.168.1.100 --name nginx-macvlan nginx

说明:容器直接获取物理网络IP,与宿主机、其他物理设备平级通信,适合需要独立IP的场景。

创建ipvlan网络(L2模式,共享宿主机MAC)


docker network create -d ipvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 -o parent=eth0 -o mode=l2 my-ipvlan
docker run -d --net=my-ipvlan --ip=192.168.1.101 --name nginx-ipvlan nginx

说明:与macvlan类似,但容器共享宿主机MAC地址,减少物理网络MAC占用。

Docker Compose多网络配置(前后端+数据库隔离)


# docker-compose.yml
version: '3'
networks:
  frontend-net:  # 前端网络
  backend-net:   # 后端网络
  db-net:        # 数据库网络(仅后端可访问)
services:
  frontend:
    image: vue-app
    networks: [frontend-net]
    ports: ["80:80"]
  backend:
    image: springboot-app
    networks: [frontend-net, backend-net, db-net]  # 跨3个网络
    ports: ["8080:8080"]
  db:
    image: mysql:8
    networks: [db-net]
    environment: ["MYSQL_ROOT_PASSWORD=123456"]

说明:数据库仅暴露给后端,前端无法直接访问,增强安全性。

Swarm服务连接外部overlay网络


# 已有外部overlay网络ext-overlay
docker service create --name app-swarm --net=ext-overlay --replicas 3 app-image

说明:复用现有overlay网络,实现不同服务间跨主机通信。

跨主机网络通信(非Swarm,使用weave驱动)


# 节点1安装weave
curl -L https://github.com/weaveworks/weave/releases/download/latest_release/weave -o /usr/local/bin/weave
chmod +x /usr/local/bin/weave
weave launch
# 节点2连接节点1(节点1IP为192.168.1.10)
weave launch 192.168.1.10
# 节点1启动容器
weave run 10.0.0.1/24 --name app1 app-image
# 节点2启动容器
weave run 10.0.0.2/24 --name app2 app-image

说明:无需Swarm,通过weave驱动实现跨主机容器互通。

网络管理与优化(17-20)

引用外部网络(Docker Compose复用现有网络)


# docker-compose.yml
version: '3'
networks:
  existing-net:
    external: true  # 引用已存在的网络(需提前创建)
services:
  app:
    image: app-image
    networks: [existing-net]

说明:避免重复创建网络,适合多项目复用同一网络。

网络健康检查(检测网络连通性)


docker network create --health-cmd "ping -c 1 8.8.8.8 || exit 1" --health-interval 30s my-health-net
docker run -d --net=my-health-net --name app-health app-image

说明:30秒检查一次网络连通性(ping谷歌DNS),网络异常时可通过
docker network inspect
查看。

为网络添加标签(管理和筛选)


docker network create --label env=test --label owner=dev my-label-net
# 筛选标签为env=test的网络
docker network ls --filter "label=env=test"

说明:通过标签分类网络(如测试/生产环境),方便批量管理。

清理无用网络(删除未使用的网络)


# 交互式删除未使用网络
docker network prune
# 强制删除(无需确认)
docker network prune -f
# 删除指定未使用网络
docker network rm my-unused-net

说明:清理冗余网络,释放宿主机资源(默认不删除默认网络)。

关键总结

端口映射:优先使用自定义端口避免冲突,UDP需显式声明,Swarm模式用
docker service create -p
暴露集群端口。网络选择
单机多容器通信:用自定义bridge网络(支持容器名互通);跨主机集群:用overlay网络(Swarm)或第三方驱动(weave);需独立物理IP:用macvlan/ipvlan网络;极致性能+无隔离:用host网络;离线任务:用none网络安全性:通过网络隔离(多自定义网络)、限制访问IP、只读容器等方式增强安全。

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
郑州发布的头像 - 鹿快
评论 抢沙发

请登录后发表评论

    暂无评论内容