十二、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
在这里插入图片描述

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网络。

# 查看网络详情
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网络默认就是可以在同一个网络进行互联的。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值