Docker學(xué)習(xí)(11) Docker 網(wǎng)絡(luò)

Docker學(xué)習(xí)(11) Docker 網(wǎng)絡(luò)

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

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

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

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

基礎(chǔ)理論

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

CNM

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

Libnetwork

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

驅(qū)動(dòng)

  • 通過實(shí)現(xiàn)特定網(wǎng)絡(luò)拓?fù)涞姆绞絹硗負(fù)湓撃P偷哪芰Α?/p>

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

  • Docker封裝了內(nèi)置驅(qū)動(dòng)旨袒,包括bridge汁针,Overlay以及macvlan

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

  • 單機(jī):該網(wǎng)絡(luò)只在單個(gè)docker主機(jī)中運(yùn)行,并且只能在docker主機(jī)內(nèi)的容器進(jìn)行連接峦失。
  • 橋接:802.1d橋接的一種實(shí)現(xiàn)扇丛。
  • linux Docker創(chuàng)建網(wǎng)絡(luò)時(shí)采用的是內(nèi)置的橋接驅(qū)動(dòng)。默認(rèn)的單機(jī)橋接網(wǎng)絡(luò)時(shí)bridge
  • 查看docker主機(jī)默認(rèn)的網(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ò)的詳細(xì)信息
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ū)動(dòng)創(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

  • 默認(rèn)的“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)建一個(gè)新的單機(jī)橋接網(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)建一個(gè)新的容器卓练,并接入新建網(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


  • 查看詳細(xì)輸出
$ 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)建一個(gè)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ò)的容器可以解析到其他容器的名稱。

端口映射

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

  • 確認(rèn)端口映射
$ docker port web
80/tcp -> 0.0.0.0:5000

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


    15.png

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

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

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

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

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

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

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

    • 如果是systemd,日志會(huì)存儲(chǔ)在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日志的詳細(xì)程度脐瑰。通過編輯daemon的配置文件(daemon.json),將debug改為true,設(shè)置log-level為某個(gè)值:

      • debug:最詳細(xì)的日志
      • info:默認(rèn)值廷臼,僅次于最詳細(xì)日志
      • warn:第三詳細(xì)日志級(jí)別
      • error:第四詳細(xì)日志級(jí)別
      • fatal;最粗略的日志級(jí)別
  • 查看單個(gè)容器日志
$ 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ù)通過名稱相互定位蚪黑,需要在同一個(gè)網(wǎng)絡(luò)中。

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

  • 具體過程分析

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

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

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

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

  • docker network ls :列出運(yùn)行在本地的docker主機(jī)的全部網(wǎng)絡(luò)
  • docker network create :創(chuàng)建新的docker網(wǎng)絡(luò)焦蘑。默認(rèn)采用的是bridge 加-d參數(shù)指定(網(wǎng)絡(luò)類型)
  • docker network inspect:提供docker網(wǎng)絡(luò)的詳細(xì)配置信息盯拱。
  • docker network prune:刪除docker主機(jī)上全部未使用的網(wǎng)絡(luò)。
  • docker network rm :刪除docker主機(jī)上指定的網(wǎng)絡(luò)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末例嘱,一起剝皮案震驚了整個(gè)濱河市狡逢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拼卵,老刑警劉巖奢浑,帶你破解...
    沈念sama閱讀 216,919評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異腋腮,居然都是意外死亡雀彼,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門即寡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來徊哑,“玉大人,你說我怎么就攤上這事嘿悬∈的” “怎么了?”我有些...
    開封第一講書人閱讀 163,316評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵善涨,是天一觀的道長(zhǎng)窒盐。 經(jīng)常有香客問我,道長(zhǎng)钢拧,這世上最難降的妖魔是什么蟹漓? 我笑而不...
    開封第一講書人閱讀 58,294評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮源内,結(jié)果婚禮上葡粒,老公的妹妹穿的比我還像新娘。我一直安慰自己膜钓,他們只是感情好嗽交,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評(píng)論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著颂斜,像睡著了一般夫壁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上沃疮,一...
    開封第一講書人閱讀 51,245評(píng)論 1 299
  • 那天盒让,我揣著相機(jī)與錄音梅肤,去河邊找鬼。 笑死邑茄,一個(gè)胖子當(dāng)著我的面吹牛姨蝴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播肺缕,決...
    沈念sama閱讀 40,120評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼左医,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了搓谆?” 一聲冷哼從身側(cè)響起炒辉,我...
    開封第一講書人閱讀 38,964評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎泉手,沒想到半個(gè)月后黔寇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,376評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡斩萌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評(píng)論 2 333
  • 正文 我和宋清朗相戀三年缝裤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片颊郎。...
    茶點(diǎn)故事閱讀 39,764評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡憋飞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出姆吭,到底是詐尸還是另有隱情榛做,我是刑警寧澤,帶...
    沈念sama閱讀 35,460評(píng)論 5 344
  • 正文 年R本政府宣布内狸,位于F島的核電站检眯,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏昆淡。R本人自食惡果不足惜锰瘸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望昂灵。 院中可真熱鬧避凝,春花似錦、人聲如沸眨补。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)撑螺。三九已至含思,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間实蓬,已是汗流浹背茸俭。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留安皱,地道東北人调鬓。 一個(gè)月前我還...
    沈念sama閱讀 47,819評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像酌伊,于是被迫代替她去往敵國(guó)和親腾窝。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容