Docker學習(11) Docker 網(wǎng)絡(luò)

Docker學習(11) Docker 網(wǎng)絡(luò)

  • Docker網(wǎng)絡(luò)體系的基本原理:容器網(wǎng)絡(luò)模型、以及Libnetwork

Docker網(wǎng)絡(luò)簡介

  • Docker的網(wǎng)絡(luò)架構(gòu)源自一個叫做容器網(wǎng)絡(luò)模型(CNM)
  • Libnetwork是Docker對CNM的一種實現(xiàn),提供了Docker核心網(wǎng)絡(luò)架構(gòu)的全部功能。
  • 為了實現(xiàn)開箱即用的效果,Docker封裝了一系列的本地驅(qū)動,包括:
      1. 單機橋接網(wǎng)絡(luò)(Single-Host Brige Network)
      2. 多機覆蓋網(wǎng)絡(luò)(Multi-Host Overlay)
  • Libnetwork提供了本地服務(wù)發(fā)現(xiàn)和容器的負載均衡解決方案。

Docker網(wǎng)絡(luò)——詳解

基礎(chǔ)理論

  • Docker的網(wǎng)絡(luò)架構(gòu)主要由3個部分過程:CNM、Libnetwork和驅(qū)動

CNM

  • CNM是docker網(wǎng)絡(luò)的設(shè)計標準:規(guī)定了Docker網(wǎng)絡(luò)架構(gòu)的基礎(chǔ)組成要素。
  • 具體內(nèi)容:https://github.com/docker/libnetwork
  • CNM定義了三個基本要素:沙盒(Sandbox)、終端(Endpoint)和網(wǎng)絡(luò)(network)
    • 沙盒:獨立的網(wǎng)絡(luò)桟,包括以太網(wǎng)的接口、端口、路由表以及NDS配置。
    • 終端:虛擬網(wǎng)絡(luò)接口,和普通網(wǎng)絡(luò)接口一樣,主要負責創(chuàng)建網(wǎng)絡(luò),在CNM中,主要是將沙盒連接到網(wǎng)絡(luò)
    • 網(wǎng)絡(luò):是802.1d網(wǎng)橋的軟件實現(xiàn),網(wǎng)絡(luò)就是需要交互終端的集合,并且終端直接相互集合。
  • docker環(huán)境中最小的調(diào)度單位是容器。

Libnetwork

  • Libnetwork是CNM的具體實現(xiàn),通過Go語言編寫的,實現(xiàn)了CNM列出的核心組件。
  • Libnetwork實現(xiàn)了CNM定義的3個組件。還實現(xiàn)了本地發(fā)現(xiàn)功能,基于Ingress的容器負載均衡,以及網(wǎng)絡(luò)控制層和管理層的功能。

驅(qū)動

  • 通過實現(xiàn)特定網(wǎng)絡(luò)拓撲的方式來拓撲該模型的能力。

  • 驅(qū)動負責實現(xiàn)了網(wǎng)絡(luò)的數(shù)據(jù)層。

  • Docker封裝了內(nèi)置驅(qū)動,包括bridge,Overlay以及macvlan

單機橋接網(wǎng)絡(luò)

  • 單機:該網(wǎng)絡(luò)只在單個docker主機中運行,并且只能在docker主機內(nèi)的容器進行連接。
  • 橋接:802.1d橋接的一種實現(xiàn)。
  • linux Docker創(chuàng)建網(wǎng)絡(luò)時采用的是內(nèi)置的橋接驅(qū)動。默認的單機橋接網(wǎng)絡(luò)時bridge
  • 查看docker主機默認的網(wǎng)絡(luò)
lhf@lhf-virtual-machine:~$ docker network ls
NETWORK ID          NAME                             DRIVER              SCOPE
3c6fd32ed9fb        bridge                           bridge              local
8b95e29168fa        counter-app-master_counter-net   bridge              local
682a75797ba4        host                             host                local
596066e2fd78        none                             null                local

  • 查看docker網(wǎng)絡(luò)的詳細信息
lhf@lhf-virtual-machine:~$ docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "3c6fd32ed9fbe215b5ee34a773ba14703ea7d0a295a3b54cd01906c3c2b749b6",
        "Created": "2019-11-08T21:51:18.740007297+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": {},
        "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": {}
    }
]

  • docker網(wǎng)絡(luò)由bridge驅(qū)動創(chuàng)建的。bridge底層基于linux內(nèi)核 linux bridge技術(shù)。
  • 查看bridge網(wǎng)絡(luò)
lhf@lhf-virtual-machine:~$ ip link show docker0
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default 
    link/ether 02:42:03:5f:82:17 brd ff:ff:ff:ff:ff:ff

  • 默認的“bridge”網(wǎng)絡(luò)映射到內(nèi)核中為“docker0”的linux網(wǎng)橋
lhf@lhf-virtual-machine:~$ docker network inspect bridge | grep bridge.name
            "com.docker.network.bridge.name": "docker0",
  • 創(chuàng)建一個新的單機橋接網(wǎng)絡(luò),名為“l(fā)ocalnet”
lhf@lhf-virtual-machine:~$ docker network create -d bridge localnet
2b5ed819e9331ffa5c109f5f81dc6080f18e78cee7fc8ad05df9455247c01a0b
lhf@lhf-virtual-machine:~$ docker network ls | grep localnet
2b5ed819e933        localnet                         bridge              local

  • 通過使用brctl工具查看系統(tǒng)中的linux網(wǎng)橋。
lhf@lhf-virtual-machine:~$ brctl show
bridge name bridge id       STP enabled interfaces
br-2b5ed819e933     8000.02421d8b6570   no      
br-8b95e29168fa     8000.024223c21723   no      
docker0     8000.0242035f8217   no  
  • 創(chuàng)建一個新的容器,并接入新建網(wǎng)絡(luò)localnet中
$ docker container run -d --name c1 \
> --network c1 \
> alpine sleep 1d

$ docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
f8bf6041757a        alpine              "sleep 1d"          46 seconds ago      Up 43 seconds                           c1


  • 查看詳細輸出
$ docker network inspect  localnet --format
"ConfigOnly": false,
        "Containers": {
            "f8bf6041757a51afc6b56d35a84a8370037d207230101c0df6fc565da1d68741": {
                "Name": "c1",
                "EndpointID": "7016a80031330e87c3073c1cd148a5bbef6aa39738cd84bcdfe1657cf19f214e",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

$ brctl show
bridge name bridge id       STP enabled interfaces
br-2b5ed819e933     8000.02421d8b6570   no      veth53c5236
br-8b95e29168fa     8000.024223c21723   no      
docker0     8000.0242035f8217   no      
  • 查看到c1網(wǎng)絡(luò)已經(jīng)接入到veth53c5236
  • 如果在相同的網(wǎng)絡(luò)接入新的容器c2的話,是可以ping通c1的

  • 創(chuàng)建一個c2容器

$ docker container run -it --name c2 \
> --network localnet \
> alpine sh
/ # ping c1
PING c1 (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.296 ms
64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.143 ms
^C
--- c1 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.143/0.219/0.296 ms
/ # 

  • 新容器都指定了docker的DNS服務(wù)。,所有相同網(wǎng)絡(luò)的容器可以解析到其他容器的名稱。

端口映射

  • 端口映射:將某個容器的端口映射到docker主機的端口上。
  • 將容器運行一個web'服務(wù)80映射到docker主機 5000
$ docker container run -d --name web \
> --network localnet \
> --publish 5000:80 \
> nginx

  • 確認端口映射
$ docker port web
80/tcp -> 0.0.0.0:5000

  • 通過web查看服務(wù)


    15.png

多機覆蓋網(wǎng)絡(luò)

  • 覆蓋網(wǎng)絡(luò)適用于多機環(huán)境,允許單個網(wǎng)絡(luò)包含多個主機。不同主機的容器可以通過鏈路層實現(xiàn)通信。
  • docker主機為覆蓋網(wǎng)絡(luò)提供了本地驅(qū)動,在創(chuàng)建網(wǎng)絡(luò)時docker network create 時添加參數(shù) --d overlay

接入現(xiàn)有網(wǎng)絡(luò)

  • 將容器化的應(yīng)用接入到外部系統(tǒng)以及物理網(wǎng)絡(luò)功能。比如:
    • 容器化的應(yīng)用于運行的物理網(wǎng)絡(luò)和VLAN上未容器化的部分進行通信。
    • docker 的內(nèi)置驅(qū)動(Macvlan),為容器提供mac和IP地址

用于故障排查的容器和服務(wù)日志

  • 容器間網(wǎng)絡(luò)連接問題,檢查daemon日志和容器日志

  • 在linux上,daemon日志存放位置取決于當前系統(tǒng)使用的初始化方式。

    • 如果是systemd,日志會存儲在Journald,通過journalctl -u docker.service查看

    • 如果不是systemd,需要查看如下存放位置

      • Ubuntu系統(tǒng):upstart:/var/log/upstart/docker.log
      • RHEl系統(tǒng):systems:/var/log/messages
      • Debian系統(tǒng): /var/log/daemon.log
    • 可以設(shè)置daemon日志的詳細程度。通過編輯daemon的配置文件(daemon.json),將debug改為true,設(shè)置log-level為某個值:

      • debug:最詳細的日志
      • info:默認值,僅次于最詳細日志
      • warn:第三詳細日志級別
      • error:第四詳細日志級別
      • fatal;最粗略的日志級別
  • 查看單個容器日志
$ docker container logs web
172.18.0.1 - - [08/Nov/2019:16:15:38 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:70.0) Gecko/20100101 Firefox/70.0" "-"

服務(wù)發(fā)現(xiàn)

  • 服務(wù)發(fā)現(xiàn)(Service Discovery)允許容器和Swarm服務(wù)通過名稱相互定位,需要在同一個網(wǎng)絡(luò)中。

  • 底層實現(xiàn)是利用Docker內(nèi)置的DNS功能,為每個容器提供DNS解析。上述例子c2可以ping通c1

  • 具體過程分析

    1. ping c2 命令調(diào)用本地DNS解釋器,嘗試將c2解析成具體的IP地址,每個docker都有本地的DNS解釋器。
    2. 如果本地DNS解釋器在本地緩存沒有c2相對應(yīng)的IP地址的映射關(guān)系。本地DNS會想dockerDNS發(fā)起一個遞歸查詢。
    3. Docker DNS服務(wù)器器記錄了全部容器的容器名和IP地址的映射關(guān)系。
    4. Docker DNS服務(wù)器會返回給“c2”相對應(yīng)的IP地址給c1的本地DNS解釋器,
    5. ping 命令返回給c2對應(yīng)的IP地址。

Ingress網(wǎng)絡(luò)

  • Swarm支持兩種服務(wù)發(fā)布模式。
    • Ingress模式:保證swarm服務(wù)中任意節(jié)點都可以訪問該服務(wù)(默認的模式)
    • Host模式:只能通過運行服務(wù)副本的節(jié)點來訪問。

docker網(wǎng)絡(luò)——命令

  • docker network ls :列出運行在本地的docker主機的全部網(wǎng)絡(luò)
  • docker network create :創(chuàng)建新的docker網(wǎng)絡(luò)。默認采用的是bridge 加-d參數(shù)指定(網(wǎng)絡(luò)類型)
  • docker network inspect:提供docker網(wǎng)絡(luò)的詳細配置信息。
  • docker network prune:刪除docker主機上全部未使用的網(wǎng)絡(luò)。
  • docker network rm :刪除docker主機上指定的網(wǎng)絡(luò)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容