Docker网络模式详解,bridge、host、none
前言
Docker容器怎么联网的?bridge、host、none这些网络模式啥区别?本文一次讲清楚。
一、Docker网络模式
Docker有5种网络模式:
- bridge:默认模式,桥接网络
- host:主机网络,和宿主机共用
- none:无网络
- container:和另一个容器共用网络
- 自定义网络:自己建的网络
二、bridge模式(默认)
是什么
Docker默认的网络模式。每个容器有自己的虚拟网络,通过docker0网桥和宿主机通信。
特点
- 每个容器有自己的IP
- 容器之间可以通过容器名互相访问
- 外部要访问容器,要靠
-p端口映射
用法
docker run -d --name nginx -p 80:80 nginx
没指定 --network,默认就是bridge。
容器之间通信
docker run -d --name mysql mysql:5.7
docker run -d --name web --link mysql nginx
或者用自定义网络,容器名直接解析:
docker network create mynet
docker run -d --name mysql --network mynet mysql:5.7
docker run -d --name web --network mynet nginx
web容器里直接用 mysql 这个主机名就能连数据库。
三、host模式
是什么
容器直接用宿主机的网络,没有自己的虚拟网卡。
特点
- 没有独立IP,和宿主机共用
- 不用
-p映射,直接用宿主机的端口 - 性能最好,因为少了一层网络转发
- 安全性差点,容器直接暴露在宿主机网络上
用法
docker run -d --name nginx --network host nginx
注意
host模式下,-p 参数无效。容器用什么端口,直接就是宿主机的端口。
比如Nginx监听80,宿主机的80就被占了。
四、none模式
是什么
容器没有网络,完全断网。
特点
- 没有网卡,没有IP
- 只能通过localhost访问
- 适合不需要联网的任务,比如批量处理文件
用法
docker run -d --name test --network none nginx
查看
docker exec test ip addr
只能看到lo回环网卡。
五、container模式
是什么
新创建的容器和一个已有的容器共用网络。
特点
- 两个容器共用同一个网络命名空间
- 用
127.0.0.1就能互相访问 - 适合一个应用拆成多个容器的场景
用法
# 先跑一个web容器
docker run -d --name web nginx
# 再跑一个sidecar容器,和web共用网络
docker run -d --name sidecar --network container:web busybox
sidecar容器里 127.0.0.1 就是web容器的localhost。
六、自定义网络
创建网络
docker network create mynet
使用网络
docker run -d --name mysql --network mynet mysql:5.7
docker run -d --name redis --network mynet redis
好处
- 容器名自动解析,不用写IP
- 网络隔离,不同网络的容器不能互相访问
- 更灵活
查看网络
docker network ls
查看网络详情
docker network inspect mynet
七、常用命令
查看容器网络模式
docker inspect -f '{{.HostConfig.NetworkMode}}' 容器名
查看容器IP
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 容器名
查看所有网络
docker network ls
删除网络
docker network rm mynet
八、常见场景选什么模式
场景1:跑Web服务,要外网访问
选bridge,用 -p 映射端口。
场景2:追求高性能,比如数据库
选host,少一层转发,性能好。
场景3:不需要联网的任务
选none,安全。
场景4:两个容器紧耦合
选container,共用网络。
场景5:多容器编排
选自定义网络,容器名自动解析。
九、常见坑
坑1:容器之间ping不通
bridge模式下,容器之间默认是通的,但如果用了none就不通。
检查: 网络模式是什么?
docker inspect 容器名 | grep NetworkMode
坑2:host模式下端口冲突
host模式直接用宿主机端口,端口被占了就起不来。
检查: 宿主机端口有没有被占。
坑3:容器名解析不了
默认bridge网络不支持容器名解析。
解决: 用自定义网络。
坑4:改了网络模式,要重新建容器
网络模式是容器创建时定的,不能改。
解决: 删掉容器重新跑。
总结
记住:
- bridge:默认,端口映射,常用
- host:共用宿主机网络,性能好
- none:断网,安全
- container:和别的容器共用网络
- 自定义网络:容器名自动解析,推荐
最常用:
docker network create mynet
docker run -d --name nginx --network mynet nginx
遇到问题加QQ23979811 协助处理