docker從零開始網絡(三) overly(覆蓋)網絡


使用overly網絡

 

overlay網絡驅動程序會創建多個docker進程主機之間的分布式網絡。該網絡位於(覆蓋)特定於主機的網絡之上,允許連接到它的容器(包括群集服務容器)安全地進行通信。Docker透明地處理每個數據包與Docker守護程序主機和正確的目標容器之間正確的的路由。

初始化swarm或將Docker主機加入現有swarm時,會在該Docker主機上創建兩個新網絡:

  • 稱為覆蓋網絡ingress,處理與群集服務相關的控制和數據流量。創建群組服務並且不將其連接到用戶定義的覆蓋網絡時,ingress默認連接到網絡。
  • 一個名為的橋接網絡docker_gwbridge,它將各個Docker守護程序連接到參與該群集的其他守護進程。

您可以使用與創建用戶定義bridge網絡docker network create相同的方式創建用戶定義的overly網絡。服務或容器一次可以連接到多個網絡。服務或容器只能通過它們各自連接的網絡進行通信。

雖然您可以將swarm服務和獨立容器連接到覆蓋網絡,但默認行為和配置問題是不同的。因此,本主題的其余部分分為適用於所有覆蓋網絡的操作,適用於群集服務網絡的操作以及適用於獨立容器使用的覆蓋網絡的操作。

 

所有覆蓋網絡的操作

創建覆蓋網絡

先決條件

  • 使用覆蓋網絡的Docker守護程序的防火牆規則

    您需要以下端口打開來往於覆蓋網絡上的每個Docker主機的流量:

    • 用於集群管理通信的TCP端口2377
    • TCP和UDP端口7946用於節點之間的通信
    • UDP端口4789用於覆蓋網絡流量
  • 在創建覆蓋網絡之前,您需要將Docker守護程序初始化為swarm管理器,docker swarm init或者使用它將其連接到現有的swarm docker swarm join這些中的任何一個都會創建默認ingress覆蓋網絡,默認情況下 由群服務使用。即使您從未計划使用群組服務,也需要執行此操作。之后,您可以創建其他用戶定義的覆蓋網絡。

要創建用於swarm服務的覆蓋網絡,請使用如下命令:

$ docker network create -d overlay my-overlay

要創建可由群集服務 獨立容器用於與在其他Docker守護程序上運行的其他獨立容器通信的覆蓋網絡,請添加--attachable標志:

$ docker network create -d overlay --attachable my-attachable-overlay

您可以指定IP地址范圍,子網,網關和其他選項。詳情 docker network create --help請見。

加密覆蓋網絡上的流量

默認情況下,使用GCM模式下AES算法加密所有群集服務管理流量 群中的管理器節點每隔12小時輪換用於加密八卦數據的密鑰。

要加密應用程序數據,請--opt encrypted在創建覆蓋網絡時添加這樣可以在vxlan級別啟用IPSEC加密。此加密會產生不可忽視的性能損失,因此您應該在生產中使用此選項之前對其進行測試。

啟用覆蓋加密后,Docker會在所有節點之間創建IPSEC隧道,在這些節點上為連接到覆蓋網絡的服務安排任務。這些隧道還在GCM模式下使用AES算法,管理器節點每12小時自動旋轉密鑰。

SWARM模式覆蓋網絡和獨立容器

您可以將覆蓋網絡功能兩個參數 一起使用--opt encrypted --attachable ,並將非托管到集群中的容器附加到該網絡:

$ docker network create --opt encrypted --driver overlay --attachable my-attachable-multi-host-network

自定義默認入口網絡

大多數用戶從不需要配置ingress網絡,但Docker 17.05及更高版本允許您這樣做。如果自動選擇的子網與網絡上已存在的子網沖突,或者您需要自定義其他低級網絡設置(如MTU),則此功能非常有用。

自定義ingress網絡涉及刪除和重新創建它。這通常在您在swarm中創建任何服務之前完成。如果您具有發布端口的現有服務,則在刪除ingress網絡之前需要刪除這些服務

在沒有ingress網絡存在的時間內,不發布端口的現有服務繼續運行但不是負載平衡的。這會影響發布端口的服務,例如發布端口80的WordPress服務。

  1. 檢查ingress網絡使用docker network inspect ingress,並刪除其容器連接到它的任何服務。這些是發布端口的服務,例如發布端口80的WordPress服務。如果未停止所有此類服務,則下一步失敗。

  2. 刪除現有ingress網絡:

$ docker network rm ingress

WARNING! Before removing the routing-mesh network, make sure all the nodes
in your swarm run the same docker engine version. Otherwise, removal may not
be effective and functionality of newly created ingress networks will be
impaired.
Are you sure you want to continue? [y/N]

  3.使用--ingress標志創建新的覆蓋網絡,以及要設置的自定義選項。此示例將MTU設置為1200,將子網設置為10.11.0.0/16,並將網關設置為10.11.0.2

$ docker network create \
  --driver overlay \
  --ingress \
  --subnet=10.11.0.0/16 \
  --gateway=10.11.0.2 \
  --opt com.docker.network.driver.mtu=1200 \
  my-ingress

注意:您可以將ingress網絡命名為其他內容 ingress,但您只能擁有一個。嘗試創建第二個失敗。

  4.重新啟動您在第一步中停止的服務。

自定義docker_gwbridge接口

docker_gwbridge是一個虛擬網橋,將覆蓋網絡(包括ingress網絡)連接到單個Docker守護程序的物理網絡。

Docker初始化swarm或將Docker主機加入swarm時會自動創建它,但它不是Docker設備。它存在於Docker主機的內核中。如果您需要自定義其設置,則必須在將Docker主機加入群組之前或從群集中臨時刪除主機之后執行此操作。

  1. 停止docker_gwbridge。

  2. 刪除現有docker_gwbridge

$ sudo ip link set docker_gwbridge down

$ sudo ip link del dev docker_gwbridge

  3.啟動Docker。不要加入或初始化群。

  4.docker_gwbridge使用docker network create命令使用自定義設置手動創建或重新創建橋。此示例使用子網10.11.0.0/16。有關可自定義選項的完整列表,請參閱Bridge驅動程序選項

$ docker network create \
--subnet 10.11.0.0/16 \
--opt com.docker.network.bridge.name=docker_gwbridge \
--opt com.docker.network.bridge.enable_icc=false \
--opt com.docker.network.bridge.enable_ip_masquerade=true \
docker_gwbridge

  5.初始化或加入群。由於橋已經存在,Docker不會使用自動設置創建它。

群組服務的操作

在覆蓋網絡上發布端口

連接到同一覆蓋網絡的群集服務有效地將所有端口相互暴露。對於可在服務外部訪問的端口,必須使用標記on 發布該端口支持過期的冒號分隔語法和較新的逗號分隔值語法。較長的語法是首選,因為它有利於自我記憶。

-p --publishdocker service createdocker service update

 

標志值 描述
-p 8080:80
-p published = 8080,target = 80
將服務上的TCP端口80映射到路由網格上的端口8080。
-p 8080:80 / udp
-p published = 8080,target = 80,protocol = udp
將服務上的UDP端口80映射到路由網格上的端口8080。
-p 8080:80 / tcp -p 8080:80 / udp
-p published = 8080,target = 80,protocol = tcp -p published = 8080,target = 80,protocol = udp
將服務上的TCP端口80映射到路由網格上的TCP端口8080,並將服務上的UDP端口80映射到路由網格上的UDP端口8080。

 

繞過群集服務的路由網格

默認情況下,發布端口的swarm服務使用路由網格來實現。當您連接到任何swarm節點上的已發布端口(無論它是否正在運行給定服務)時,您將被透明地重定向到正在運行該服務的worker。實際上,Docker充當您的群服務的負載均衡器。使用路由網格的服務以虛擬IP(VIP)模式運行即使在每個節點上運行的服務(通過--global標志)也使用路由網格。使用路由網格時,無法保證哪個Docker節點服務客戶端請求。

要繞過路由網格,可以使用DNS循環(DNSRR)模式啟動服務,方法是將--endpoint-mode標志設置dnsrr您必須在服務前運行自己的負載均衡器。Docker主機上的服務名稱的DNS查詢返回運行該服務的節點的IP地址列表。配置負載均衡器以使用此列表並平衡節點之間的流量。

 

單獨的控制和數據流量

默認情況下,與群組管理相關的控制流量以及進出應用程序的流量都在同一網絡上運行,盡管群集控制流量已加密。您可以將Docker配置為使用單獨的網絡接口來處理兩種不同類型的流量。當你初始化或者加入群,分別指定--advertise-addr--datapath-addr您必須為加入群集的每個節點執行此操作。

 

覆蓋網絡上獨立容器的操作

將獨立容器連接到覆蓋網絡

ingress網絡創建是沒有 --attachable標志,這意味着只有群服務可以使用它,而不是獨立的容器。您可以將獨立容器連接到使用

--attachable標志創建的用戶定義的覆蓋網絡這使得在不同Docker守護程序上運行的獨立容器能夠進行通信,而無需在各個Docker守護程序主機上設置路由

 

 

發布端口

 

標志值 描述
-p 8080:80 將容器中的TCP端口80映射到覆蓋網絡上的端口8080。
-p 8080:80/udp 將容器中的UDP端口80映射到覆蓋網絡上的端口8080。
-p 8080:80/sctp 將容器中的SCTP端口80映射到覆蓋網絡上的端口8080。
-p 8080:80/tcp -p 8080:80/udp 將容器中的TCP端口80映射到覆蓋網絡上的TCP端口8080,並將容器中的UDP端口80映射到覆蓋網絡上的UDP端口8080。

 

 

 

容器發現

在大多數情況下,您應該連接到服務名稱,該名稱是負載平衡的,並由支持該服務的所有容器(“任務”)處理。要獲取支持該服務的所有任務的列表,請執行DNS查找tasks.<service-name>.

 

與覆蓋網絡聯網

預計閱讀時間: 21分鍾

這一系列教程涉及群組服務的網絡。有關使用獨立容器進行聯網的信息,請參閱 使用獨立容器聯網如果您需要了解有關Docker網絡的更多信息,請參閱概述

本主題包括四個不同的教程。您可以在Linux,Windows或Mac上運行它們,但是對於最后兩個,您需要在其他地方運行第二個Docker主機。

  • 使用默認overly網絡 演示了如何使用Docker在初始化或加入群集時自動為您設置的默認覆蓋網絡。該網絡不是生產系統的最佳選擇。

  • 使用自定義的overly網絡 顯示如何創建和使用您自己的自定義覆蓋網絡,以連接服務。建議用於生產中運行的服務。

  • 對獨立容器使用overly網絡 顯示如何使用覆蓋網絡在不同Docker守護程序上的獨立容器之間進行通信。

  • 容器和集群服務之間的通信 使用可附加的覆蓋網絡在獨立容器和群服務之間建立通信。Docker 17.06及更高版本支持此功能。

 

先決條件

這些要求您至少擁有一個單節點群,這意味着您已啟動Docker並docker swarm init在主機上運行您也可以在多節點群上運行示例。

最后一個示例需要Docker 17.06或更高版本。

使用默認overly網絡

在此示例中,您將從alpine各個服務容器的角度啟動服務並檢查網絡的特征。

本教程不涉及有關如何實現覆蓋網絡的操作系統特定細節,而是着重於從服務的角度來看覆蓋的功能。

先決條件

本教程需要三個物理或虛擬Docker主機,它們都可以相互通信,所有主機都運行Docker 17.03或更高版本的新安裝。本教程假定三台主機在同一網絡上運行,不涉及防火牆。

這些主機將被稱為managerworker-1worker-2該 manager主機將作為既是manager和worker,這意味着它可以運行服務任務和管理集群。worker-1worker-2僅作為worker,

資源使用情況

[root@docker11 ~]# uname -r
3.10.0-327.el7.x86_64
[root@docker11 ~]# cat /etc/redhat-release 
CentOS Linux release 7.2.1511 (Core) 
[root@docker11 ~]# docker --version
Docker version 18.06.0-ce, build 0ffa825

 

主機名 角色 ip
docker11 manager 10.0.0.11
docker12 worker 10.0.0.12
docker13 worker 10.0.0.13

 

演練

創建群

在此過程結束時,所有三個Docker主機將連接到群集,並將使用名為的覆蓋網絡連接在一起ingress

  1. master初始化群。如果主機只有一個網絡接口,則該--advertise-addr標志是可選的 

    $ docker swarm init --advertise-addr=<IP-ADDRESS-OF-MANAGER>

    [root@docker11 ~]# docker swarm init --advertise-addr=10.0.0.11
    Swarm initialized: current node (tqen693onueeokb4yhvctkzj2) is now a manager.

    To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-3s09ku0ul8knjiav33o2ekl9l5o6m18dx5dq7gemcialz7o1zf-5ovnjoejjw3tbjiypv7lj3zpo 10.0.0.11:2377

    To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

   記下打印的文本,因為它包含您將用於加入worker-1使用worker-2swarm 的標記將令牌token存儲在密碼管理器中是個比較好的建議。

 

  2.worker-1,加入群。如果主機只有一個網絡接口,則該--advertise-addr標志是可選的。   

$ docker swarm --join --token <TOKEN> \
  --advertise-addr <IP-ADDRESS-OF-WORKER-1> \
  <IP-ADDRESS-OF-MANAGER>:2377

  在docker12 上執行

[root@docker12 ~]#  docker swarm join --token SWMTKN-1-3s09ku0ul8knjiav33o2ekl9l5o6m18dx5dq7gemcialz7o1zf-5ovnjoejjw3tbjiypv7lj3zpo 10.0.0.11:2377
This node joined a swarm as a worker

       3. 在worker-2,加入群。如果主機只有一個網絡接口,則該--advertise-addr標志是可選的。  

$ docker swarm --join --token <TOKEN> \
  --advertise-addr <IP-ADDRESS-OF-WORKER-2> \
  <IP-ADDRESS-OF-MANAGER>:2377

  在docker13上執行

[root@docker13 ~]#  docker swarm join --token SWMTKN-1-3s09ku0ul8knjiav33o2ekl9l5o6m18dx5dq7gemcialz7o1zf-5ovnjoejjw3tbjiypv7lj3zpo 10.0.0.11:2377
This node joined a swarm as a worker.

  4.manager節點上,列出所有的節點。此命令只能從manager完成。

您還可以使用該--filter標志按角色進行過濾:

[root@docker11 ~]# docker node ls --filter role=manager
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
tqen693onueeokb4yhvctkzj2 *   docker11            Ready               Active              Leader              18.06.0-ce
[root@docker11 ~]# docker node ls --filter role=worker
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
id33e1c29uijlwa498u6u0aco     docker12            Ready               Active                                  18.06.0-ce
ojk0bn1tr0qmdc3t633yulm5j     docker13            Ready               Active                                  18.06.0-ce

列出Docker網絡

[root@docker11 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
eee9ca8be915        bridge              bridge              local
883db4142382        docker_gwbridge     bridge              local
0fb58f1bebd7        host                host                local
3g87ciii6vcm        ingress             overlay             swarm
624aa8834d74        none                null                local

docker_gwbridge是連接ingress網絡到docker主機的的網絡接口,以便manager和worker之間的通信可以流入和流出。

如果您創建swarm服務但未指定網絡,則它們將連接到ingress網絡。建議您為可以協同worker的每個應用程序或應用程序組使用單獨的覆蓋網絡

在下一個過程中,您將創建兩個覆蓋網絡並將服務連接到每個網絡。

創建服務

  1. manager,創建一個名為nginx-net的新覆蓋網絡

[root@docker11 ~]# docker network create -d overlay nginx-net
0jio47q1lesr6wcc3vv9imr0i

  2. 在manager,創建nginx-net連接到5副本的Nginx服務該服務將向外界發布端口80。所有服務任務容器都可以相互通信而無需打開任何端口。

  注意:只能在經理上創建服務。

[root@docker11 ~]# docker service create \
> --name my-nginx \
> --publish target=80,published=80 \
> --replicas=5 \
> --network nginx-net \
> nginx
id3jqur0qybc6rqtmppjzq9j1
overall progress: 5 out of 5 tasks 
1/5: running   [==================================================>] 
2/5: running   [==================================================>] 
3/5: running   [==================================================>] 
4/5: running   [==================================================>] 
5/5: running   [==================================================>] 
verify: Service converged 

默認的發布模式ingress,當你不指定所使用mode--publish標志,意味着如果在瀏覽到端口80上managerworker-1或者worker-2即使沒有,你會被連接到端口80上的5項服務任務之一,

當前任務正在您瀏覽的節點上運行。如果要使用host模式發布端口 ,可以添加mode=host--publish輸出。但是,您也應該使用--mode global而不是--replicas=5在這種情況下,因為只有一個服務任務可以綁定給定節點上的給定端口。

  3.運行docker service ls以監視服務啟動的進度,這可能需要幾秒鍾。

  4.檢查nginx-net網絡masterworker-1worker-2請記住,您不需要手動創建它worker-1, worker-2因為Docker會為您創建它。

   輸出將很長,但請注意ContainersPeers部分。Containers列出從該主機連接到覆蓋網絡的所有服務任務(或獨立容器)。

[root@docker11 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
eee9ca8be915        bridge              bridge              local
883db4142382        docker_gwbridge     bridge              local
0fb58f1bebd7        host                host                local
3g87ciii6vcm        ingress             overlay             swarm
0jio47q1lesr        nginx-net           overlay             swarm
624aa8834d74        none                null                local
[root@docker11 ~]# docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
47002c65a1c8        nginx:latest        "nginx -g 'daemon of…"   6 minutes ago       Up 6 minutes        80/tcp              my-nginx.2.aq7qnmt33c84mrw7dn8xzdmwb
1f4e3effd9bf        nginx:latest        "nginx -g 'daemon of…"   6 minutes ago       Up 6 minutes        80/tcp              my-nginx.5.i6nrst2f6x7l9uspiguprq779
[root@docker11 ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
47002c65a1c8        nginx:latest        "nginx -g 'daemon of…"   7 minutes ago       Up 6 minutes        80/tcp              my-nginx.2.aq7qnmt33c84mrw7dn8xzdmwb
1f4e3effd9bf        nginx:latest        "nginx -g 'daemon of…"   7 minutes ago       Up 6 minutes        80/tcp              my-nginx.5.i6nrst2f6x7l9uspiguprq779

  5.manager,檢查服務使用docker service inspect my-nginx 並注意有關服務使用的端口和端點的信息。

 

[root@docker11 ~]# docker service inspect my-nginx 
[
    {
        "ID": "id3jqur0qybc6rqtmppjzq9j1",
        "Version": {
            "Index": 25
        },
        "CreatedAt": "2018-08-20T09:13:25.208540232Z",
        "UpdatedAt": "2018-08-20T09:13:25.209631123Z",
        "Spec": {
            "Name": "my-nginx",
            "Labels": {},
            "TaskTemplate": {
                "ContainerSpec": {
                    "Image": "nginx:latest@sha256:d85914d547a6c92faa39ce7058bd7529baacab7e0cd4255442b04577c4d1f424",
                    "Init": false,
                    "StopGracePeriod": 10000000000,
                    "DNSConfig": {},
                    "Isolation": "default"
                },
                "Resources": {
                    "Limits": {},
                    "Reservations": {}
                },
                "RestartPolicy": {
                    "Condition": "any",
                    "Delay": 5000000000,
                    "MaxAttempts": 0
                },
                "Placement": {
                    "Platforms": [
                        {
                            "Architecture": "amd64",
                            "OS": "linux"
                        },
                        {
                            "OS": "linux"
                        },
                        {
                            "Architecture": "arm64",
                            "OS": "linux"
                        },
                        {
                            "Architecture": "386",
                            "OS": "linux"
                        },
                        {
                            "Architecture": "ppc64le",
                            "OS": "linux"
                        },
                        {
                            "Architecture": "s390x",
                            "OS": "linux"
                        }
                    ]
                },
                "Networks": [
                    {
                        "Target": "0jio47q1lesr6wcc3vv9imr0i"
                    }
                ],
                "ForceUpdate": 0,
                "Runtime": "container"
            },
            "Mode": {
                "Replicated": {
                    "Replicas": 5
                }
            },
            "UpdateConfig": {
                "Parallelism": 1,
                "FailureAction": "pause",
                "Monitor": 5000000000,
                "MaxFailureRatio": 0,
                "Order": "stop-first"
            },
            "RollbackConfig": {
                "Parallelism": 1,
                "FailureAction": "pause",
                "Monitor": 5000000000,
                "MaxFailureRatio": 0,
                "Order": "stop-first"
            },
            "EndpointSpec": {
                "Mode": "vip",
                "Ports": [
                    {
                        "Protocol": "tcp",
                        "TargetPort": 80,
                        "PublishedPort": 80,
                        "PublishMode": "ingress"
                    }
                ]
            }
        },
        "Endpoint": {
            "Spec": {
                "Mode": "vip",
                "Ports": [
                    {
                        "Protocol": "tcp",
                        "TargetPort": 80,
                        "PublishedPort": 80,
                        "PublishMode": "ingress"
                    }
                ]
            },
            "Ports": [
                {
                    "Protocol": "tcp",
                    "TargetPort": 80,
                    "PublishedPort": 80,
                    "PublishMode": "ingress"
                }
            ],
            "VirtualIPs": [
                {
                    "NetworkID": "3g87ciii6vcmnbbh5xhef9d6x",
                    "Addr": "10.255.0.5/16"
                },
                {
                    "NetworkID": "0jio47q1lesr6wcc3vv9imr0i",
                    "Addr": "10.0.0.5/24"
                }
            ]
        }
    }
]

  6.創建一個新網絡nginx-net-2,然后更新服務以使用此網絡而不是nginx-net

[root@docker11 ~]# docker network create -d overlay nginx-net-2
lf0ikr366da10357nkrwgruo5

   7.運行docker service ls以驗證服務是否已更新並且已重新部署所有任務。運行docker network inspect nginx-net以驗證沒有容器連接到它。運行相同的命令, nginx-net-2並注意所有服務任務容器都連接到它。

[root@docker11 ~]# docker network inspect nginx-net
[
    {
        "Name": "nginx-net",
        "Id": "0jio47q1lesr6wcc3vv9imr0i",
        "Created": "2018-08-20T17:13:25.381549021+08:00",
        "Scope": "swarm",
        "Driver": "overlay",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "10.0.0.0/24",
                    "Gateway": "10.0.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "lb-nginx-net": {
                "Name": "nginx-net-endpoint",
                "EndpointID": "907f7ab7106d1ca7e01a8d2cc212ca9285f6c4a111057cc08bbf61a4e3a7a18c",
                "MacAddress": "02:42:0a:00:00:04",
                "IPv4Address": "10.0.0.4/24",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.driver.overlay.vxlanid_list": "4097"
        },
        "Labels": {},
        "Peers": [
            {
                "Name": "5396a0282436",
                "IP": "10.0.0.11"
            },
            {
                "Name": "6bcf7a0cc868",
                "IP": "10.0.0.13"
            },
            {
                "Name": "96eed05fba40",
                "IP": "10.0.0.12"
            }
        ]
    }
]
[root@docker11 ~]# docker network inspect nginx-net-2
[
    {
        "Name": "nginx-net-2",
        "Id": "lf0ikr366da10357nkrwgruo5",
        "Created": "2018-08-20T17:25:53.36574903+08:00",
        "Scope": "swarm",
        "Driver": "overlay",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "10.0.1.0/24",
                    "Gateway": "10.0.1.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "2d551a9e08c75ee47a39e65b356f3bc06c67b1422ce07dafacdbe509ed24cee6": {
                "Name": "my-nginx.2.pjkfo8yk59zg4muoer0vq6zuz",
                "EndpointID": "f6322607d6eb098cc823dfea7ca9bd7aaeb341d495b6f400a8b7524fb55e1686",
                "MacAddress": "02:42:0a:00:01:09",
                "IPv4Address": "10.0.1.9/24",
                "IPv6Address": ""
            },
            "56572953de75e93f7f9bfdfc4e3ed9dc34f4242a188b0c9f86fd66cc5ebc18cf": {
                "Name": "my-nginx.5.8bog4krru1bcnfzgvw9hy2uuq",
                "EndpointID": "0c374ec88d475bb76e0a10123bd05fd7336b33966ea6f62a79d378ff169aeab4",
                "MacAddress": "02:42:0a:00:01:0a",
                "IPv4Address": "10.0.1.10/24",
                "IPv6Address": ""
            },
            "lb-nginx-net-2": {
                "Name": "nginx-net-2-endpoint",
                "EndpointID": "8d9ba9f7a00a4f75df7e0cadff0609be02c80068b33e947a76d558ab8e5a2336",
                "MacAddress": "02:42:0a:00:01:04",
                "IPv4Address": "10.0.1.4/24",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.driver.overlay.vxlanid_list": "4098"
        },
        "Labels": {},
        "Peers": [
            {
                "Name": "96eed05fba40",
                "IP": "10.0.0.12"
            },
            {
                "Name": "6bcf7a0cc868",
                "IP": "10.0.0.13"
            },
            {
                "Name": "5396a0282436",
                "IP": "10.0.0.11"
            }
        ]
    }
]

注意:即使根據需要在swarm worker節點上自動創建覆蓋網絡,也不會自動刪除它們。


   8.清理服務和網絡。manager,運行以下命令。manager將指導worker自動刪除網絡。

[root@docker11 ~]# docker service rm my-nginx 
my-nginx
[root@docker11 ~]# docker network rm nginx-net nginx-net-2
nginx-net
nginx-net-2

使用用戶定義的覆蓋網絡

先決條件

本教程假設已經設置了swarm並且您在經理上。

演練

  1. 創建用戶定義的覆蓋網絡。

[root@docker11 ~]# docker network create -d overlay my-overlay  
6pihnll7a2q3amg05j2vo2uqc

 

  2.使用覆蓋網絡啟動服務,並將端口80發布到Docker主機上的端口8080。

[root@docker11 ~]# docker service create \
> --name my-nginx \
> --network my-overlay \
> --replicas 1 \
> --publish published=8080,target=80 \
> nginx:latest
qewq4jy05n7sar8d6rfzaf3ny
overall progress: 1 out of 1 tasks 
1/1: running   [==================================================>] 
verify: Service converged 

 

  3.通過查看該部分運行docker network inspect my-overlay並驗證my-nginx服務任務是否已連接到服務任務Containers

[root@docker11 ~]# docker network inspect my-overlay 
[
    {
        "Name": "my-overlay",
        "Id": "6pihnll7a2q3amg05j2vo2uqc",
        "Created": "2018-08-20T17:42:41.326901392+08:00",
        "Scope": "swarm",
        "Driver": "overlay",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "10.0.2.0/24",
                    "Gateway": "10.0.2.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "f0d353bca975761ad2c9665db20075af128886a1d171b15dc2dec365b7a0c384": {
                "Name": "my-nginx.1.ohho088gz1el01pgwtmnyrbyk",
                "EndpointID": "94ae0e87deb040b4285c4624cf64d520b5696d6738834ef4d3668e00840d0b42",
                "MacAddress": "02:42:0a:00:02:06",
                "IPv4Address": "10.0.2.6/24",
                "IPv6Address": ""
            },
            "lb-my-overlay": {
                "Name": "my-overlay-endpoint",
                "EndpointID": "f3c160b564513b3fea1adbb985bb042008d0d3f3a40770e2e4fbc990109b707d",
                "MacAddress": "02:42:0a:00:02:04",
                "IPv4Address": "10.0.2.4/24",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.driver.overlay.vxlanid_list": "4099"
        },
        "Labels": {},
        "Peers": [
            {
                "Name": "5396a0282436",
                "IP": "10.0.0.11"
            }
        ]
    }
]

  4.刪除服務和網絡。

[root@docker11 ~]# docker service rm my-nginx 
my-nginx
[root@docker11 ~]# docker network rm my-overlay 
my-overlay

將覆蓋網絡用於獨立容器

此示例演示了DNS容器發現 - 具體來說,是如何使用覆蓋網絡在不同Docker守護程序上的獨立容器之間進行通信。步驟是:

  • host1,將節點初始化為swarm(管理器)。
  • 單擊host2,將節點加入swarm(worker)。
  • host1,創建一個可附加的覆蓋網絡(test-net)。
  • host1打開一個交互式容器(alpine1test-net
  • host2打開一個交互式,分離的容器(alpine2test-net
  •  host1的會話中。ping      alpine1 alpine2

先決條件

對於此測試,您需要兩個可以相互通信的不同Docker主機。每個主機必須具有Docker 17.06或更高版本,並且在兩個Docker主機之間打開以下端口:

  • TCP端口2377
  • TCP和UDP端口7946
  • UDP端口4789

 

 

演練

  1. 設置群。

    打開host1,初始化一個群(如果提示,則用於--advertise-addr 指定與群中其他主機通信的接口的IP地址,例如,AWS上的私有IP地址):

$ docker swarm init
Swarm initialized: current node (vz1mm9am11qcmo979tlrlox42) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-5g90q48weqrtqryq4kj6ow0e8xm9wmv9o6vgqc5j320ymybd5c-8ex8j0bc40s6hgvy5ui5gl4gy 172.31.47.252:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

   host2,按照上面的說明加入群體:

$ docker swarm join --token <your_token> <your_ip_address>:2377
This node joined a swarm as a worker.

如果節點無法加入群集,則docker swarm join命令超時。要解決,運行docker swarm leave --forcehost2,驗證您的網絡和防火牆設置,然后再試一次。

其實我還是復用剛剛上面的群集

   2.host1,創建一個可附加的覆蓋網絡,稱為test-net

[root@docker11 ~]# docker network create --driver=overlay --attachable test-net
pbfhuwobalq951patyl7au0gw

請注意返回的NETWORK ID - 當您連接到它時,您將在host2再次看到它

  3.host1,啟動一個連接到的interactive(-it)容器(alpine1test-net

[root@docker11 ~]# docker network create --driver=overlay --attachable test-net
pbfhuwobalq951patyl7au0gw
[root@docker11 ~]# dock
[root@docker11 ~]# docker run -it --name alpine1 --network test-net alpine
Unable to find image 'alpine:latest' locally
latest: Pulling from library/alpine
8e3ba11ec2a2: Pull complete 
Digest: sha256:0873c923e00e0fd2ba78041bfb64a105e1ecb7678916d1f7776311e45bf5634b
Status: Downloaded newer image for alpine:latest
/ # 

  4.host2,列出可用的網絡 - 通知test-net尚不存在

[root@docker12 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
6420cf5136cb        bridge              bridge              local
10c56fdf193c        docker_gwbridge     bridge              local
0fb58f1bebd7        host                host                local
3g87ciii6vcm        ingress             overlay             swarm
624aa8834d74        none                null                local

  5.host2,啟動一個連接到的detached(-d)和interactive(-it)容器(alpine2test-net

[root@docker12 ~]# docker run -dit --name alpine2 --network test-net alpine
Unable to find image 'alpine:latest' locally
latest: Pulling from library/alpine
8e3ba11ec2a2: Pull complete 
Digest: sha256:7043076348bf5040220df6ad703798fd8593a0918d06d3ce30c6c93be117e430
Status: Downloaded newer image for alpine:latest
8e5aaf169b69e3c8329aaab4ec80a66133ef9ea47283b362892da5f300bbd1bf

自動DNS容器發現僅適用於名稱唯一的容器

  6.host2,驗證test-net被創建(和具有相同的網絡ID為test-nethost1):

[root@docker11 ~]# docker network ls|grep test-net
pbfhuwobalq9        test-net            overlay             swarm

[root@docker12 ~]# docker network ls|grep test-net
pbfhuwobalq9        test-net            overlay             swarm

  7.host1alpine2交互式終端內ping alpine1

/ # ping -c 2 alpine2
PING alpine2 (10.0.3.6): 56 data bytes
64 bytes from 10.0.3.6: seq=0 ttl=64 time=0.298 ms
64 bytes from 10.0.3.6: seq=1 ttl=64 time=0.358 ms

--- alpine2 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.298/0.328/0.358 ms

兩個容器與連接兩個主機的覆蓋網絡通信。如果您運行的另一個容器 與host2不相關的,可以從host2   ping alpine1(在這里,我們添加 刪除選項自動清理容器):

/ # ping -c 2 alpine1
PING alpine1 (10.0.3.7): 56 data bytes
64 bytes from 10.0.3.7: seq=0 ttl=64 time=0.399 ms
64 bytes from 10.0.3.7: seq=1 ttl=64 time=0.320 ms

--- alpine1 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.320/0.359/0.399 ms

/ # exit
[root@docker12 ~]#

  

  8.打開host1,關閉alpine1會話(也會停止容器):

/ # exit
[root@docker11 ~]# 

  9.清理容器和網絡:

  您必須單獨停止和刪除每個主機上的容器,因為Docker守護程序獨立運行,並且這些是獨立容器。您只需要刪除host1網絡,因為當您停止 alpine2host2test-net消失。

  打開host2,停止alpine2,檢查test-net已刪除,然后刪除alpine2

  

[root@docker12 ~]# docker rm alpine2 
alpine2

  打開host1,刪除alpine1test-net

[root@docker11 ~]# docker rm alpine1 
alpine1

 [root@docker11 ~]# docker network rm test-net
 test-net

在容器和群服務之間進行通信

先決條件

此示例需要Docker 17.06或更高版本。

演練

在此示例中,您需要安裝並運行Docker,您在同一個Docker主機上啟動兩個不同的alpine容器,並進行一些測試以了解它們如何相互通信。

  1. 打開終端窗口。在執行任何其他操作之前列出當前網絡。如果您從未在此Docker守護程序上添加網絡或初始化群組,那么您應該看到以下內容。您可能會看到不同的網絡,但至少應該看到這些(網絡ID會有所不同):

$ docker network ls

NETWORK ID          NAME                DRIVER              SCOPE
17e324f45964        bridge              bridge              local
6ed54d316334        host                host                local
7092879f2cc8        none                null                local

bridge列出了默認網絡以及hostnone后兩者不是完全成熟的網絡,但用於啟動直接連接到Docker守護程序主機的網絡堆棧的容器,或用於啟動沒有網絡設備的容器。本教程將兩個容器連接到bridge網絡。

   

  2.bridge是默認網絡, 以及hostnone。后兩者不是完全成熟的網絡,但用於啟動直接連接到Docker守護程序主機的網絡堆棧的容器,或用於啟動沒有網絡設備的容器。本教程將兩個容器連接到bridge網絡。

   啟動兩個alpine容器運行ash,這是Alpine的默認shell是ash而不是bash。該-dit標志意味着要首先分離容器(背景),互動(與輸入到它的能力),並與TTY(這樣你就可以看到輸入和輸出)。

   由於您正在啟動它,因此您不會立即連接到容器。而是打印容器的ID。由於您尚未指定任何 --network標志,因此容器將連接到默認bridge網絡。

  

[root@docker11 ~]# docker run -dit --name alpine1 alpine ash
5c996592ef2625823aca676ed2c74dcbca9bb70476532c3aeabc128dbad0788b
[root@docker11 ~]# docker run -dit --name alpine2 alpine ash
3156de9fdae1230baa3c19d038e347cb197f78d9b32bfb4e56bfdb948b724fbd

檢查兩個容器是否實際啟動:

  3.檢查bridge網絡以查看連接到它的容器。

[root@docker11 ~]# docker network inspect bridge 
[
    {
        "Name": "bridge",
        "Id": "eee9ca8be915650919c6a86c66e9b8c26f862943abfc99f46c01efdfa405de2b",
        "Created": "2018-08-20T16:47:37.448247591+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "3156de9fdae1230baa3c19d038e347cb197f78d9b32bfb4e56bfdb948b724fbd": {
                "Name": "alpine2",
                "EndpointID": "4d08f938c8e30dfccd1e90b9055a2bfbcf34443aed56cbbf6b459887294bc0f8",
                "MacAddress": "02:42:ac:11:00:03",
                "IPv4Address": "172.17.0.3/16",
                "IPv6Address": ""
            },
            "5c996592ef2625823aca676ed2c74dcbca9bb70476532c3aeabc128dbad0788b": {
                "Name": "alpine1",
                "EndpointID": "ce96f52236f5b7a5b8489a59d3f6ef76a63489aa2dfd37288e585b547cbcef38",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]

在頂部附近bridge列出了有關網絡的信息,包括Docker主機和bridge 網絡之間的網關的IP地址172.17.0.1)。Containers密鑰下面,列出了每個連接的容器,以及有關其IP地址(172.17.0.2 for alpine1172.17.0.3 for alpine2)的信息。

  4.容器在后台運行。使用docker attach 命令連接到alpine1

第一個接口是環回設備。暫時忽略它。請注意,第二個接口具有IP地址172.17.0.2,該地址alpine1與上一步中顯示的地址相同

   5.從內部alpine1,確保您可以通過ping連接到互聯網baidu.com-c 2標志限制命令兩次ping 嘗試。

 

  6.現在嘗試ping第二個容器。首先,通過IP地址ping它 172.17.0.3

這成功了。接下來,嘗試alpine2按容器名稱ping 容器。這將失敗。

 

  7.alpine2使用分離序列分離而不停止它, CTRLp CTRLq(按住CTRL並鍵入p后跟q)。如果你願意,重視alpine2並重復步驟4,5和6出現,取代alpine1alpine2

  8.停止並移除兩個容器。

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM