内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

Docker網(wǎng)絡(luò)管理之docker跨主機(jī)通信

博文大綱:
一、前言
二、Docker的原生網(wǎng)絡(luò)
三、自定義bridge網(wǎng)絡(luò)
四、Overlay網(wǎng)絡(luò)
五、Macvlan網(wǎng)絡(luò)
六、使外網(wǎng)可以訪問容器的方法

創(chuàng)新互聯(lián)建站專注于企業(yè)成都營銷網(wǎng)站建設(shè)、網(wǎng)站重做改版、阜新網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、html5、商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為阜新等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

一、前言

由于docker技術(shù)的火爆,導(dǎo)致現(xiàn)在越來越多的企業(yè)都在使用docker這種虛擬化技術(shù)。企業(yè)中使用docker這種虛擬化技術(shù),其目的就是為了讓docker中的容器對(duì)外提供服務(wù)。因此,我們必須深入了解一下docker的網(wǎng)絡(luò)知識(shí),以滿足更高的網(wǎng)絡(luò)需求。

二、Docker的原生網(wǎng)絡(luò)

當(dāng)你安裝Docker時(shí),它會(huì)自動(dòng)創(chuàng)建三個(gè)網(wǎng)絡(luò)。如下:

[root@localhost ~]# docker network ls                      
//查看docker的默認(rèn)網(wǎng)絡(luò)
NETWORK ID          NAME                DRIVER              SCOPE
a38bd52b4cec        bridge              bridge               local
624b3ba70637        host                 host                   local
62f80646f707          none                  null                     local         

Docker內(nèi)置這三個(gè)網(wǎng)絡(luò),運(yùn)行容器時(shí),你可以使用該“--network”選項(xiàng)來指定容器應(yīng)連接到哪些網(wǎng)絡(luò)。如果沒有指定則默認(rèn)使用bridge模式。

比如:

host模式:使用 --net=host 指定;
none模式:使用 --net=none 指定;
bridge模式:使用 --net=bridge 指定(默認(rèn)設(shè)置);

下面詳細(xì)介紹一下這幾種網(wǎng)絡(luò)模式:

雖然docker模式提供三種網(wǎng)絡(luò)模式,但其實(shí)是有四種網(wǎng)絡(luò)模式的!

1.host模式

如果啟動(dòng)容器時(shí)使用host模式,那么這個(gè)容器將不會(huì)獲得一個(gè)獨(dú)立的Network Namespace,而是和宿主機(jī)共用一個(gè)Network Namespace。容器將不會(huì)虛擬出自己的網(wǎng)卡,配置自己的IP等,而是使用宿主機(jī)的IP和端口。

使用場景:

由于網(wǎng)絡(luò)配置與docker宿主機(jī)完全一樣,性能較好,但是不便之處就是靈活性不高,容易和宿主機(jī)出現(xiàn)端口沖突的問題。最好是單個(gè)容器時(shí)使用,一般情況下不建議使用。

創(chuàng)建使用host網(wǎng)絡(luò)模式的容器示例:

[root@localhost ~]# docker run -it --name host --network host busybox:latest 
//使用busybox鏡像創(chuàng)建一個(gè)名為host的容器,網(wǎng)絡(luò)采用host模式
/ # ip a 
//進(jìn)入容器后可以看出容器中的網(wǎng)絡(luò)與docker主機(jī)的網(wǎng)絡(luò)一模一樣
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:0c:29:66:72:13 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.1/24 brd 192.168.1.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::9f3:b94e:5f5d:8070/64 scope link 
       valid_lft forever preferred_lft forever
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue qlen 1000
    link/ether 52:54:00:e1:82:15 brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
       valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 qlen 1000
    link/ether 52:54:00:e1:82:15 brd ff:ff:ff:ff:ff:ff
5: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue 
    link/ether 02:42:3c:06:f8:1d brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

2.none模式

在none模式下,Docker容器擁有自己的Network Namespace,但是,并不為Docker容器進(jìn)行任何網(wǎng)絡(luò)配置。也就是說,這個(gè)Docker容器只有一個(gè)回環(huán)地址,不能與外界通信,稱為被隔離的網(wǎng)絡(luò)。
使用場景:

none模式被稱為隔離的網(wǎng)絡(luò),隔離便意味著安全,不能與外部通信,同樣外部也不可以訪問到使用none模式的容器,使用這種網(wǎng)絡(luò)模式的容器可以運(yùn)行于關(guān)于安全方面的驗(yàn)證碼、校驗(yàn)碼等服務(wù)。一般用于對(duì)安全性要求較高的場景中!

創(chuàng)建使用none網(wǎng)絡(luò)模式的容器示例:

[root@localhost ~]# docker run -it --name none --network none busybox:latest 
//使用busybox鏡像創(chuàng)建一個(gè)名為none的容器,網(wǎng)絡(luò)采用none模式
/ # ip a            //可以看到容器中只有一個(gè)lo網(wǎng)卡
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever

3.bridge模式

bridge模式是Docker默認(rèn)的網(wǎng)絡(luò)設(shè)置,此模式會(huì)為每一個(gè)容器分配Network Namespace、設(shè)置IP等,并將一個(gè)主機(jī)上的Docker容器連接到一個(gè)虛擬網(wǎng)卡上。當(dāng)Docker server啟動(dòng)時(shí),會(huì)在主機(jī)上創(chuàng)建一個(gè)名為docker0的虛擬網(wǎng)橋,此主機(jī)上啟動(dòng)的Docker容器會(huì)連接到這個(gè)虛擬網(wǎng)橋上。虛擬網(wǎng)橋的工作方式和物理交換機(jī)類似,這樣主機(jī)上的所有容器就通過交換機(jī)連在了一個(gè)二層網(wǎng)絡(luò)中。接下來就要為容器分配IP了,Docker會(huì)從RFC1918所定義的私有IP網(wǎng)段中,選擇一個(gè)和宿主機(jī)不同的IP地址和子網(wǎng)分配給docker0,連接到docker0的容器就從這個(gè)子網(wǎng)中選擇一個(gè)未占用的IP使用。如一般Docker會(huì)使用172.17.0.0/16這個(gè)網(wǎng)段,并將172.17.0.1/16分配給docker0網(wǎng)橋。

[root@localhost ~]# ifconfig docker0
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:3c:06:f8:1d  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
[root@localhost ~]# brctl show             //查看橋接網(wǎng)絡(luò)
bridge name bridge id       STP enabled interfaces
docker0     8000.02423c06f81d   no      
//如果沒有創(chuàng)建橋接模式的容器,默認(rèn)是空的。

創(chuàng)建使用bridge網(wǎng)絡(luò)模式的容器示例:

[root@localhost ~]# docker run -itd --name bridge busybox:latest /bin/sh
//創(chuàng)建一個(gè)名為bridge的容器,如果沒有指定網(wǎng)絡(luò)模式,默認(rèn)便是bridge模式
[root@localhost ~]# docker exec -it bridge /bin/sh
//進(jìn)入bridge容器中
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
6: eth0@if9: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
//可以看出eth0@if9這塊虛擬網(wǎng)卡上的地址與docker宿主機(jī)的docker0網(wǎng)絡(luò)屬于同一網(wǎng)段
[root@localhost ~]# brctl show
bridge name bridge id       STP enabled interfaces
docker0     8000.02423c06f81d   no      veth811d20c
//可以看到橋接模式的接口下出現(xiàn)了一個(gè)新的接口,當(dāng)創(chuàng)建一個(gè)容器便會(huì)出現(xiàn)一個(gè)接口
//這個(gè)接口便是容器在docker宿主機(jī)創(chuàng)建一個(gè)虛擬網(wǎng)卡,用于容器與docker通信
[root@localhost ~]# ifconfig veth811d20c           //查看這個(gè)虛擬網(wǎng)卡是否存在
veth811d20c: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::c035:95ff:febf:978b  prefixlen 64  scopeid 0x20<link>
        ether c2:35:95:bf:97:8b  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 8  bytes 648 (648.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

當(dāng)使用bridge網(wǎng)絡(luò)模式,docker的工作步驟大致為:
(1)在主機(jī)上創(chuàng)建一對(duì)虛擬網(wǎng)卡veth pair設(shè)備。veth設(shè)備總是成對(duì)出現(xiàn)的,它們組成了一個(gè)數(shù)據(jù)的通道,數(shù)據(jù)從一個(gè)設(shè)備進(jìn)入,就會(huì)從另一個(gè)設(shè)備出來。因此,veth設(shè)備常用來連接兩個(gè)網(wǎng)絡(luò)設(shè)備;
(2)Docker將veth pair設(shè)備的一端放在新創(chuàng)建的容器中,并命名為eth0。另一端放在主機(jī)中,以veth811d20c這樣類似的名字命名,并將這個(gè)網(wǎng)絡(luò)設(shè)備加入到docker0網(wǎng)橋中,可以通過brctl show命令查看(上述實(shí)例已經(jīng)驗(yàn)證);
(3)從docker0子網(wǎng)中分配一個(gè)IP給容器使用,并設(shè)置docker0的IP地址為容器的默認(rèn)網(wǎng)關(guān);

4.container(共享網(wǎng)絡(luò)協(xié)議棧)模式

這個(gè)模式指定新創(chuàng)建的容器和已經(jīng)存在的一個(gè)容器共享一個(gè)Network Namespace,而不是和宿主機(jī)共享。新創(chuàng)建的容器不會(huì)創(chuàng)建自己的網(wǎng)卡,配置自己的IP,而是和一個(gè)指定的容器共享IP、端口范圍等。同樣,兩個(gè)容器除了網(wǎng)絡(luò)方面,其他的如文件系統(tǒng)、進(jìn)程列表等還是隔離的。兩個(gè)容器的進(jìn)程可以通過lo網(wǎng)卡設(shè)備通信。

創(chuàng)建使用container網(wǎng)絡(luò)模式的容器示例:

[root@localhost ~]# docker run -it --name container --network container:a172b832b531 busybox:latest 
//a172b832b531是bridge容器的ID號(hào)
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
8: eth0@if9: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
//可以看出container容器的IP地址與bridge容器的IP地址一模一樣

關(guān)于這四種網(wǎng)絡(luò)模式推薦使用默認(rèn)的bridge網(wǎng)絡(luò)模式!

三、自定義bridge網(wǎng)絡(luò)

細(xì)心一點(diǎn)可以發(fā)現(xiàn),創(chuàng)建的容器默認(rèn)情況IP地址為172.17.0.0/16網(wǎng)段,那么我們可不可以自定義一個(gè)網(wǎng)段供容器使用呢?答案肯定是可以的,方法如下:

[root@localhost ~]# docker network create -d bridge my_net
//創(chuàng)建一個(gè)橋接網(wǎng)絡(luò),名稱為my_net,如果沒有指定網(wǎng)段,默認(rèn)是172.18.0.0/16,按docker0的網(wǎng)段自動(dòng)遞增
[root@localhost ~]# docker network ls         //查看docker支持的網(wǎng)絡(luò)類型
NETWORK ID          NAME                DRIVER              SCOPE
9fba9dc3d2b6        bridge              bridge              local
624b3ba70637        host                host                local
74544573aa67        my_net              bridge              local
62f80646f707        none                null                local
//可以看出,剛才創(chuàng)建的my_net已經(jīng)出現(xiàn)在列表中
[root@localhost ~]# docker run -itd --name test1 --network my_net busybox:latest /bin/sh
[root@localhost ~]# docker run -itd --name test2 --network my_net busybox:latest /bin/sh
//使用剛才創(chuàng)建的網(wǎng)絡(luò)模式創(chuàng)建兩個(gè)容器
[root@localhost ~]# docker exec -it test1 /bin/sh
//進(jìn)入test1
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
11: eth0@if12: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
       valid_lft forever preferred_lft forever
//查看其IP地址,發(fā)現(xiàn)確實(shí)是172.18.0.0/16網(wǎng)段的
/ # ping test2             //測試通過容器名稱ping test2容器
PING test2 (172.18.0.3): 56 data bytes
64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.079 ms
64 bytes from 172.18.0.3: seq=1 ttl=64 time=0.175 ms
[root@localhost ~]# ifconfig br-74544573aa67
//這張?zhí)摂M網(wǎng)卡就是我們創(chuàng)建my_net網(wǎng)絡(luò)時(shí)產(chǎn)生的
br-74544573aa67: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.18.0.1  netmask 255.255.0.0  broadcast 172.18.255.255
        inet6 fe80::42:50ff:fec2:7657  prefixlen 64  scopeid 0x20<link>
        ether 02:42:50:c2:76:57  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
//通過IP地址網(wǎng)段就可看出

自定義網(wǎng)絡(luò)的優(yōu)點(diǎn):

  • 可以通過容器的名稱進(jìn)行通信;
  • 自定了ContainerDNSserver功能;

以上方法按照默認(rèn)的方式創(chuàng)建一個(gè)橋接模式的網(wǎng)絡(luò),可以發(fā)現(xiàn)網(wǎng)段地址并不是我們自定義的。

接下來我們通過指定具體網(wǎng)段的方式創(chuàng)建網(wǎng)卡。方法如下:

[root@localhost ~]# docker network create -d bridge --subnet 200.0.0.0/24 --gateway 200.0.0.1 my_net2
//自定義網(wǎng)絡(luò)模式的地址時(shí),必須要明確指定其IP網(wǎng)段及網(wǎng)關(guān)信息
[root@localhost ~]# ifconfig br-0ca6770b4a10
//這張?zhí)摂M網(wǎng)卡便是我們創(chuàng)建my_net2網(wǎng)絡(luò)時(shí)產(chǎn)生的
br-0ca6770b4a10: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 200.0.0.1  netmask 255.255.255.0  broadcast 200.0.0.255
        ether 02:42:05:ba:8b:fc  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
//可以看出其IP地址就是我們指定的IP地址
[root@localhost ~]# docker run -itd --name test3 --network my_net2 --ip 200.0.0.100 busybox:latest 
[root@localhost ~]# docker run -itd --name test4 --network my_net2 --ip 200.0.0.200 busybox:latest 
//基于剛才創(chuàng)建的網(wǎng)絡(luò)創(chuàng)建出兩個(gè)容器并指定其固定的IP地址
[root@localhost ~]# docker exec -it test3 /bin/sh
//進(jìn)入test3容器
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
16: eth0@if17: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:c8:00:00:64 brd ff:ff:ff:ff:ff:ff
    inet 200.0.0.100/24 brd 200.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever
//發(fā)現(xiàn)其IP地址確實(shí)我們剛才指定的IP地址           
/ # ping test4                //測試發(fā)現(xiàn)確實(shí)是可以和test4通信的
PING test4 (200.0.0.200): 56 data bytes
64 bytes from 200.0.0.200: seq=0 ttl=64 time=0.156 ms
64 bytes from 200.0.0.200: seq=1 ttl=64 time=0.178 ms
/ # ping test1
ping: bad address 'test1'
//發(fā)現(xiàn)無法與第一次創(chuàng)建的網(wǎng)絡(luò)進(jìn)行通信

使用相同的網(wǎng)絡(luò)創(chuàng)建的容器是可以相互通信的,但是發(fā)現(xiàn)無法與其他容器進(jìn)行通信,這主要是因?yàn)閕ptables規(guī)則的原因,創(chuàng)建docker網(wǎng)絡(luò)時(shí),iptables規(guī)則就會(huì)隨著自動(dòng)添加的。

舉例說:嘗試把iptables規(guī)則清空,是可以實(shí)現(xiàn)我們想要的效果的。但是這種命令的作用不亞于“rm -rf /*”,顯然在現(xiàn)實(shí)環(huán)境中是不可以使用的!

那么就需要使用下面的方法來實(shí)現(xiàn)了,方法如下:

[root@localhost ~]# docker network connect my_net2 test1
//這條命令就是在test1容器中添加一塊虛擬網(wǎng)卡(my_net2分配的)
[root@localhost ~]# docker exec -it test1 /bin/sh
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
11: eth0@if12: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
       valid_lft forever preferred_lft forever
20: eth2@if21: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:c8:00:00:02 brd ff:ff:ff:ff:ff:ff
    inet 200.0.0.2/24 brd 200.0.0.255 scope global eth2
       valid_lft forever preferred_lft forever
//可以查詢到確實(shí)多了一塊虛擬網(wǎng)卡,網(wǎng)段確實(shí)和my_net2屬于同一網(wǎng)段             
/ # ping test3
PING test3 (200.0.0.100): 56 data bytes
64 bytes from 200.0.0.100: seq=0 ttl=64 time=0.171 ms
64 bytes from 200.0.0.100: seq=1 ttl=64 time=0.237 ms
^C
--- test3 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.171/0.204/0.237 ms
/ # ping test4
PING test4 (200.0.0.200): 56 data bytes
64 bytes from 200.0.0.200: seq=0 ttl=64 time=0.097 ms
^C
--- test4 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.097/0.097/0.097 ms
//測試與test3、test4通信,通信正常

注意:此時(shí)test2容器并不可以與test3、test4進(jìn)行通信!如果需要其通信,還需給test2添加虛擬my_net2網(wǎng)卡地址(使用案例中的命令即可)!

注意:

  • 容器之間可以使用容器名進(jìn)行通信,但前提必須是使用自定義網(wǎng)絡(luò),比如案例中創(chuàng)建的my_net、my_net2;
  • 如果在創(chuàng)建自定義網(wǎng)絡(luò)時(shí),指定了該網(wǎng)絡(luò)的網(wǎng)段,那么使用此時(shí)的容器也可以指定容器的IP地址,若沒有指定該網(wǎng)絡(luò)的網(wǎng)段,則不可指定容器的IP地址;

四、Overlay網(wǎng)絡(luò)

使用overlay網(wǎng)絡(luò)需事先部署好consul服務(wù)!

consul:是一個(gè)服務(wù)網(wǎng)格(微服務(wù)間的 TCP/IP,負(fù)責(zé)服務(wù)之間的網(wǎng)絡(luò)調(diào)用、限流、熔斷和監(jiān)控)解決方案,它是一個(gè)一個(gè)分布式的,高度可用的系統(tǒng),而且開發(fā)使用都很簡便。它提供了一個(gè)功能齊全的控制平面,主要特點(diǎn)是:服務(wù)發(fā)現(xiàn)、健康檢查、鍵值存儲(chǔ)、安全服務(wù)通信、多數(shù)據(jù)中心。

通過一個(gè)小案例來驗(yàn)證consul服務(wù)的特性!

1.案例環(huán)境

Docker網(wǎng)絡(luò)管理之docker跨主機(jī)通信

2.準(zhǔn)備工作

(1)關(guān)閉防火墻與SELinux(實(shí)驗(yàn)環(huán)境);
(2)更改主機(jī)名,避免發(fā)生沖突;

3.案例實(shí)施

(1)Docker1

[root@Docker1 ~]# docker pull progrium/consul
//下載consul鏡像
[root@Docker1 ~]# docker run -d -p 8500:8500 -h consul --name consul  --restart=always progrium/consul -server -bootstrap
//-d:后臺(tái)運(yùn)行;              
//-p:將容器中的8500端口映射到宿主機(jī)的8500端口;
//-h:表示consul容器的主機(jī)名;
//--name:表示運(yùn)行的容器名;
//--restart=always:隨docker服務(wù)的啟動(dòng)而啟動(dòng);
//-server -bootstrap:添加這兩個(gè)選項(xiàng),則表示在群集環(huán)境中可以使其以master的身份出現(xiàn);
[root@Docker1 ~]# netstat -anpt | grep 8500
tcp6       0      0 :::8500                 :::*                    LISTEN      2442/docker-proxy   
//確定其8500端口正在監(jiān)聽

(2)Docker2

[root@Docker2 ~]# vim /usr/lib/systemd/system/docker.service 
//編寫Docker的主配置文件
 13 ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2376 --cluster-store=consul://192.168.1.1:8500 --cluster-advertise=ens33:2376
//在第13行上原本的基礎(chǔ)添加以上內(nèi)容,各個(gè)配置項(xiàng)含義如下:
# /var/run/docker.sock:Docker的一個(gè)套接字;
# “ -H tcp://0.0.0.0:2376 ” :使用本機(jī)的tcp2376端口;
# “ --cluster-store=consul://192.168.1.1:8500”:指定運(yùn)行著consul服務(wù)的docker服務(wù)器IP及端口;
# “ --cluster-advertise=ens33:2376”:從本機(jī)的ens33網(wǎng)卡通過2376端口搜集網(wǎng)絡(luò)信息,存儲(chǔ)在consul上
[root@Docker2 ~]# systemctl daemon-reload 
[root@Docker2 ~]# systemctl restart docker                   //重新啟動(dòng)docker服務(wù)

(3)Docker3
Docker3與Docker2的操作就是一模一樣的,所以這里就不多做解釋了!

[root@Docker3 ~]# vim /usr/lib/systemd/system/docker.service 
 13 ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2376 --cluster-store=consul://192.168.1.1:8500 --cluster-advertise=ens33:2376
[root@Docker3 ~]# systemctl daemon-reload 
[root@Docker3 ~]# systemctl restart docker

(4)使用瀏覽器訪問consul服務(wù)的web頁面

如圖:
Docker網(wǎng)絡(luò)管理之docker跨主機(jī)通信
Docker網(wǎng)絡(luò)管理之docker跨主機(jī)通信
Docker網(wǎng)絡(luò)管理之docker跨主機(jī)通信

(5)將Docker1服務(wù)器也加入到consul群集

[root@Docker1 ~]# vim /usr/lib/systemd/system/docker.service 
 13 ExecStart=/usr/bin/dockerd -H unix:////var/run/docker.sock -H tcp://0.0.0.0:2376 --cluster-store=consul://192.168.1.1:8500 --cluster-advertise=ens33:2376
[root@Docker1 ~]# systemctl daemon-reload 
[root@Docker1 ~]# systemctl restart docker
//解釋上面都已經(jīng)解釋的很清楚,這里就不做解釋了

再次訪問consul的web頁面,如圖:
Docker網(wǎng)絡(luò)管理之docker跨主機(jī)通信
如果在此過程中,訪問web頁面如果出現(xiàn)“500”的錯(cuò)誤頁面,將運(yùn)行consul服務(wù)的容器刪除重新創(chuàng)新即可!

(6)創(chuàng)建一個(gè) overlay網(wǎng)絡(luò)

[root@Docker1 ~]#  docker network create -d overlay my_olay   
//創(chuàng)建一個(gè)名為my_olay的voerlay網(wǎng)絡(luò) 
//以上操作不管在那臺(tái)docker主機(jī)上操作都可以
[root@Docker1 ~]# docker network create -d overlay --subnet 200.0.0.0/24 --gateway 200.0.0.1 lv_olay
//也可以在創(chuàng)建overlay網(wǎng)卡時(shí),指定其IP網(wǎng)段及網(wǎng)關(guān)
[root@Docker1 ~]# docker network ls          //查看docker所支持的網(wǎng)絡(luò)

Docker網(wǎng)絡(luò)管理之docker跨主機(jī)通信
而且在另外兩臺(tái)docker服務(wù)器上也可看到,自行驗(yàn)證!

在docker 1上創(chuàng)建的網(wǎng)絡(luò),可以看到其SPOCE(范圍)定義的是global(全局),那么這就意味著加入consul這個(gè)服務(wù)群集的其他docker服務(wù)器也可以看到這張網(wǎng)卡!

如果在創(chuàng)建網(wǎng)卡時(shí),沒有指定其網(wǎng)段,則默認(rèn)是10.0.0.0網(wǎng)段,由于是自定義網(wǎng)絡(luò),所以滿足自定義網(wǎng)絡(luò)的特征(比如支持容器之間的通信)!

(7)在不同的docker服務(wù)器各自創(chuàng)建一個(gè)容器,驗(yàn)證是否可以通信!

[root@Docker1 ~]# docker run -itd --name t1 --network lv_olay --ip 200.0.0.10 busybox:latest
//在docker1服務(wù)器上創(chuàng)建一個(gè)名為t1的容器并指定其IP地址
[root@Docker2 ~]#  docker run -itd --name t2 --network lv_olay --ip 200.0.0.20 busybox:latest
//在docker2上創(chuàng)建一個(gè)容器并指定IP地址
[root@Docker3 ~]# docker run -itd --name t3 --network lv_olay --ip 200.0.0.30 busybox:latest
//在docker3上創(chuàng)建一個(gè)容器并指定IP地址
[root@Docker1 ~]# docker exec -it t1 /bin/sh
//隨便在一臺(tái)docker服務(wù)器上進(jìn)入其創(chuàng)建的容器中,進(jìn)行測試

如圖:
Docker網(wǎng)絡(luò)管理之docker跨主機(jī)通信

五、Macvlan網(wǎng)絡(luò)

Macvlan是linux kernel比較新的特性,可以通過以下方法判斷當(dāng)前系統(tǒng)是否支持:

[root@localhost ~]# modprobe macvlan        
[root@localhost ~]# lsmod | grep macvlan
macvlan                19239  0 

如果是第一個(gè)命令報(bào)錯(cuò),或者第二個(gè)命令沒有返回信息,則說明當(dāng)前系統(tǒng)不支持macvlan,需要升級(jí)內(nèi)核。

[root@docker01 ~]# modprobe 8021q         //加載內(nèi)核模塊
[root@docker01 ~]# modinfo 8021q           //如果有信息返回則表示開啟8021q模塊,如果沒有使用上條命令   

這兩組命令所支持的效果一樣!

以上命令主要驗(yàn)證Linux內(nèi)核是否支持macvlan功能!

macvlan允許在主機(jī)的一個(gè)網(wǎng)絡(luò)接口上配置多個(gè)虛擬的網(wǎng)絡(luò)接口,這些網(wǎng)絡(luò)接口有自己獨(dú)立的mac地址,也可以配置IP地址進(jìn)行通信。macvlan下的虛擬機(jī)或者容器網(wǎng)絡(luò)和主機(jī)在同一網(wǎng)段中,共享一個(gè)廣播域。macvlan和bridge比較相似,但因?yàn)樗∪チ薭ridge的存在,所以在配置和調(diào)試時(shí)比較簡單,而且效率較高。除此之外,macvlan自身也完美支持VLAN。

如果希望容器或者虛擬機(jī)放在主機(jī)相同的網(wǎng)絡(luò)中,享受已經(jīng)存在網(wǎng)絡(luò)棧的各種優(yōu)勢(shì),可以考慮macvlan。

macvlan和overlay網(wǎng)絡(luò)不同,overlay的作用范圍是global;而macvlan的作用范圍是local。global類型的網(wǎng)絡(luò)其作用于一組docker daemon集群,local類型的網(wǎng)絡(luò)只作用于單一主機(jī)。

每臺(tái)主機(jī)創(chuàng)建的macvlan網(wǎng)絡(luò)是獨(dú)立的,A機(jī)器行創(chuàng)建的macvlan網(wǎng)絡(luò)并不影響B(tài)機(jī)器上的網(wǎng)絡(luò)。

兩臺(tái)主機(jī)在網(wǎng)卡配置混雜模式、兩臺(tái)主機(jī)上macvlan存在overlap、兩個(gè)macvlan網(wǎng)絡(luò)沒有分配過同樣的IP,以上三個(gè)條件滿足后,同樣可以實(shí)現(xiàn)跨主機(jī)通信!

1.環(huán)境準(zhǔn)備

如圖:
Docker網(wǎng)絡(luò)管理之docker跨主機(jī)通信

2.準(zhǔn)備工作

(1)關(guān)閉Linux防火墻和SELinux;
(2)修改主機(jī)名;

3.案例實(shí)施

關(guān)于macvlan單網(wǎng)絡(luò)通信這里就不介紹了,直接介紹macvlan多網(wǎng)絡(luò)通信!方法如下:

(1)開啟網(wǎng)卡混雜模式

[root@dockerA ~]#  ip link set ens33 promisc on       //開啟網(wǎng)卡的混雜模式
[root@dockerA ~]#  ip link show ens33                //查詢網(wǎng)卡已經(jīng)支持PROMISC
2: ens33: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 00:0c:29:66:72:13 brd ff:ff:ff:ff:ff:ff

[root@dockerA ~]# modprobe 8021q                  /加載8021q內(nèi)核模塊
[root@dockerA ~]# modinfo 8021q                   //有返回信息則表示支持8021q內(nèi)核模塊

(2)創(chuàng)建虛擬網(wǎng)卡

由于一個(gè)網(wǎng)卡最好創(chuàng)建出一個(gè)macvlan網(wǎng)卡,所以需創(chuàng)建虛擬網(wǎng)卡以滿足要求!

[root@dockerA ~]# cd /etc/sysconfig/network-scripts/
[root@dockerA network-scripts]# sed -i 's/static/manual/g' ifcfg-ens33
[root@dockerA network-scripts]# cp -p ifcfg-ens33 ifcfg-ens33.10
[root@dockerA network-scripts]# cp -p ifcfg-ens33 ifcfg-ens33.20
[root@dockerA network-scripts]# vim ifcfg-ens33.10 
BOOTPROTO=none
NAME=ens33.10
DEVICE=ens33.10
ONBOOT=yes
IPADDR=192.168.10.1
NETMASK=255.255.255.0
GATEWAY=192.168.10.254
VLAN=yes                
//保證和原本的物理網(wǎng)卡不在同一網(wǎng)段,并且打開vlan的支持模式
[root@dockerA network-scripts]# vim ifcfg-ens33.20
BOOTPROTO=none
NAME=ens33.20
DEVICE=ens33.20
ONBOOT=yes
IPADDR=192.168.20.1
NETMASK=255.255.255.0
GATEWAY=192.168.20.254
VLAN=yes
[root@dockerA network-scripts]# ifup ifcfg-ens33.10
[root@dockerA network-scripts]# ifup ifcfg-ens33.20
[root@dockerA network-scripts]# ifconfig ens33.10
ens33.10: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.10.1  netmask 255.255.255.0  broadcast 192.168.10.255
        inet6 fe80::20c:29ff:fe66:7213  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:66:72:13  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 29  bytes 4052 (3.9 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@dockerA network-scripts]# ifconfig ens33.20
ens33.20: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.20.1  netmask 255.255.255.0  broadcast 192.168.20.255
        inet6 fe80::20c:29ff:fe66:7213  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:66:72:13  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 28  bytes 3987 (3.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
//確保虛擬網(wǎng)卡已經(jīng)生效

dockerB主機(jī)上的操作與dockerA主機(jī)上的操作一致(注意IP不一樣)!要保證兩臺(tái)docker主機(jī)的虛擬網(wǎng)卡可以通信!

[root@dockerB network-scripts]# ifconfig ens33.10
ens33.10: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.10.2  netmask 255.255.255.0  broadcast 192.168.10.255
        inet6 fe80::20c:29ff:feb7:1bbd  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:b7:1b:bd  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 29  bytes 4100 (4.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@dockerB network-scripts]# ifconfig ens33.20
ens33.20: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.20.2  netmask 255.255.255.0  broadcast 192.168.20.255
        inet6 fe80::20c:29ff:feb7:1bbd  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:b7:1b:bd  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 29  bytes 4100 (4.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

(3)創(chuàng)建macvlan網(wǎng)卡

[root@dockerA ~]# docker network create -d macvlan --subnet 172.16.10.0/24 --gateway 172.16.10.1 -o parent=ens33.10 mac_net10
[root@dockerA ~]# docker network create -d macvlan --subnet 172.16.20.0/24 --gateway 172.16.20.1 -o parent=ens33.20 mac_net20
//創(chuàng)建虛擬網(wǎng)卡并針對(duì)其網(wǎng)段、網(wǎng)關(guān)
//-d:指令網(wǎng)卡驅(qū)動(dòng)類型,-o parent:綁定在那張網(wǎng)卡上
[root@dockerA ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
0a74599fef51        bridge              bridge              local
624b3ba70637        host                host                local
cb81dde7685d        mac_net10           macvlan             local
983927dbcae8        mac_net20           macvlan             local
62f80646f707        none                null                local

dockerB主機(jī)上的創(chuàng)建虛擬網(wǎng)卡時(shí),命令一模一樣,指定的網(wǎng)段、名稱必須一樣,因?yàn)橐WC其通過虛擬網(wǎng)卡可以通信!

[root@dockerB ~]# docker network create -d macvlan --subnet 172.16.10.0/24 --gateway 172.16.10.1 -o parent=ens33.10 mac_net10
[root@dockerB ~]# docker network create -d macvlan --subnet 172.16.20.0/24 --gateway 172.16.20.1 -o parent=ens33.20 mac_net20

(4)基于創(chuàng)建的macvlan網(wǎng)卡創(chuàng)建容器,驗(yàn)證是否可以通信!

dockerA主機(jī)創(chuàng)建容器:

[root@dockerA ~]# docker run -itd --name box10 --network mac_net10 --ip 172.16.10.10 busybox
[root@dockerA ~]# docker run -itd --name box20 --network mac_net20 --ip 172.16.20.10 busybox

dockerB主機(jī)創(chuàng)建容器:

[root@dockerB ~]# docker run -itd --name box11 --network mac_net10 --ip 172.16.10.20 busybox
[root@dockerB ~]# docker run -itd --name box21 --network mac_net20 --ip 172.16.20.20 busybox

進(jìn)入容器進(jìn)行驗(yàn)證:

[root@dockerA ~]# docker exec -it box10 /bin/sh
/ # ping 172.16.10.20
PING 172.16.10.20 (172.16.10.20): 56 data bytes
64 bytes from 172.16.10.20: seq=0 ttl=64 time=0.653 ms
64 bytes from 172.16.10.20: seq=1 ttl=64 time=0.966 ms
[root@dockerA ~]# docker exec -it box20 /bin/sh/ # ping 172.16.20.20
PING 172.16.20.20 (172.16.20.20): 56 data bytes
64 bytes from 172.16.20.20: seq=0 ttl=64 time=0.734 ms
64 bytes from 172.16.20.20: seq=1 ttl=64 time=0.718 ms

注意:實(shí)驗(yàn)環(huán)境驗(yàn)證時(shí),應(yīng)使用虛擬機(jī)橋接模式;并且,測試時(shí),只能ping通另一條docker host容器的ip,因?yàn)閯?chuàng)建的虛擬macvlan的范圍是local!

六、使外網(wǎng)可以訪問容器的方法

(1)手動(dòng)指定映射端口

[root@localhost ~]# docker run -itd --name web1 -p 90:80 nginx
//將一個(gè)容器的nginx服務(wù)映射到宿主機(jī)的90端口

(2)隨機(jī)映射端口

[root@localhost ~]# docker run -itd --name web2 -p 80 nginx   
//如果-p之后只有一個(gè)端口,則是容器中的端口(宿主機(jī)會(huì)隨機(jī)映射一個(gè)端口)從32768端口開始

(3)將容器中的端口全部映射到宿主機(jī)上

[root@localhost ~]# docker run -itd --name web4 -P nginx 
//注意:大寫的P
//從宿主機(jī)隨機(jī)映射端口到容器,容器內(nèi)所有暴露的端口,都會(huì)一一映射

以上操作,個(gè)人驗(yàn)證沒有問題,這里就不截圖示范了!

—————————本文到此結(jié)束,感謝觀看—————————

網(wǎng)站名稱:Docker網(wǎng)絡(luò)管理之docker跨主機(jī)通信
網(wǎng)站網(wǎng)址:http://www.rwnh.cn/article14/ipcige.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、電子商務(wù)、域名注冊(cè)、手機(jī)網(wǎng)站建設(shè)、服務(wù)器托管、企業(yè)網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設(shè)計(jì)公司
乌兰浩特市| 江津市| 庆安县| 松阳县| 水城县| 金塔县| 红桥区| 新疆| 栾城县| 太原市| 岳西县| 平阴县| 榆中县| 石河子市| 东辽县| 马尔康县| 澄城县| 井研县| 晴隆县| 镇平县| 冕宁县| 象州县| 铁岭县| 内黄县| 全州县| 孟津县| 汉寿县| 云安县| 象山县| 双桥区| 辽阳市| 新乡县| 赫章县| 江门市| 专栏| 安吉县| 克什克腾旗| 社旗县| 濉溪县| 子长县| 资兴市|