1)机器环境准备: node-1 103.10.86.238 node-2 103.10.86.239 node-1宿主机上的应用容器my-test1: 192.168.0.2 /24 node-2宿主机上的应用容器my-test2: 192.168.0.3 /24 两台机上均安装Docker及Weave,并均启动好Weave路由容器(安装及启动操作如上)。最好关闭两台机器的防火墙!(如果打开防火墙,需要开放6783端口) 2)在两台机上均启动一个应用容器,有以下两种方式: 第一种方式:可以直接使用weave run命令; [root@node-1 ~] # weave run 192.168.0.2/24 -itd docker.io/centos /bin/bash The 'weave run' command has been removed as of Weave Net version 2.0 Please see release notes for further information 由上可知,weave在2.0版本之后就没有“docker run”这个命令了,所以还是使用下面的第二种方式 第二种方式:先使用docker run启动好容器,然后使用weave attach命令给容器绑定IP地址 在node-1机器上启动第一个容器my-test1,容器ip绑定为192.168.0.2 [root@node-1 ~] # docker run -itd --name=my-test1 docker.io/centos /bin/bash 06d70049141048798519bfa1292ed81068fc28f1e142a51d22afd8f3fc6d0239 [root@node-1 ~] # weave attach 192.168.0.2/24 my-test1 #使用容器名称或容器id都可以;即给my-test1容器绑定ip为192.168.0.2 192.168.0.2 [root@node-1 ~] # docker exec -ti my-test1 /bin/bash [root@00efd39d3a7d /] # ifconfig #执行安装yum install -y net-tools,就会出现ifconfig命令 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.17.0.2 netmask 255.255.0.0 broadcast 0.0.0.0 inet6 fe80::42:acff:fe11:2 prefixlen 64 scopeid 0x20<link> ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet) RX packets 5559 bytes 11893401 (11.3 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 5287 bytes 410268 (400.6 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ethwe: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1376 inet 192.168.0.2 netmask 255.255.255.0 broadcast 0.0.0.0 inet6 fe80::88b0:ddff:fea2:58c5 prefixlen 64 scopeid 0x20<link> ether 8a:b0: dd :a2:58:c5 txqueuelen 0 (Ethernet) RX packets 97 bytes 7234 (7.0 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 66 bytes 4316 (4.2 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 0 (Local Loopback) RX packets 21 bytes 2352 (2.2 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 21 bytes 2352 (2.2 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 在node-2机器上启动容器my-test2,容器ip绑定为192.168.0.3 [root@node-2 ~] # docker run -itd --name=my-test2 docker.io/centos /bin/bash 8f2ecc2449a0be1f1be2825cb211f275f9adb2109249ab0ff1ced6bbb92dd733 [root@node-2 ~] # weave attach 192.168.0.3/24 my-test2 //weave detach 192.168.0.3/24 my-test2表示删除这个绑定 192.168.0.3 [root@node-2 ~] # docker exec -ti my-test2 /bin/bash [root@e0ed62d30226 /] # ifconfig //或者ip addr命令查看 ...... ethwe: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1376 inet 192.168.0.3 netmask 255.255.255.0 broadcast 0.0.0.0 inet6 fe80::3064:8fff:fe3c:909a prefixlen 64 scopeid 0x20<link> ether 32:64:8f:3c:90:9a txqueuelen 0 (Ethernet) RX packets 63 bytes 4734 (4.6 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 34 bytes 2580 (2.5 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 温馨提示: 上面在docker run启动容器时,可以添加--net=none参数,这个表示容器启动后不使用默认的虚拟网卡docker0自动分配的ip,而是使用weave绑定的ip; 当然也可以选择不添加这个参数去启动容器,这样,容器启动后就会有两个网卡,即两个ip: 一个是docker0自动分配的ip,这个适用于同主机内的容器间通信,即同主机的容器使用docker0分配的ip可以相互通信;另一个就是weave网桥绑定的ip。 3)容器互联 默认情况下,上面在node-1和node-2两台宿主机上创建的2个容器间都是相互 ping 不通的。需要使用weave connect命令在两台weave的路由器之间建立连接。 [root@node-1 ~] # weave connect 103.10.86.239 //连接的是对方宿主机的ip,注意"weave forget ip" z则表示断开这个连接 然后就会发现,此时位于两台不同主机上的相同子网段内的容器之间可以相互 ping 通了 [root@node-1 ~] # docker exec -ti my-test1 /bin/bash [root@00efd39d3a7d /] # ping 192.168.0.3 PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data. 64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time =3.27 ms 64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time =0.657 ms ..... [root@node-2 ~] # docker exec -ti my-test2 /bin/bash [root@e0ed62d30226 /] # ping 192.168.0.2 PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data. 64 bytes from 192.168.0.2: icmp_seq=1 ttl=64 time =0.453 ms 64 bytes from 192.168.0.2: icmp_seq=2 ttl=64 time =0.320 ms ..... 再在node-1上启动容器my-test3,绑定ip为192.168.0.8,在node-2上启动容器my-test4,绑定ip为192.168.0.10 会发现这四个在同一个子网内的容器都是可以相互 ping 通的。 -------------------------------------------------------------------------------------------------------- 再接着启动与上面不在同一个子网内的容器 node-1上启动容器my-test4,绑定ip为192.168.10.10,node-2上启动容器my-test5,绑定ip为192.168.10.20 [root@node-1 ~] # docker run -itd --name=my-test5 docker.io/centos /bin/bash 2896b6cad7afcd57d8b9091a020f1837992bade2567752614caf3cb645b6d315 [root@node-1 ~] # weave attach 192.168.10.10/24 my-test5 192.168.10.10 [root@node-1 ~] # docker exec -ti my-test5 /bin/bash [root@2896b6cad7af /] # [root@node-2 ~] # docker run -itd --name=my-test6 docker.io/centos /bin/bash b4627f0a6e657f5dc719c917349ad832e15f360f75d5743b489f8e7e18b7dc2e [root@node-2 ~] # weave attach 192.168.10.20/24 my-test6 192.168.10.20 [root@node-2 ~] # docker exec -ti my-test6 /bin/bash [root@b4627f0a6e65 /] # ping 192.168.10.10 PING 192.168.10.10 (192.168.10.10) 56(84) bytes of data. 64 bytes from 192.168.10.10: icmp_seq=1 ttl=64 time =0.417 ms 64 bytes from 192.168.10.10: icmp_seq=2 ttl=64 time =0.324 ms ...... 会发现在跨主机情况下,相同子网内的容器是可以相互通信的;但是处于不同子网的两个容器是不能互联的,尽管这两个容器在同一个主机下也是不能通信的! 这样的好处就是:使用不同子网进行容器间的网络隔离了。 -------------------------------------------------------------------------------------------------------- 注意一个细节,在使用weave的时候: 1)如果使用Docker的原生网络,在容器内部是可以访问宿主机以及外部网络的。也就是说在启动容器的时候,使用了虚拟网卡docker0分配ip, 这种情况下,登陆容器后是可以 ping 通宿主机ip,并且可以对外联网的! 这个时候,在宿主机上是可以 ping 通docker0网桥的ip,但是 ping 不通weave网桥的ip。这个时候可以使用 "weave expose 192.168.0.1/24" 命令来给weave网桥添加IP,以实现容器与宿主机网络连通。如下: 默认在node-1和node-2宿主机上是 ping 不通my-test1容器的weave网桥ip的 [root@node-1 ~] # ping 192.168.0.2 PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data. ....... [root@node-2 ~] # ping 192.168.0.3 PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data. ....... 在node-1和node-2两台机器上都添加weave网桥的ip [root@node-1 ~] # weave expose 192.168.0.1/24 //注意这里的192.168.0.1/24是上面my-test1、my-test2、my-test3、my-test4容器的weave网桥的网关地址 [root@node-2 ~] # weave expose 192.168.0.1/24 //weave hide 192.168.0.1/24表示覆盖/删除这个设置 然后再在两台宿主机上 ping 上面同网段内的容器,发现都可以 ping 通了 [root@node-1 ~] # ping 192.168.0.10 PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data. 64 bytes from 192.168.0.3: icmp_seq=4 ttl=64 time =0.391 ms 64 bytes from 192.168.0.3: icmp_seq=5 ttl=64 time =0.363 ms [root@node-2 ~] # ping 192.168.0.8 PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data. 64 bytes from 192.168.0.3: icmp_seq=4 ttl=64 time =0.391 ms 64 bytes from 192.168.0.3: icmp_seq=5 ttl=64 time =0.363 ms 然后再给另一网段的容器的weave网桥添加ip(可以在宿主机上对不同网段的容器的weave网桥添加ip) [root@node-1 ~] # weave expose 192.168.10.1/24 [root@node-2 ~] # weave expose 192.168.10.1/24 [root@node-1 ~] # ping 192.168.10.20 PING 192.168.10.20 (192.168.10.20) 56(84) bytes of data. 64 bytes from 192.168.10.20: icmp_seq=1 ttl=64 time =2.50 ms 64 bytes from 192.168.10.20: icmp_seq=2 ttl=64 time =0.318 ms [root@node-2 ~] # ping 192.168.10.10 PING 192.168.10.10 (192.168.10.10) 56(84) bytes of data. 64 bytes from 192.168.10.10: icmp_seq=1 ttl=64 time =0.335 ms 64 bytes from 192.168.10.10: icmp_seq=2 ttl=64 time =0.310 ms 2)如果不适用Docker的原生网络,即在容器启动的时候,添加--net=none,这样容器启动后,就不会使用docker0网卡分配ip。 这种情况下,登陆容器后发现不能访问宿主机以及外部网络的,而在宿主机上也不能 ping 通容器ip。 这个时候添加对应容器网段的weave网桥ip,这样可以实现容器与宿主机网络连通。但是,此时在容器内部依然不能访问外部网络。 所以说,可以同时使用Docker的原生网络和weave网络来实现容器互联及容器访问外网和端口映射。 使用外部网络及端口映射的时候就使用docker0网桥,需要容器互联的时候就使用weave网桥。每个容器分配两个网卡。 |