bridge网络
bridge网络表现形式就是docker0这个网络接口。容器默认都是通过docker0这个接口进行通信。也可以通过docker0去和本机的以太网接口连接,这样容器内部才能访问互联网。
# 查看docker0网络,在默认环境中,一个名为docker0的linux bridge自动被创建好了,其上有一个 docker0 内部接口,IP地址为172.17.0.1/16
ip a
# 查看docker 网络
docker network ls
# 查看bridge网络详情。主要关注Containers节点信息。
docker network inspect bridge
ip a
docker network ls
docker network inspect bridge
docker0详解
运行镜像
docker run -itd --name nginx1 -p 80:80 nginx:1.21.0-alpine
# 查看bridge网络详情。主要关注Containers节点信息。发现nginx1容器默认使用bridge网络
docker network inspect bridge
容器创建时IP地址的分配
# 查看docker100主机网络。发现多出一块网卡veth094ff04@if6
ip a
Docker创建容器网络流程
Docker 创建一个容器的时候,会执行如下操作:
- 创建一对虚拟接口/网卡,也就是veth pair,分别放到本地主机和新容器中;
- 本地主机一端桥接到默认的 docker0 或指定网桥上,并具有一个唯一的名字,如 veth094ff04;
- 容器一端放到新容器中,并修改名字作为 eth0,这个网卡/接口只在容器的名字空间可见;
- 从网桥可用地址段中(也就是与该bridge对应的network)获取一个空闲地址分配给容器的 eth0,并配置默认路由到桥接网卡 veth094ff04。
完成这些之后,容器就可以使用 eth0 虚拟网卡来连接其他容器和其他网络。
如果不指定–network,创建的容器默认都会挂到 docker0 上,使用本地主机上 docker0 接口的 IP 作为所有容器的默认网关。
查看容器ip
# 方式一
docker exec -it nginx1 sh
ip a
# 方式二
docker exec -it nginx1 ip a
查看网卡绑定关系
# 需要安装一个扩展
yum install -y bridge-utils
brctl show
流程图
多容器之间通讯
IP通信测试
# 创建两个nginx容器进行通信
docker run -itd --name nginx1 nginx:1.21.0-alpine
docker run -itd --name nginx2 nginx:1.21.0-alpine
docker network inspect bridge
# 进入nginx1进行ping测试
docker exec -it nginx1 sh
ping 172.17.0.3
# 进入nginx2进行ping测试
docker exec -it nginx2 sh
ping 172.17.0.2
# ping外网测试
ping www.baidu.com
容器名通信测试
docker exec -it nginx2 ping nginx1
docker exec -it nginx1 ping nginx2
启动顺序不同ip不同
# 启动顺序不同ip互换了
docker run -itd --name nginx2 nginx:1.21.0-alpine
docker run -itd --name nginx1 nginx:1.21.0-alpine
问题【容器名无法通信】
通过容器名ping不通,证明无法通过容器名进行通信,但是由于ip是随机生成的每次启动都会变,如何解决?
容器名通信方式
方式一:link容器
–link=[]: 添加链接到另一个容器;【不推荐使用】
不推荐原因
- 需要手动指定那个容器需要可以进行连接;
- 集群增加新的节点如果需要进行连接需要重新操作;
- link关系是单向的,不可逆;
- docker官网已经不推荐我们使用link参数;
- docker用其他方式替换掉link参数;
使用方式
docker run -itd --name nginx2 --link nginx1 nginx:1.21.0-alpine
# 可ping通
docker exec -it nginx2 ping 172.17.0.2
docker exec -it nginx2 ping nginx1
# 无法ping通【link关系是单向的,不可逆】
docker exec -it nginx1 ping nginx2
方式二:新建bridge网络
# 创建一个网络
# 参数-d指DRIVER的类型,后面的test-bridge是network的自定义名称,这个和docker0是类似的。
docker network create -d bridge test-bridge
将容器通过参数network connect来连接test-bridge网络。文章来源:https://www.toymoban.com/news/detail-500393.html
# 查看网络详情
brctl show
docker network ls
docker network inspect lagou-bridge
# 创建容器两个容器 nginx1,nginx2
docker run -itd --name nginx1 --network test-bridge nginx:1.21.0-alpine
docker run -itd --name nginx2 --network test-bridge nginx:1.21.0-alpine
# ping一下
docker exec -it nginx2 ping nginx1
docker exec -it nginx1 ping nginx2
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U0aG8cQG-1687093570008)(file:///Users/yangcun/Documents/学习/Markdown/images/docker.assets/image-20210706102818505.png?msec=1687092439628)]文章来源地址https://www.toymoban.com/news/detail-500393.html
容器通信总结
- 想要容器之间通过容器名进行互相访问docker提供了两种方式,分别是link和新建自己的bridge网络。
- 通过link容器进行连接,但是是单向的,docker官方不推荐使用的。不利于扩展。
- 通过自己创建的bridge网络默认就是可以在同一个网络进行互联的。
到了这里,关于十二、docker学习-docker核心docker网络之bridge网络(2)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!