我们先把server1上的harbor仓库down掉,然后查看网络:
1.1 Docker 自带的三种网络模型1.1.1 docker 的网桥---bridge
先安装网桥工具:
此时我们启动一个容器:
可以查看容器的网络:
容器网络veth1c... 以桥接的形式连接到了我们的宿主机网络docker0上。
从火墙策略可以看出172.17.0 时所有容器的地址,172.17.0.1是容器网关,所有容器的IP地址是在此网段内以递增的方式动态分配的。如果容器停止,那么占用的IP就会被释放出来分配给其他容器。由于此种机制,容器重启之后和原来的IP地址是不一样的,
但是此种机制有一个问题:没有公有IP,即外部无法访问内部网络。 但是容器通过宿主机的NAT规则后可以访问外网。容器通过虚拟网卡将数据包传给docker0网桥,再由Linux内核,数据包路由到eth0出去。
1.1.2 host网络模型我们使用host网络模型再启动一个容器:
使用此种模型不会新建网卡,我们在已经开启的容器的demo2中,开启一个交互式终端:
进入容器查看网络发现和宿主机一模一样:
所以现在直接访问宿主机的IP地址就能访问到这个容器。
host模式可以让容器共享宿主机网络栈,这样的好处是外部主机与容器直接通信,但是容器的网络缺少隔离性。
删掉容器:
测试:
直接访问虚拟机IP即可访问到容器。
1.1.3 none 网络模型利用none网络启一个容器:
当没有必要连接外部网络时可以使用此网络模型。
二、 自定义网络模型容器之间的隔离
所有开启的容器都有一个Pid,就相当于主机的一个进程。
容器的6个命名空间:
不在这六个命名空间的进程或者变量是没有做隔离的,即各个容器包括宿主机之间是共享的。
自定义网络模式,docker提供了三种自定义网络驱动: bridge overlay macvlan
2.2.1 bridge驱动新建网络和原有bridge网络区别为自定义网络有DNS解析。我们发现容器之间ping IP能ping通,ping 主机名ping不同:
使用自定义网络新建容器:
使用docker inspect 查看详细IP信息:
使用自定义网络创建容器并开启终端:
发现ping主机名能直接ping通。
停掉demo1,再创建nginx容器demo2:
再将demo1启动起来:
这么做的目的是为了释放原来demo1的IP,原来的IP为172.18.0.2 ,将此IP释放出来同时启动demo2时,0.2的IP就会被分配给demo2,demo1再次启动时会被分配给后面的地址。
可以看到demo1变成了0.3,demo2变成了0.2。
2.2.2 指定网关和子网使用bridge自定义网络时,我们也可以手动指定网关和子网,在创建时指定参数:--subnet 、--gateway
删除之前的环境:
指定子网以及网关:
此时我们创建容器就可以指定IP了:
2.2.3 不同网段的容器通信在此之上,我们再创建一个网络和相应的容器:
注:此种情况下,这两个不同网段的容器之间是不相通的。使用iptables -L 也可以看到所有的请求是被DROP掉的。
怎么使两个不同网段下的容器互通呢?
给我们刚刚开的终端加一块网卡:
此时再ping就能ping通了:
就相当于给容器加一块不同网段的网卡来连接不同的网络:



