十二、docker学习-docker核心docker网络之bridge网络(2)

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
十二、docker学习-docker核心docker网络之bridge网络(2)_第1张图片

docker0详解

运行镜像
docker run -itd --name nginx1 -p 80:80 nginx:1.21.0-alpine

# 查看bridge网络详情。主要关注Containers节点信息。发现nginx1容器默认使用bridge网络
docker network inspect bridge

十二、docker学习-docker核心docker网络之bridge网络(2)_第2张图片

容器创建时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

十二、docker学习-docker核心docker网络之bridge网络(2)_第3张图片

查看网卡绑定关系
# 需要安装一个扩展
yum install -y bridge-utils
brctl show


流程图

十二、docker学习-docker核心docker网络之bridge网络(2)_第4张图片

多容器之间通讯

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

十二、docker学习-docker核心docker网络之bridge网络(2)_第5张图片

方式二:新建bridge网络
# 创建一个网络
# 参数-d指DRIVER的类型,后面的test-bridge是network的自定义名称,这个和docker0是类似的。
docker network create -d bridge test-bridge

十二、docker学习-docker核心docker网络之bridge网络(2)_第6张图片

将容器通过参数network connect来连接test-bridge网络。

# 查看网络详情
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)]

容器通信总结
  • 想要容器之间通过容器名进行互相访问docker提供了两种方式,分别是link和新建自己的bridge网络。
  • 通过link容器进行连接,但是是单向的,docker官方不推荐使用的。不利于扩展。
  • 通过自己创建的bridge网络默认就是可以在同一个网络进行互联的。

你可能感兴趣的:(docker,docker,网络,学习)