1)機器環(huán)境準備:
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 #執(zhí)行安裝yum install -y net-tools,,就會出現(xiàn)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參數(shù),,這個表示容器啟動后不使用默認的虛擬網(wǎng)卡docker0自動分配的ip,而是使用weave綁定的ip,;
當然也可以選擇不添加這個參數(shù)去啟動容器,,這樣,容器啟動后就會有兩個網(wǎng)卡,,即兩個ip:
一個是docker0自動分配的ip,,這個適用于同主機內的容器間通信,,即同主機的容器使用docker0分配的ip可以相互通信;另一個就是weave網(wǎng)橋綁定的ip,。
3)容器互聯(lián)
默認情況下,,上面在node-1和node-2兩臺宿主機上創(chuàng)建的2個容器間都是相互
ping
不通的。需要使用weave connect命令在兩臺weave的路由器之間建立連接,。
[root@node-1 ~]
# weave connect 103.10.86.239 //連接的是對方宿主機的ip,,注意"weave forget ip" z則表示斷開這個連接
然后就會發(fā)現(xiàn),此時位于兩臺不同主機上的相同子網(wǎng)段內的容器之間可以相互
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
會發(fā)現(xiàn)這四個在同一個子網(wǎng)內的容器都是可以相互
ping
通的,。
--------------------------------------------------------------------------------------------------------
再接著啟動與上面不在同一個子網(wǎng)內的容器
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
......
會發(fā)現(xiàn)在跨主機情況下,,相同子網(wǎng)內的容器是可以相互通信的;但是處于不同子網(wǎng)的兩個容器是不能互聯(lián)的,,盡管這兩個容器在同一個主機下也是不能通信的,!
這樣的好處就是:使用不同子網(wǎng)進行容器間的網(wǎng)絡隔離了。
--------------------------------------------------------------------------------------------------------
注意一個細節(jié),,在使用weave的時候:
1)如果使用Docker的原生網(wǎng)絡,在容器內部是可以訪問宿主機以及外部網(wǎng)絡的,。也就是說在啟動容器的時候,,使用了虛擬網(wǎng)卡docker0分配ip,
這種情況下,,登陸容器后是可以
ping
通宿主機ip,,并且可以對外聯(lián)網(wǎng)的!
這個時候,,在宿主機上是可以
ping
通docker0網(wǎng)橋的ip,,但是
ping
不通weave網(wǎng)橋的ip。這個時候可以使用
"weave expose 192.168.0.1/24"
命令來給weave網(wǎng)橋添加IP,,以實現(xiàn)容器與宿主機網(wǎng)絡連通,。如下:
默認在node-1和node-2宿主機上是
ping
不通my-test1容器的weave網(wǎng)橋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網(wǎng)橋的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網(wǎng)橋的網(wǎng)關地址
[root@node-2 ~]
# weave expose 192.168.0.1/24 //weave hide 192.168.0.1/24表示覆蓋/刪除這個設置
然后再在兩臺宿主機上
ping
上面同網(wǎng)段內的容器,發(fā)現(xiàn)都可以
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
然后再給另一網(wǎng)段的容器的weave網(wǎng)橋添加ip(可以在宿主機上對不同網(wǎng)段的容器的weave網(wǎng)橋添加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的原生網(wǎng)絡,,即在容器啟動的時候,,添加--net=none,,這樣容器啟動后,就不會使用docker0網(wǎng)卡分配ip,。
這種情況下,,登陸容器后發(fā)現(xiàn)不能訪問宿主機以及外部網(wǎng)絡的,而在宿主機上也不能
ping
通容器ip,。
這個時候添加對應容器網(wǎng)段的weave網(wǎng)橋ip,,這樣可以實現(xiàn)容器與宿主機網(wǎng)絡連通。但是,,此時在容器內部依然不能訪問外部網(wǎng)絡,。
所以說,可以同時使用Docker的原生網(wǎng)絡和weave網(wǎng)絡來實現(xiàn)容器互聯(lián)及容器訪問外網(wǎng)和端口映射,。
使用外部網(wǎng)絡及端口映射的時候就使用docker0網(wǎng)橋,,需要容器互聯(lián)的時候就使用weave網(wǎng)橋。每個容器分配兩個網(wǎng)卡,。