1. 程式人生 > >Docker基礎學習(八)-Docker容器的跨主機連線

Docker基礎學習(八)-Docker容器的跨主機連線

Docker網橋實現跨主機容器連線

docker網橋實現跨主機連線的網路拓撲圖如下:

在同一個docker主機中,docker容器通過虛擬網橋連線(docker0),如果將連線容器的網橋docker0也橋接到宿主機提供的網絡卡上,將docker0分配的IP地址和宿主機的IP地址設定為同一個網段,就相當於將docker容器和宿主機連線到了一起,這樣就可以實現跨主機的docker容器通訊。

修改宿主機docker網橋配置(由於本機有網橋br0,所有直接將修改docker配置檔案,實現網橋修改):

這裡使用docker啟動選項:

-b 指定使用宿主機的網橋名

--fixed-cidr 指定對docker容器分配的ip段

[[email protected] system]# vim docker.service 
ExecStart=
ExecStart=/usr/bin/dockerd -b=br0 --fixed-cidr=172.25.11.1/24 -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --iptables=true --icc=false
[[email protected] system]# systemctl daemon-reload 
[[email protected] system]# systemctl restart docker.service 

測試:(啟動一個容器檢視IP)

[[email protected] system]# docker start dvt1
[[email protected] system]# docker attach dvt1 
[email protected]:/# ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 02:42:ac:19:0b:01  
          inet addr:172.25.11.1  Bcast:0.0.0.0  Mask:255.255.255.0
          inet6 addr: fe80::42:acff:fe19:b01/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:648 (648.0 B)  TX bytes:648 (648.0 B)

這裡使用kvm新建了一個虛擬主機,ip為172.25.11.25,測試可以ping通,則證明跨主機連線成功

[email protected]:/# ping 172.25.11.25
PING 172.25.11.25 (172.25.11.25) 56(84) bytes of data.
64 bytes from 172.25.11.25: icmp_seq=1 ttl=64 time=0.213 ms
64 bytes from 172.25.11.25: icmp_seq=2 ttl=64 time=0.186 ms

網橋配置跨主機容器連線的優點:

  • 配置簡單,不依賴第三方軟體

網橋配置跨主機容器連線的缺點:

  • 容器和主機在同一網段,劃分IP需要特別小心

  • 需要網段控制權,在生產環境中不容易實現

  • 不容易管理,相容性不佳

Open vSwitch實現跨主機容器連線

Open vSwitch是一個高質量、多層虛擬交換機。使用Apache2.0許可協議,旨在通過程式設計擴充套件,使龐大的網路自動化(配置、管理、維護),同時還支援標準的管理介面和協議。

網路拓撲如下:

GRE是通用路由協議封裝;隧道技術(Tunneling)是一種通過使用網際網路絡的基礎設施在網路之間傳遞資料的方式。使用隧道傳遞的資料(或負載)可以是不同協議的資料幀或包。隧道協議將其它協議的資料幀或包重新封裝然後通過隧道傳送。新的幀頭提供路由資訊,以便通過網際網路傳遞被封裝的負載資料。

具體步驟:

1.在虛擬機器中建立ovs網橋

2.新增gre連線

3.配置docker容器虛擬網橋

4.為虛擬網橋新增ovs介面

5.新增不同Docker容器網段路由

使用weave實現跨主機容器連線

Weave是由weaveworks公司開發的解決Docker跨主機網路的解決方案,它能夠建立一個虛擬網路,用於連線多臺主機上的Docker容器,這樣容器就像被接入了同一個網路交換機,那些使用網路的應用程式不必去配置埠對映和連結等資訊。

外部裝置能夠訪問Weave網路上的應用程式容器所提供的服務,同時已有的內部系統也能夠暴露到應用程式容器上。Weave能夠穿透防火牆並執行在部分連線的網路上,另外,Weave的通訊支援加密,所以使用者可以從一個不受信任的網路連線到主機。

Weave會在主機上建立一個網橋,每一個容器通過 veth pair 連線到該網橋上,同時網橋上有個 Weave router 的容器與之連線,該router會通過連線在網橋上的介面來抓取網路包(該介面工作在Promiscuous模式)。

在每一個部署Docker的主機(可能是物理機也可能是虛擬機器)上都部署有一個W(即Weave router),它本身也可以以一個容器的形式部署。Weave run的時候就可以給每個veth的容器端分配一個ip和相應的掩碼。veth的網橋這端就是Weave router容器,並在Weave launch的時候分配好ip和掩碼。

Weave網路是由這些weave routers組成的對等端點(peer)構成,每個對等的一端都有自己的名字,其中包括一個可讀性好的名字用於表示狀態和日誌的輸出,一個唯一識別符號用於執行中相互區別,即使重啟Docker主機名字也保持不變,這些名字預設是mac地址。

每個部署了Weave router的主機都需要將TCP和UDP的6783埠的防火牆設定開啟,保證Weave router之間控制面流量和資料面流量的通過。控制面由weave routers之間建立的TCP連線構成,通過它進行握手和拓撲關係資訊的交換通訊。 這個通訊可以被配置為加密通訊。而資料面由Weave routers之間建立的UDP連線構成,這些連線大部分都會加密。這些連線都是全雙工的,並且可以穿越防火牆。

對每一個weave網路中的容器,weave都會建立一個網橋,並且在網橋和每個容器之間建立一個veth pair,一端作為容器網絡卡加入到容器的網路名稱空間中,併為容器網絡卡配置ip和相應的掩碼,一端連線在網橋上,最終通過宿主機上weave router將流量轉發到對端主機上。

其基本過程如下:

1,容器流量通過veth pair到達宿主機上weave router網橋上。
2,weave router在混雜模式下使用pcap在網橋上截獲網路資料包,並排除由核心直接通過網橋轉發的資料流量,例如本子網內部、本地容器之間的資料以及宿主機和本地容器之間的流量。捕獲的包通過UDP轉發到所其他主機的weave router端。
3,在接收端,weave router通過pcap將包注入到網橋上的介面,通過網橋的上的veth pair,將流量分發到容器的網絡卡上。


weave預設基於UDP承載容器之間的資料包,並且可以完全自定義整個叢集的網路拓撲,但從效能和使用角度來看,還是有比較大的缺陷的:

  • weave自定義容器資料包的封包解包方式,不夠通用,傳輸效率比較低,效能上的損失也比較大。

  • 叢集配置比較負載,需要通過weave命令列來手工構建網路拓撲,在大規模叢集的情況下,加重了管理員的負擔。

Weave優劣勢:

  • Weave優勢

  1. 支援主機間通訊加密。

  2. 支援container動態加入或者剝離網路。

  3. 支援跨主機多子網通訊。

  • Weave劣勢

  1. 只能通過weave launch或者weave connect加入weave網路。

配置操作

  1. 安裝weave

  2. 啟動weave(veave launch)

  3. 連線不同主機

  4. 通過weave啟動主機

  1. 下載安裝weave

    [[email protected] docker]# curl -L git.io/weave -o /usr/bin/weave
    [[email protected] docker]# chmod a+x /usr/bin/weave 
    [[email protected] docker]# weave version
    weave script 2.3.0
    weave 2.3.0
  2. 啟動weave,weave預設不會下載對應容器,初次執行時會下載容器。

    [[email protected] docker]# weave launch
    2.3.0: Pulling from weaveworks/weave
    88286f41530e: Pull complete 
    ad4e50ed2c08: Pull complete 
    b3f4c952e7c2: Pull complete 
    5e27cb7f1c2b: Pull complete 
    f9dfb03c1d7b: Pull complete 
    Digest: sha256:02914df933ffd52c6daf8c4ced33e48dad36e4d4fd9e684d5004cd72236ced60
    Status: Downloaded newer image for weaveworks/weave:2.3.0
    latest: Pulling from weaveworks/weavedb
    ecb15a45f93b: Pull complete 
    Digest: sha256:7fac063be31d48980361b7020d39ff91493c0bc6c844314b3e71f447bc8dff39
    Status: Downloaded newer image for weaveworks/weavedb:latest
    Unable to find image 'weaveworks/weaveexec:2.3.0' locally
    2.3.0: Pulling from weaveworks/weaveexec
    88286f41530e: Already exists 
    ad4e50ed2c08: Already exists 
    b3f4c952e7c2: Already exists 
    5e27cb7f1c2b: Already exists 
    f9dfb03c1d7b: Already exists 
    21771db04786: Pull complete 
    5fbda086495f: Pull complete 
    80427f885b22: Pull complete 
    0c4698905755: Pull complete 
    Digest: sha256:eb8eb1d83fc58716b20621d397d63737a18f86cbed1fedb1d71671cfc486517b
    Status: Downloaded newer image for weaveworks/weaveexec:2.3.0
    afe02ac7b3654226a09328c8688c8c3e5b6e4226d600dd6120c955ba90537e54
    [[email protected] docker]# docker ps
    CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS               NAMES
    afe02ac7b365        weaveworks/weave:2.3.0   "/home/weave/weave..."   2 minutes ago       Up 2 minutes                            weave
    [[email protected] docker]# docker images |grep weave
    weaveworks/weavedb     latest              b5c2d24a7b71        6 weeks ago         282 B
    weaveworks/weaveexec   2.3.0               c2030610fb92        6 weeks ago         79.1 MB
    weaveworks/weave       2.3.0               6b9ea60b76e7        6 weeks ago         61.7 MB

    執行結束後,會生成一個執行的容器和兩個data-only的容器,和三個映象

    [[email protected] backup]# docker ps -a
    CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS                           PORTS               NAMES
    afe02ac7b365        weaveworks/weave:2.3.0       "/home/weave/weave..."   13 minutes ago      Up 13 minutes                                        weave
    c42cc69d7cf2        weaveworks/weaveexec:2.3.0   "data-only"              13 minutes ago      Created                                              weavevolumes-2.3.0
    7ce56150aa56        weaveworks/weavedb:latest    "data-only"              13 minutes ago      Created                                              weavedb
    其中,weave的這些資料是儲存在每臺機器上分配的名為 weavedb 的容器上的,它是一個 data volume 容器,只負責資料的持久化。 
    

    還會生成一個名為weave的虛擬網路裝置

    [[email protected] backup]# ifconfig weave
    weave: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1376
            inet6 fe80::5cec:96ff:fe30:6abc  prefixlen 64  scopeid 0x20<link>
            ether 5e:ec:96:30:6a:bc  txqueuelen 1000  (Ethernet)
            RX packets 14  bytes 920 (920.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

    docker中也會生成一個使用weave的網橋的自定義網路。

    [[email protected] backup]# docker network ls
    NETWORK ID          NAME                DRIVER              SCOPE
    f6bdadf61ce7        bridge              bridge              local
    1239bac87642        host                host                local
    c0c6d15cdc49        none                null                local
    37c69c2e8a78        weave               weavemesh           local
  3. 使用weave啟動一個映象

    weave2.0之後刪除了run命令,所以先使用docker run啟動好容器,然後使用weave attach命令給容器繫結IP地址

    配置宿主機1的容器:

    [[email protected] system]# docker run -it --name weave_test ubuntu /bin/bash
    [[email protected] system]# weave attach 172.25.11.23/24 weave_test
    Address 172.25.11.23 overlaps with existing route 172.25.11.0/24 on host
    172.25.11.23
    [[email protected] system]# docker exec -it weave_test /bin/bash
    //可以看到weave添加了一個網路裝置,並綁定了ip地址
    [email protected]:/# ifconfig ethwe
    ethwe     Link encap:Ethernet  HWaddr fe:11:53:ea:3e:ba  
              inet addr:172.25.11.23  Bcast:172.25.11.255  Mask:255.255.255.0
              inet6 addr: fe80::fc11:53ff:feea:3eba/64 Scope:Link
              UP BROADCAST RUNNING MULTICAST  MTU:1376  Metric:1
              RX packets:12 errors:0 dropped:0 overruns:0 frame:0
              TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:0 
              RX bytes:948 (948.0 B)  TX bytes:300 (300.0 B)
    
    

    配置宿主機2的容器:

    [[email protected] volumes]# docker run -it --name weave_another ubuntu /bin/bash
       [[email protected] volumes]# weave attach 172.25.11.112/24 weave_another
       Address 172.25.11.112 overlaps with existing route 172.25.11.0/24 on host
       172.25.11.112
       [email protected]:/# ifconfig ethwe
       ethwe     Link encap:Ethernet  HWaddr 86:ba:c8:b9:cc:eb  
    		 inet addr:172.25.11.112  Bcast:172.25.11.255  Mask:255.255.255.0
             inet6 addr: fe80::84ba:c8ff:feb9:cceb/64 Scope:Link
             UP BROADCAST RUNNING MULTICAST  MTU:1376  Metric:1
             RX packets:12 errors:0 dropped:0 overruns:0 frame:0
             TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
             collisions:0 txqueuelen:0 
             RX bytes:948 (948.0 B)  TX bytes:300 (300.0 B)
    
  4. 宿主機1的容器weave_test和宿主機2的容器weave_another可以互相訪問,驗證如下:

    //使用宿主機2的容器對宿主機1的容器進行ping訪問
       [email protected]:/# ping 172.25.11.23
       PING 172.25.11.23 (172.25.11.23) 56(84) bytes of data.
       64 bytes from 172.25.11.23: icmp_seq=1 ttl=64 time=0.077 ms
       ^C
       --- 172.25.11.23 ping statistics ---
       1 packets transmitted, 1 received, 0% packet loss, time 0ms
       rtt min/avg/max/mdev = 0.077/0.077/0.077/0.000 ms
       //同樣,使用宿主機1的容器對宿主機2的容器進行ping訪問
       [email protected]:/# ping 172.25.11.112
       PING 172.25.11.112 (172.25.11.112) 56(84) bytes of data.
       64 bytes from 172.25.11.112: icmp_seq=1 ttl=64 time=0.072 ms
       64 bytes from 172.25.11.112: icmp_seq=2 ttl=64 time=0.086 ms
       ^C
       --- 172.25.11.112 ping statistics ---
       2 packets transmitted, 2 received, 0% packet loss, time 999ms
       rtt min/avg/max/mdev = 0.072/0.079/0.086/0.007 ms

相關推薦

Docker基礎學習-Docker容器主機連線

Docker網橋實現跨主機容器連線 docker網橋實現跨主機連線的網路拓撲圖如下: 在同一個docker主機中,docker容器通過虛擬網橋連線(docker0),如果將連線容器的網橋docker0也橋接到宿主機提供的網絡卡上,將docker0分配的IP地址和宿主機

Docker基礎學習-Docker容器

一,容器的基本操作 1,啟動容器: $ docker run IMAGE[COMMAND] [AEG...] IMAGE:指定容器執行的映象 COMMAND:指定執行的命令 ARG:執行的引數 例如: $ docker run ubuntu echo "Hell

Docker基礎學習-Docker容器的網路連線

一.Docker容器的網路基礎 通過ifconfig檢視docker0的網路裝置,docker守護程序就是通過docker0為docker的容器提供網路連線的各種服務。 docker0是Linux虛擬網橋。 Linux虛擬網橋的特點: 可以設定IP地址 相當於擁

Docker基礎學習-Docker的安裝和部署

一,在Windows中安裝 Docker 1,Docker的執行環境 (1)Linux容器技術 (2)作業系統級別的虛擬化 (3)依賴於Linux核心的Namespace和Cgroups 下面

Docker基礎學習-Dockerfile命令詳解超全版本

製作Dockerfile為Docker入門學習的第一步(當然,除了環境搭建)。 本文收集、整理了官網關於製作Dockerfile的全部命令(除SHELL沒整理,這個就不弄了),可幫助大家快速進入Dockfile製作的學習。 以下為正文,下面進入學習姿勢吧!

python基礎學習元組

元組的定義 Tuple(元組)與列表類似,不同之處在於元組的 元素不能修改 元組 表示多個元素組成的序列 元組 在 Python 開發中,有特定的應用場景 用於儲存 一串 資訊,資料 之間使用 , 分隔 元組用 () 定義 元組的 索引 從 0 開始

JavaSE基礎學習——面向物件

1.1 面向物件思想 1.1.1 概述: 我們回想一下,之前我們完成一個需求的步驟:首先是搞清楚我們要做什麼,然後在分析怎麼做,最後我們再程式碼體現。一步一步去實現,而具體的每一步都需要我們去實現和操

Linux多執行緒基礎學習私有資料

/*============================================================================ // Name : thread_privateData.cpp // Author : Ryan // Version

JMeter學習JDBC測試計劃-連線Oracle

一.測試環境準備       Oracle:10g       JDBC驅動:classes12.jar                       &nbs

Meter學習JDBC測試計劃-連線Oracle 一.測試環境準備

一.測試環境準備       Oracle:10g       JDBC驅動:classes12.jar                              oracle安裝目錄下(oracle\product\10.2.0\db_1\jdbc\lib\class

docker基礎學習進入與退出docker容器--圖文結合

今天開始學習docker容器技術。Docker 可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然後釋出到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何介面,更重要的是容器效能開銷極低。所以容器技術是很重要的一門技術。 首先我們要在

Docker學習容器間單向通訊

Docker學習(八)容器間單向通訊 前言 在之前的文章中介紹的內容都是容器映象和容器執行,沒有涉及到多個容器之前通訊,如果是多個容器之間需要互相呼叫,如何通訊呢? docker維護著每個容器的元資訊,可以通過IP通訊,但是在docker環境中每個容器重啟之後,容器的虛擬IP都會變動,這樣的情況下我們該如

Docker學習:flannel網路

Docker跨主機訪問 flannel 安裝配置etcd       先在主機10.211.55.17上建立並編寫指令碼a.sh sudo vim a.sh ETCD_VER=v2.3.7 DOWNLOAD_URL=https://github.com/coreos

Docker入門學習4----Dockerfile製作第一個映象和容器中的第一個javaweb應用

我們可以通過編寫Dockerfile來製作自己的映象,下面先動手來操作一下,製作一個映象,然後基於該映象執行一個容器,在容器裡執行我們自己的javaweb應用。 <1>拉取tomcat映象 docker pull tomcat 檢視映象: roo

docker學習——docker基礎技術概念入門

容器:  container 容器是啥?https://zh.wikipedia.org/wiki/%E5%AE%B9%E5%99%A8 LXC:Linux Container 虛擬化的常用技術實現形式: 1.主機級虛擬化 Type

docker學習——docker的基本概念及基礎使用

一張圖概括整篇文章內容: 來自:https://medium.com/@nagarwal/lifecycle-of-docker-container-d2da9f85959 lxc->libcontainer->runC OCI(Open Container I

docker學習—— docker容器網路

 ip netns管理網路名稱空間 檢視幫助: [[email protected] ~]# ip netns help Usage: ip netns list ip netns add NAME ip netns set

Docker學習Volumn容器間共享資料

Docker學習(九)Volumn容器間共享資料 volume是什麼 volume在英文中是容量的意思, 在docker中是資料卷的意思,是用來儲存資料的容器 為什麼要進行資料共享 在叢集中有多臺tomcat,對於叢集中的tomcat部署的程式碼是同一份程式碼的副本,如果頁面檔案發生變化,意味著每個

.Net Core微服務入門全紀錄——Docker Compose與容器網路

Tips:本篇已加入系列文章閱讀目錄,可點選檢視更多相關文章。 # 前言 上一篇【[.Net Core微服務入門全紀錄(七)——IdentityServer4-授權認證](https://www.cnblogs.com/xhznl/p/13132260.html)】中使用IdentityServer4完成

win10系統docker學習——docker安裝

tle png 問題: 方案 start htm 完成後 系統 mage windows系統中目前有兩種安裝docker的方式,分別為boot2docker和docker toolbox。按照官方說明和實際安裝過程來講,推薦使用docker toolbox方