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网桥。每个容器分配两个网卡。
|