docker中的網絡

docker中的中涉及到多種網絡結構,做簡單介紹

  • 本地網絡
網絡類型 說明
bridge –net=bridge 默認模式,NAT轉發
host –net=host 使用宿主機網絡
none –net=none 無網卡
container –net=container:容器名或ID ,共用其它容器網絡

如果要是容器與宿主機進行通訊則不可選擇host和container這兩種網絡,如果你僅需要Docker容器與宿主機網段相同,容器與其他同網段節點相互通信,不與宿主機進行通信,可以使用host網絡模型!

  • 跨主機網絡
網絡類型 說明
overlay vxlan模式
macvlan 使用外部lan,需手動配置

macvlan的原理是在宿主機物理網卡上虛擬出多個子網卡,通過不同的MAC地址在數據鏈路層進行網絡數據轉發的,它是比較新的網絡虛擬化技術,需要較新的內核支持,使用macVLAN模式的容器,無法ping通宿主機,宿主機也無法ping通該容器,對其他同網段的服務器和容器都可以聯通。

使用bridge網絡

在網絡方面,橋接網絡是鏈路層設備,它在網絡段之間轉發流量。網橋可以是硬件設備或在主機內核中運行的軟件設備。

就Docker而言,橋接網絡使用軟件橋接器,該軟件橋接器允許連接到同一橋接網絡的容器進行通信,同時提供與未連接到該橋接網絡的容器的隔離。 Docker橋驅動程序會自動在主機中安裝規則,以便不同網橋上的容器無法直接相互通信。

橋接網絡適用於在同一個Docker守護程序主機上運行的容器。對於在不同Docker守護程序主機上運行的容器之間的通信,您可以在操作系統級別管理路由,也可以使用覆蓋網絡。

啓動Docker時,會自動創建默認橋接網絡(也稱爲網橋),並且除非另行指定,否則新啓動的容器將連接到該網絡。您還可以創建用戶定義的自定義網橋。用戶定義的網橋優於默認網橋。

啓用從Docker容器轉發到外部世界

默認情況下,來自連接到默認網橋的容器的流量不會轉發到外部世界。要啓用轉發,您需要更改兩個設置。這些不是Docker命令,它們會影響Docker主機的內核。

1、配置Linux內核以允許IP轉發。

$ sysctl net.ipv4.conf.all.forwarding=1

2、將iptables FORWARD策略的策略從DROP更改爲ACCEPT

$ sudo iptables -P FORWARD ACCEPT
配置默認網橋,修改/etc/docker/daemon.json的文件,添加類似如下以下字段
{
  "bip": "192.168.1.5/24",
  "fixed-cidr": "192.168.1.5/25",
  "fixed-cidr-v6": "2001:db8::/64",
  "mtu": 1500,
  "default-gateway": "10.20.1.1",
  "default-gateway-v6": "2001:db8:abcd::89",
  "dns": ["10.20.1.2","10.20.1.3"]
}

使用overlay網絡

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

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

1、一個名爲ingress的overlay網絡,用於處理與羣服務相關的控制和數據流量。創建羣組服務時,如果不將其連接到用戶定義的覆蓋網絡,則默認情況下會連接到入口網絡

2、一個名爲docker_gwbridge的bridge網絡,它將各個Docker守護程序連接到參與swarm的其他守護進程。

注意:不同主機上的服務通過overlay網絡中的名爲ingress網絡進行通信,當訪問到達某主機後,該主機的容器則通過名爲docker_gwbridge的bridge網絡進行通信

創建overlay網絡

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

準備工作

1、 使用overlay網絡的Docker守護程序的防火牆規則,您需要以下端口打開來往於overlay網絡上的每個Docker主機的流量:
- 用於集羣管理通信的TCP端口2377
- TCP和UDP端口7946用於節點之間的通信
- UDP端口4789用於overlay網絡流量

2、在創建覆蓋網絡之前,您需要使用docker swarm init將Docker守護程序初始化爲swarm管理器,或者使用docker swarm join將其連接到現有的swarm。這些中的任何一個都會創建默認的入口overlay網絡,默認情況下由羣集服務使用。即使您從未計劃使用羣組服務,也需要執行此操作。之後,您可以創建其他用戶自定義的overlay網絡。

網絡創建

1、 創建用戶自定義的overlay網絡

$ docker network create -d overlay my-overlay

2、要創建可由羣集服務或獨立容器用於與在其他Docker守護程序上運行的其他獨立容器通信的overlay網絡,請添加–attachable標誌:

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

您可以指定IP地址範圍,子網,網關和其他選項。有關詳細信息,請參閱docker network create –help。

overlay加密

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

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

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

您可以將覆蓋網絡功能與–opt encrypted –attachable一起使用,並將非託管容器附加到該網絡

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

自定義默認的ingress網絡

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

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

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

1、使用docker network inspect ingress檢查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標誌創建新的overlay網絡,以及要設置的自定義選項。此示例將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

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

自定義docker_gwbridge接口

docker_gwbridge是一個虛擬網橋,可將overlay網絡(包括ingress網絡)連接到單個Docker守護程序的物理網絡。 Docker初始化swarm或將Docker主機加入swarm時會自動創建它,但它不是Docker設備。它存在於Docker主機的內核中。如果您需要自定義其設置,則必須在將Docker主機加入羣組之前或從羣集中臨時刪除主機之後執行此操作。

1、停止容器

2、刪除現有的docker_gwbridge接口。

$ sudo ip link set docker_gwbridge down

$ sudo ip link del dev docker_gwbridge

3、啓動Docker。不要加入或初始化羣

4、使用docker network create命令,使用自定義設置手動創建或重新創建docker_gwbridge橋。此示例使用子網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不會使用自動設置創建它

Operations for swarm services

1、在overlay網絡上發佈端口

連接到同一overlay網絡的swarm服務有效地將所有端口相互暴露。對於可在服務外部訪問的端口,必須使用docker service create或docker service update上的-p或–publish標誌發佈該端口。支持遺留冒號分隔語法和較新的逗號分隔值語法。較長的語法是首選,因爲它有點自我記錄。

2、繞過swarm服務的路由網格

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

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

3、單獨的控制和數據流量

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

Operations for standalone containers on overlay networks

1、將獨立容器連接到overlay網絡

ingress網絡是在沒有–attachable標誌的情況下創建的,這意味着只有swarm服務可以使用它,而不是獨立的容器。您可以將獨立容器連接到使用–attachable標誌創建的用戶定義的overlay網絡。這使得在不同Docker守護程序上運行的獨立容器能夠進行通信,而無需在各個Docker守護程序主機上設置路由。

2、發佈端口

Flag value Description
-p 8080:80 Map TCP port 80 in the container to port 8080 on the overlay network.
-p 8080:80/udp Map UDP port 80 in the container to port 8080 on the overlay network.
-p 8080:80/sctp Map SCTP port 80 in the container to port 8080 on the overlay network.
-p 8080:80/tcp -p 8080:80/udp Map TCP port 80 in the container to TCP port 8080 on the overlay network, and map UDP port 80 in the container to UDP port 8080 on the overlay network.

3、容器發現

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

使用Macvlan網絡

某些應用程序,尤其是遺留應用程序或監視網絡流量的應用程序,希望直接連接到物理網絡。在這種情況下,您可以使用macvlan網絡驅動程序爲每個容器的虛擬網絡接口分配MAC地址,使其看起來像是直接連接到物理網絡的物理網絡接口。在這種情況下,您需要在Docker主機上指定一個物理接口,用於Macvlan,以及Macvlan的子網和網關。您甚至可以使用不同的物理網絡接口隔離Macvlan網絡。請記住以下事項:

1、由於IP地址耗盡或“VLAN傳播”,很容易無意中損壞您的網絡,在這種情況下,您的網絡中有大量不同的唯一MAC地址。

2、您的網絡設備需要能夠處理“混雜模式”,其中一個物理接口可以分配多個MAC地址。
如果您的應用程序可以使用bridge(在單個Docker主機上)或overlay(跨多個Docker主機進行通信),那麼從長遠來看,這些解決方案可能會更好。

創建Macvlan網絡

創建Macvlan網絡時,它可以處於橋接模式或802.1q幹線橋接模式。

  • 在橋接模式下,Macvlan流量通過主機上的物理設備。

  • 在802.1q中繼橋接模式下,流量通過Docker在運行中創建的802.1q子接口。這使您可以在更細粒度的級別上控制路由和篩選。

Bridge mode

要創建與給定物理網絡接口橋接的Macvlan網絡,請使用–driver macvlan和docker network create命令。您還需要指定父級,即流量將在Docker主機上實際通過的接口。

$ docker network create -d macvlan \
  --subnet=172.16.86.0/24 \
  --gateway=172.16.86.1  \
  -o parent=eth0 pub_net

如果您需要排除在Macvlan網絡中使用的IP地址,例如當已使用給定的IP地址時,請使用–aux-addresses:

$ docker network create -d macvlan  \
  --subnet=192.168.32.0/24  \
  --ip-range=192.168.32.128/25 \
  --gateway=192.168.32.254  \
  --aux-address="my-router=192.168.32.129" \
  -o parent=eth0 macnet32

802.1q trunk bridge mode

如果指定包含點的父接口名稱(例如eth0.50),則Docker會將其解釋爲eth0的子接口並自動創建子接口。

$ docker network  create  -d macvlan \
    --subnet=192.168.50.0/24 \
    --gateway=192.168.50.1 \
    -o parent=eth0.50 macvlan50

使用ipvlan而不是macvla

在上面的示例中,您仍在使用L3網橋。您可以使用ipvlan代替,並獲得L2網橋。指定-o ipvlan_mode = l2。

$ docker network create -d ipvlan \
    --subnet=192.168.210.0/24 \
    --subnet=192.168.212.0/24 \
    --gateway=192.168.210.254  \
    --gateway=192.168.212.254  \
     -o ipvlan_mode=l2 ipvlan210
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章