中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Docker之網絡管理(容器間通信的配置)

發布時間:2020-05-07 08:33:10 來源:網絡 閱讀:1266 作者:warrent 欄目:云計算

博文大綱:

  • 一、Bridge模式(同一臺Docker服務器上容器間的通信)
  • 二、部署consul服務實現Docker容器跨主機通信

前言:

當你開始大規模使用Docker時,你會發現需要了解很多關于網絡的知識。Docker作為目前最火的輕量級容器技術,有很多令人稱道的功能,如Docker的鏡像管理。然而,Docker同樣有著很多不完善的地方,網絡方面就是Docker比較薄弱的部分。因此,我們有必要深入了解Docker的網絡知識,以滿足更高的網絡需求。本文首先介紹了Docker自身的4種網絡工作方式,然后介紹一些自定義網絡模式。


我們安裝Docker時,它會自動創建三個網絡,bridge(創建容器默認連接到此網絡)、 none 、host。

  • host:容器將不會虛擬出自己的網卡,配置自己的IP等,而是使用宿主機的IP和端口。
  • None:該模式關閉了容器的網絡功能,相當于一個回環網絡。
  • Bridge:此模式會為每一個容器分配、設置IP等,并將容器連接到一個叫docker0的虛擬網橋,通過docker0網橋以及Iptables nat表配置與宿主機通信。
[root@docker ~]# docker network ls    #執行該命令查看docker創建的網絡

關于上述提到的三個網絡解釋如下:

  • Host:相當于Vmware中的橋接模式,與宿主機在同一個網絡中,但沒有獨立的IP地址。眾所周知,Docker使用了Linux的Namespaces技術來進行資源隔離,如PID Namespace隔離進程,Mount Namespace隔離文件系統,Network Namespace隔離網絡等。一個Network Namespace提供了一份獨立的網絡環境,包括網卡、路由、Iptable規則等都與其他的Network Namespace隔離。一個Docker容器一般會分配一個獨立的Network Namespace。但如果啟動容器的時候使用host模式,那么這個容器將不會獲得一個獨立的Network Namespace,而是和宿主機共用一個Network Namespace。容器將不會虛擬出自己的網卡,配置自己的IP等,而是使用宿主機的IP和端口。基于Host模式啟動的容器,在容器內執行ifconfig時,看到的都是宿主機上的信息。該模式不夠靈活,容易出現端口沖突問題。
  • None:該模式將容器放置在它自己的網絡棧中,但是并不進行任何配置。實際上,該模式關閉了容器的網絡功能,類似于會換地址,在以下兩種情況下是有用的:容器并不需要網絡(例如只需要寫磁盤卷的批處理任務)。
  • overlay:顧名思義:覆蓋,但它又不是覆蓋,它的作用就是在容器原有的網絡基礎之上,再添加一塊網卡,并為其分配一個IP地址,可以將所有的docker容器關聯到同一個局域網中,適用于容器與容器是跨主機進行通信的場景。
  • Bridge:相當于Vmware中的NAT模式,容器使用獨立的network Namespace,并且連接到docker0虛擬網卡(默認模式)。通過docker網橋以及IPtables nat表配置與宿主機通信;Bridge模式是Docker默認的網絡設置,此模式會為每一個容器分配一個Network nameSpace、設置IP等,并將一個主機上的Docker容器連接到一個虛擬網橋docker0上。

在生產環境中,應用的最多的就是Bridge模式和overlay模式了。這篇博文將圍繞著這兩個模式進行介紹。

一、Bridge模式

當Docker server啟動時,會在主機上創建一個名為docker0的虛擬網橋,此主機上啟動的Docker容器就會連接到這個虛擬網橋上。虛擬網橋的工作方式和物理交換機類似,這樣主機上的所有容器就通過交換機連在了一個二層網絡中,一般Docker會使用172.17.0.0/16這個網段,并將這個網段分配給docker0網橋使用(在主機上使用ifconfig命令可以看到docker0),然后為容器分配一個同網段的IP地址。

單機環境下的網絡拓撲如下(主機地址是10.10.0.186/24):

Docker之網絡管理(容器間通信的配置)

Docker 完成以上網絡配置的過程大致是這樣的:

  • 在主機上創建一對虛擬網卡veth pair設備。veth設備總是成對出現的,它們組成了一個數據的通道,數據從一個設備進入,就會從另一個設備出來。因此,veth設備常用來連接兩個網絡設備。
  • Docker將veth pair設備的一端放在新創建的容器中,并命名為eth0。另一端放在主機中,以veth75f9這樣類似的名字命名,并將這個網絡設備加入到docker0網橋中,可以通過brctl show命令查看。
  • 從docker0子網中分配一個IP給容器使用,并設置docker0的IP地址為容器的默認網關。

當所有的容器都是基于默認的docker0進行創建的,那么拋開防火墻、IPtables等相關的設置外,理論上,各個容器是可以相互通信的,但是docker0這個網絡是系統自帶的,有些功能不能夠實現,并且不夠靈活。

其實我們也是可以自定義創建網絡的,并且可以指定其具體屬于哪個網段等。這是docker 0無法實現的,那么,如果各個容器,不是基于同一個網絡(如Docker0)創建的話,那么?如何使它們互通呢?

下面來一段配置,來看一下Bridge的工作模式。

實現的效果如下:

  • 基于docker0(docker的驅動名稱使bridge)網絡創建2個容器,分別是box1、box2。
  • 創建自定義網絡,網絡類型為bridge,名稱為my_net1.基于此網絡創建兩個容器box3,box4(若不指定網段,會使用172.18.0.0/16這個網段,基于docker0增加一個網絡位)
  • 創建自定義網絡,網絡類型為bridge,名稱為my_net2,指定網段為172.20.18.0/24,基于此網絡創建兩個容器box5(ip為172.20.18.6),box6(IP為172.20.18.8)。
  • 配置實現box2能夠和box3相互通信,box4和box5可以相互通信。
[root@docker ~]# docker run -itd --name box1 --network bridge busybox    
#創建一個容器box1,--network選項可以省略,默認就是bridge,這里只是為了展示命令
[root@docker ~]# docker run -itd --name box2 --network bridge busybox   #同上,這里創建一個容器box2
[root@docker ~]# docker network create -d bridge my_net1    #創建一個橋接網絡,名稱為my_net1
[root@docker ~]# docker run -tid --name box3 --network my_net1 busybox    #基于my_net1創建容器box3
[root@docker ~]# docker run -tid --name box4 --network my_net1 busybox   #同上,創建box4
[root@docker ~]# docker network create -d bridge --subnet 172.20.18.0/24 my_net2   #創建一個橋接網絡my_net2,并指定其網段
[root@docker ~]# docker run -tid --name box5 --network my_net2 --ip 172.20.18.6 busybox   
#基于my_net2網絡,創建一個容器box5,并且指定其IP地址
[root@docker ~]# docker run -tid --name box6 --network my_net2 --ip 172.20.18.8 busybox    #同上
[root@docker ~]# docker network connect my_net1 box2      #將box2連接到my_net1這個網絡
[root@docker ~]# docker exec box2 ping box3   #進行ping測試,可以發現box2可以ping通box3了。
#而如果沒有將box2連接到網絡my_net1,是絕對不會ping通的。
PING box3 (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.069 ms
64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.076 ms
[root@docker ~]# docker network connect my_net2 box4   #將box4連接到my_net2網絡
#同box2和box3的ping測試,若沒有將box4連接到box5所在的網絡,是不可能ping通的。
[root@docker ~]# docker exec box5 ip a    #查看box5的IP地址
         .......................#省略部分內容
16: eth0@if17: <BROADCAST,MULTICAST,UP,LO500 qdisc noqueue 
    link/ether 02:42:ac:14:12:06 brd ff:ff:ff:ff:ff:ff
    inet 172.20.18.6/24 brd 172.20.18.255 scope global eth0     #確認其IP
       valid_lft forever preferred_lft forever
[root@docker ~]# docker exec box4 ping 172.20.18.6   #在box4容器上對box5的IP進行ping測試,可以ping通
PING box5 (172.20.18.6): 56 data bytes
64 bytes from 172.20.18.6: seq=0 ttl=64 time=0.090 ms
64 bytes from 172.20.18.6: seq=1 ttl=64 time=0.130 ms

經過以上配置,已經實現了最終的效果,需要注意的是,我們完全可以將創建的my_net1、my_net2網絡驅動理解為一個交換機,而執行命令docker network connect my_net1 box2,則相當于將box2這個容器添加了一塊網卡,然后連接到了my_net1這個交換機,然后這個容器就多了一塊網卡,并且擁有my_net1這個交換機中IP地址。在上述的配置中,box2不但可以和box3進行通信,也是可以和box4進行通信的,因為它們都是連接在了my_net1這個“交換機”上。

注意:

  • 容器之間可以使用容器名進行通信,但前提使用的是自定義的網絡,如上面的my_net1、my_net2;
  • 如果在創建自定義網絡的同時,指定了該網絡的網段,那么,使用此網絡的容器也可以指定容器的IP地址,若沒有指定該網絡的網段,則不可以指定容器的IP地址。

二、部署consul服務實現Docker容器跨主機通信

consul:數據中心的含義,可以將其當做數據庫來理解,類似于Redis等非關系型數據庫,采用的是鍵-值對的方式,存放著各個容器的IP及端口信息。

我對consul服務的了解也不是太多,若想要詳細了解此服務,還是參考其他文檔吧,若以后有機會,我會詳細寫下來consul這個服務。

consul的功能很強大,可以以群集的方式運行,并且具備健康監測等功能。

下面開始配置consul服務。

1、環境準備如下:

  • Docker服務器三臺,我這里的docker版本為18.09.0;
  • 第一臺Docker服務器的IP是192.168.20.7,其運行consul服務;
  • 后兩臺為測試端,只需要有docker環境即可。

若需要安裝部署Docker服務器,可以參考博文:Docker的安裝詳細配置 。

2、第一臺Docker服務器配置如下:

[root@docker ~]# docker pull progrium/consul          #下載consul鏡像
[root@docker ~]# docker run -d -p 8500:8500 -h consul --name consul --restart=always progrium/consul -server -bootstrap
#運行consul容器,該服務的默認端口是8500,“-p”:表示將容器的8500端口映射到宿主機的8500端口
#“-h”:表示consul的主機名;“--name consul”表示為該容器名;“--restart=always”表示可以隨著docker服務的啟動而啟動;
#“-serve -bootstarp”:表示當在群集中,加上這兩個選項可以使其以master的身份出現
[root@docker ~]# netstat -anput | grep 8500   #確定8500端口在監聽
tcp6       0      0 :::8500                 :::* 

OK,至此,單節點的consul服務就完成了,現在切換至第二臺Docker服務器。

3、第二臺Docker服務器配置如下:

[root@docker02 ~]# vim /usr/lib/systemd/system/docker.service  #編輯docker主配置文件
         ..............#省略部分內容,搜索“Start”定位到下面配置行,修改如下:
ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2376 --cluster-store=consul://192.168.20.7:8500 --cluster-advertise=ens33:2376
#各項解釋如下:
#/var/run/docker.sock:Docker的一個編程接口
# “ -H tcp://0.0.0.0:2376 ” :使用本機的tcp2376端口;
# “ --cluster-store=consul://192.168.20.7:8500”:指定運行著consul服務的第一臺docker服務器IP及端口;
# “ --cluster-advertise=ens33:2376”:從本機的ens33網卡通過2376端口搜集網絡信息,存儲在consul上
#修改完成后,保存退出即可。
[root@docker02 ~]# systemctl daemon-reload    #重新加載配置文件
[root@docker02 ~]# systemctl restart docker    #重啟docker服務

4、然后在第三臺docker服務器上,進行與第二臺Docker服務器一樣的配置操作,主要是為了指定consul服務的監聽端口。(自行配置,這里就不寫了,記得更改完成后,重啟docker服務)

5、現在使用瀏覽器訪問consul服務的web頁面(訪問:192.168.20.7:8500),如下:

Docker之網絡管理(容器間通信的配置)

Docker之網絡管理(容器間通信的配置)

即可看到用來測試的那兩臺docker服務器IP等相關信息,如下:
Docker之網絡管理(容器間通信的配置)

6、回到第二臺Docker服務器上,創建一個overlay網絡:

[root@docker02 ~]# docker network create -d overlay my_olay         #創建一個名字為my_olay的voerlay網絡 

7、切換至第三臺Docker服務器上,發現可以看到剛剛在第二臺Docker服務器上創建的overlay網絡:

[root@docker03 ~]# docker network ls     #查看docker03的網絡,發現其不但有overlay網絡,
#而且其SCOPE(范圍)是global(全局的)
NETWORK ID          NAME                DRIVER              SCOPE
8d5b00cf07ab        bridge              bridge              local
17c053a80f5a        host                host                local
c428fc28bb11        my_olay             overlay             global
323935eaa5c3        none                null                local

其實,現在在第二臺Docker服務器上基于剛剛創建的overlay網絡運行一個容器,在第三臺Docker服務器上也基于這個overlay網絡運行一個容器,這兩個在不同主機上的容器是可以互通的,如下:

##################第二臺Docker服務器上配置如下:###########################
[root@docker02 ~]# docker run -tid --name web01 --network my_olay busybox    #基于網絡my_olay運行一個容器web01
[root@docker02 ~]# docker exec web01 ip a         #查看其IP信息,發現其除了回環地址,還有兩個IP
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
    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 1450 qdisc noqueue 
    link/ether 02:42:0a:00:00:02 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.2/24 brd 10.0.0.255 scope global eth0     #這個地址就是my_olay給的
       valid_lft forever preferred_lft forever
11: eth2@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 eth2  
       valid_lft forever preferred_lft forever
##################第三臺Docker服務器上配置如下:###########################
[root@docker03 ~]# docker run -tid --name web02 --network my_olay busybox     #基于網絡my_olay運行一個容器web02
[root@docker03 ~]# docker exec web02 ip a     #查看web02的IP
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
    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 1450 qdisc noqueue 
    link/ether 02:42:0a:00:00:03 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.3/24 brd 10.0.0.255 scope global eth0            #這個地址就是my_olay給的
       valid_lft forever preferred_lft forever
11: eth2@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 eth2
       valid_lft forever preferred_lft forever
#########在第二臺Docker服務器上對第三臺Docker服務器上的容器進行ping測試##########
[root@docker02 ~]# docker exec web01 ping web02      #確定可以ping通
PING web02 (10.0.0.3): 56 data bytes
64 bytes from 10.0.0.3: seq=0 ttl=64 time=1.091 ms
64 bytes from 10.0.0.3: seq=1 ttl=64 time=1.007 ms

———————— 本文至此結束,感謝閱讀 ————————

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

凉城县| 夏河县| 滦南县| 北流市| 桂阳县| 马尔康县| 汕头市| 邹平县| 闸北区| 怀柔区| 昂仁县| 怀远县| 玉树县| 互助| 夏河县| 仙游县| 紫金县| 武山县| 太仓市| 临沭县| 兴宁市| 郁南县| 荔浦县| 玉林市| 绥芬河市| 广元市| 珠海市| 门源| 安庆市| 泰来县| 阿拉尔市| 澄城县| 丰城市| 互助| 大方县| 克东县| 博白县| 晋中市| 万源市| 泰兴市| 北海市|