Docker的3种自定义网络(bridge、overlay、macvlan)

感谢大佬:https://blog.csdn.net/weixin_43936969/article/details/105687979

前言

Docker 提供三种 user-defined 网络驱动:bridge
overlaymacvlan 用于创建跨主机的网络

自定义网络

自定义网络需要使用create命令,先来看看create命令可以跟哪些参数
原生网络不存在域名解析,但是自定义网络存在域名解析
在这里插入图片描述

bridge模式

在这里插入图片描述

创建桥接模式网络并查看(my_net1[自己命名])

创建自定义的bridge网络并且查看
创建一个bridge模式的网络
由上图我们可以看到创建的网络ID ,使用ip addr查看本机网络:

[root@server1 ~]# docker network create -d bridge my_net1
c0ea578da8ded1a686bb92d222aa08e57d3ccae0263b4cc5a4ed40bf27085ec6
[root@server1 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
ebe1319bd402        bridge              bridge              local
73d43be8de20        host                host                local
c0ea578da8de        my_net1             bridge              local
0a62de6bab53        none                null                local
[root@server1 ~]# 

在这里插入图片描述

运行两个容器并指定同一个已创建的自定义网络
1. 运行容器vm1并且指定网络模式为刚才自定义的bridge模式

可以看到ip地址和宿主机的ip不在一个网段

[root@server1 ~]# docker run -it --name vm1 --network my_net1 busybox
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
27: eth0@if28: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:13:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.19.0.2/16 brd 172.19.255.255 scope global eth0
       valid_lft forever preferred_lft forever
/ # 

在这里插入图片描述

2. 运行容器vm2并同样指定该网络

发现ip地址也是递增,并且容器之间具有域名解析,可以ping通
在这里插入图片描述
在这里插入图片描述

创建自定义桥接模式网络的同时指定网段与网关(my_net2[自己命名])

自定义的bridge模式也可以自己指定ip网段网关
在这里插入图片描述

[root@server1 ~]# docker network create --subnet 172.20.0.0/24 --gateway 172.20.0.1 my_net2
50e59286b0e962147c728bfe4ab34782ad6e27bef5b64fb6609cada19ace3e4b
[root@server1 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
ebe1319bd402        bridge              bridge              local
73d43be8de20        host                host                local
c0ea578da8de        my_net1             bridge              local
50e59286b0e9        my_net2             bridge              local
0a62de6bab53        none                null                local
[root@server1 ~]# 

在这里插入图片描述
这时可以在宿主机的网络信息中查看到Docker自定义网络的信息
在这里插入图片描述

两次创建自定义网络的区别

查看一下刚才自定义的网络my_net1my_net2
my_net1的网段没有指定,那就是以宿主机桥接的网段为基础递增

docker的bridge自定义网络之间默认是有域名解析的
docker的bridge自定义网络与系统自带的网桥之间默认是有解析的
但是docker的系统自带的网桥之间默认是没有解析的

为容器指定自定义网络中的IP启动

前提:必须是本自定义网络范围内的IP才可以
在这里插入图片描述

[root@server1 ~]# docker run -it --name vm1 --network my_net2 --ip 172.20.0.10 busybox
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
37: eth0@if38: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:14:00:0a brd ff:ff:ff:ff:ff:ff
    inet 172.20.0.10/24 brd 172.20.0.255 scope global eth0
       valid_lft forever preferred_lft forever
/ # 

在这里插入图片描述

[root@server1 ~]# docker run -it --name vm2 --network my_net2 --ip 172.20.0.100 busybox
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
39: eth0@if40: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:14:00:64 brd ff:ff:ff:ff:ff:ff
    inet 172.20.0.100/24 brd 172.20.0.255 scope global eth0
       valid_lft forever preferred_lft forever
/ # ping vm1
PING vm1 (172.20.0.10): 56 data bytes
64 bytes from 172.20.0.10: seq=0 ttl=64 time=0.088 ms
64 bytes from 172.20.0.10: seq=1 ttl=64 time=0.069 ms
64 bytes from 172.20.0.10: seq=2 ttl=64 time=0.082 ms
^C
--- vm1 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.069/0.079/0.088 ms
/ # 

在这里插入图片描述
此时在一个网段的容器仍然可以ping通

刚才在以my_net2为基础运行了两个容器vm1和vm2,网段是172.20.0,可以互相ping通
接下来在以my_net1为基础运行两个容器vm3和vm4,网段是172.18.0,也可以互相ping通

发现vm1、vm2和vm3、vm4ping不通
因为在宿主机上定义的两个网络my_net1和my_net2就不在一个网段
因此基于这两种网络运行起来的容器肯定ping不通

不同网桥上的容器通信

在这里插入图片描述
在这里插入图片描述

实现方式

两种网络之间的通信(my_net1my_net2

给vm1容器添加一块my_net1的网卡,就可以和my_net2的容器vm3、vm4进行通信了
建立两个容器之间的连接
简而言之,就是想让不同自定义网络的哪个容器与另一个网络的容器通信,就给哪个容器加一块它本网络的网卡。

[root@server1 ~]# docker network connect my_net1 vm1
[root@server1 ~]# docker container attach vm1 
/ # ping vm3
PING vm3 (172.19.0.2): 56 data bytes
64 bytes from 172.19.0.2: seq=0 ttl=64 time=0.091 ms
64 bytes from 172.19.0.2: seq=1 ttl=64 time=0.118 ms
^C
--- vm3 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.091/0.104/0.118 ms
/ # 

在这里插入图片描述
在这里插入图片描述

图示

在这里插入图片描述

总结

上面简单实现了同一宿主机上不同网段容器之间的通信。
以上我们实现了:使用自定义网络实现容器间的通信

  • docker的bridge自定义网络之间:双方可以随便添加对方的网卡
  • docker的bridge自定义网络与系统自带的网桥之间:只能是,系统自带的网桥对应的容器 添加bridge自定义网络对应的容器的网卡。而反过来会报错。
  • 但是docker的系统自带的网桥之间:是可以通信的,因为是在一个网络桥接上。
  • docker 1.10开始,内嵌了一个DNS server。dns解析功能必须在自定义网络中使用
  • Docker的3种自定义网络(bridge、overlay、macvlan)

补充

  • 使用--ip参数可以指定容器ip地址,但必须是在自定义网桥上(自定义的ip地址和网关地址)默认的bridge模式不支持,同一网桥上的容器是可以通信的
  • 快捷键:ctrl+p+q,后台退出继续保持容器运行
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值