做容器运维、微服务联调、中间件集群部署时,90%网络故障根源:容器默认使用bridge网桥,容器之间无法精准互通、外网权限不可控、多环境网络混杂。
很多新手直接docker run启动容器,直接复用默认bridge网络,导致Redis、MySQL、Dinky、Flink容器跨容器访问失败、端口冲突、外网裸奔不安全。本文一文讲透:Docker网络分类、run命令指定网络、自建网桥、容器互通、网络隔离、Docker Compose指定组网全套实操,命令可直接复制复用。
一、先搞懂:Docker 4种原生网络(必看基础)
安装Docker后自动内置4个网络,执行命令查看全部网络:
# 查看docker所有网络列表
docker network ls
四大网络作用区分
- bridge(默认网桥):容器默认网络,同一网络容器互通,外网可映射端口,适合单机临时测试
- host:直接复用宿主机网卡,容器无独立IP,端口和宿主机完全共用,性能最高
- none:禁用所有网络,容器无网卡无IP,完全隔离,安全性最高
- 自定义bridge:运维推荐组网!支持域名自动解析、按需分组隔离、跨容器便捷互通,生产环境首选
核心结论:生产绝对不要用默认bridge,自建自定义网桥,手动指定网络启动容器
二、核心语法:docker run 指定网络启动命令
1. 关键参数
--network 网络名:启动容器绑定指定Docker网络
简写兼容写法:--net 网络名
2. 通用完整模板
docker run -d \
--name 容器名 \
--network 目标网络名 \
-p 宿主机端口:容器端口 \
镜像名称
三、四大场景实操:指定不同网络启动容器
场景1:绑定默认bridge网络启动(不推荐生产)
不指定–network时默认绑定,手动指定写法如下:
# 指定默认网桥启动Nginx
docker run -d --name nginx-bridge --net bridge -p 80:80 nginx
缺点:容器只能通过IP互通,不支持容器名域名解析,运维不方便。
场景2:绑定host宿主机网络启动
适配:高性能中间件、监控Agent、需要占用宿主机网卡服务
# 复用宿主机网络,无需端口映射
docker run -d --name redis-host --net host redis
注意:host模式不支持-p端口映射,直接使用宿主机端口。
场景3:绑定none无网络隔离启动
适配:纯本地计算、不需要联网、高危程序隔离运行
# 完全切断外网+内网网络
docker run -d --name safe-app --net none alpine
场景4:【生产常用】绑定自定义网桥启动
第一步:创建专属自定义网桥
# 创建自定义网桥,命名dinky-net,适配大数据组件组网
docker network create dinky-net
第二步:指定自定义网络启动多个容器
同一自定义网络内,可直接使用容器名称互相访问,无需查询容器IP
# 1.指定网络启动MySQL
docker run -d --name mysql-dinky \
--network dinky-net \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:8.0
# 2.同网络启动Dinky,直接通过mysql-dinky域名连通数据库
docker run -d --name dinky-web \
--network dinky-net \
-p 8888:8888 \
dinkydocker/dinky:1.2.0
优势:Dinky配置jdbc连接地址直接写mysql-dinky:3306,IP变更无需修改配置。
四、已有容器:后期修改绑定Docker网络
容器已经启动,不想重建容器,直接更换所属网络,两条命令搞定:
# 1.移出原有网络
docker network disconnect 原网络名 容器名
# 2.加入新指定网络
docker network connect 新网络名 容器名
实操示例:把已启动的Dinky加入大数据组网
docker network disconnect bridge dinky-web
docker network connect dinky-net dinky-web
五、Docker Compose 全局指定自定义网络
企业项目全部使用compose编排,可自定义全局网络,统一所有容器组网隔离,yaml标准模板可直接复用:
version: '3.8'
# 自定义全局网络
networks:
bigdata-net:
driver: bridge # 网桥模式
services:
mysql:
image: mysql:8.0
container_name: mysql
networks:
- bigdata-net # 指定归属网络
ports:
- "3306:3306"
dinky:
image: dinkydocker/dinky:1.2.0
container_name: dinky
networks:
- bigdata-net # 同网络自动互通
ports:
- "8888:8888"
执行启动:docker-compose up -d,所有容器自动归入bigdata-net网络。
六、高频报错+运维避坑指南
报错1:network not found
原因:指定网络未创建,先执行docker network create 网络名,再启动容器
报错2:host网络启动失败
原因:Docker Desktop桌面版(Windows/Mac)不支持host网络,仅Linux服务器Docker支持host模式
避坑1:不同自定义网络默认完全隔离
容器A在net1、容器B在net2,默认无法互通,需要手动docker network connect组网打通
避坑2:默认bridge不支持容器域名解析
这是最多人踩坑点!默认网桥只能IP互通,自建网桥才支持容器名访问。
七、Docker网络常用精简命令合集
# 查看网络详情、关联容器IP
docker network inspect 网络名
# 删除无用空置网络,释放资源
docker network prune
# 删除指定自定义网络(需先移出所有容器)
docker network rm 网络名
八、生产组网最佳实践总结
- 单机项目:统一自建自定义bridge网桥,所有业务容器统一入网
- 高性能组件:Linux环境使用host网络,最大化网络传输性能
- 对外隔离服务:使用none网络,杜绝外网攻击访问
- Compose项目:yaml顶部声明专属网络,环境拆分、网络互不干扰
- 禁止业务容器直接使用Docker默认bridge网络组网
后续更新Docker跨主机网络组网、固定容器IP组网教程,容器网络问题欢迎留言交流✨