文章目录
- 一、源生网络
- 1.docker 的网桥---bridge
- 2.host网络模型
- 3.none 网络模型
- 二、自定义网络模型
- 1.bridge驱动
- 2.指定网关和子网
- 3.自定义网络其中内嵌dns解析
- 4.不同网段的容器通信
一、源生网络
我们先把server7上的harbor仓库down掉,然后查看网络,可以看到Docker 自带的三种网络模型
1.docker 的网桥—bridge
默认使用桥接模式,桥接到docker0上
此时我们启动一个容器、安装网桥工具 :
[root@server7 ~]# docker run -d --name demo nginx
[root@server7 ~]# yum install -y bridge-utils
[root@server7 ~]# brctl show ##可以查看容器的网络
bridge name bridge id STP enabled interfaces
docker0 8000.0242ea04cb8d no veth6725905
容器网络veth9b… 以桥接的形式连接到了我们的宿主机网络docker0上。
从火墙策略可以看出172.17.0 时所有容器的地址,172.17.0.1是容器网关,所有容器的IP地址是在此网段内以递增的方式动态分配的。如果容器停止,那么占用的IP就会被释放出来分配给其他容器。由于此种机制,容器重启之后和原来的IP地址是不一样的
但是此种机制有一个问题:没有公有IP,即外部无法访问内部网络。 但是容器通过宿主机的NAT规则后可以访问外网。容器通过虚拟网卡将数据包传给docker0网桥,再由Linux内核,数据包路由到eth0出去。
2.host网络模型
我们使用host网络模型再启动一个容器,使用此种模型不会新建网卡,我们在已经开启的容器的demo2中,开启一个交互式终端:
进入容器查看网络发现和宿主机一模一样, 所以现在直接访问宿主机的IP地址就能访问到这个容器。
可以ping通18主机
[root@server7 ~]# docker run -it --rm --network host --name demo2 busybox
host模式可以让容器共享宿主机网络栈,这样的好处是外部主机与容器直接通信,但是容器的网络缺少隔离性。
测试:
删掉多余容器,直接访问虚拟机IP即可访问到容器。(以前为实验有端口访问)
3.none 网络模型
none禁用网络,只用回环接口,当没有必要连接外部网络时可以使用此网络模型。
[root@server7 ~]# docker run -it --rm --network none busybox
容器之间的隔离
所有开启的容器都有一个Pid,就相当于主机的一个进程。
容器的6个命名空间:
不在这六个命名空间的进程或者变量是没有做隔离的,即各个容器包括宿主机之间是共享的。
二、自定义网络模型
自定义网络模式,docker提供了三种自定义网络驱动: bridge overlay macvlan
1.bridge驱动
[root@server7 ~]# docker network create my_net1
新建网络和原有bridge网络区别为自定义网络有DNS解析。我们发现容器之间ping IP能ping通,ping 主机名ping不同:
使用自定义网络新建容器:
用docker inspect demo查看详细IP信息:
使用自定义网络创建容器并开启终端:
发现ping主机名能直接ping通。
停掉demo,再创建nginx容器demo1:
再将demo启动起来:
这么做的目的是为了释放原来demo的IP,原来的IP为172.18.0.2 ,将此IP释放出来同时启动demo1时,0.2的IP就会被分配给demo1,demo再次启动时会被分配给后面的地址。
可以看到demo变成了0.3,demo1变成了0.2。
2.指定网关和子网
使用bridge自定义网络时,我们也可以手动指定网关和子网,在创建时指定参数:–subnet 、–gateway
删除之前的环境:
指定子网以及网关:
3.自定义网络其中内嵌dns解析
再次创建my_net1用于实验
可以ping通容器名
4.不同网段的容器通信
web1
[root@server7 ~]# docker run -d --name web1 --network my_net1 nginx
不同网络之间是被隔离的,默认不能通信
不同网络之间的通信需要附加虚拟网卡
ctrl+pq 快捷键退出容器终端
并把demo接入到my_net1网络
[root@server7 ~]# docker network connect my_net1 demo
再进入容器,可ping通
[root@server7 ~]# docker attach demo
/ # ping web1
PING web1 (172.20.0.2): 56 data bytes
64 bytes from 172.20.0.2: seq=0 ttl=64 time=0.079 ms
就相当于给容器加一块不同网段的网卡来连接不同的网络: