文章目录
一、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
说明:外部通过 访问容器Nginx。
http://宿主机IP:8080
随机端口映射(容器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
说明:必须显式指定 ,否则默认TCP。
/udp
绑定宿主机特定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
说明:未设置时默认用8080。
HOST_PORT
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
说明:默认加入网络,容器间可通过IP通信(需
bridge获取IP),不支持容器名互通。
docker inspect
使用host网络(共享宿主机网络栈)
docker run -d --net=host --name nginx-host nginx
说明:容器直接使用宿主机IP和端口,无需映射(容器80端口=宿主机80端口),性能最优但隔离性差。
-p
使用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 通信(默认bridge网络不支持),自动DNS解析。
ping nginx2
容器加入多个自定义网络(多网络互通)
# 创建两个网络
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、只读容器等方式增强安全。















暂无评论内容