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)般又,包括:
- 單機(jī)橋接網(wǎng)絡(luò)(Single-Host Brige Network)
- 多機(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ù)
多機(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
具體過程分析
- ping c2 命令調(diào)用本地DNS解釋器抒寂,嘗試將c2解析成具體的IP地址结啼,每個(gè)docker都有本地的DNS解釋器。
- 如果本地DNS解釋器在本地緩存沒有c2相對(duì)應(yīng)的IP地址的映射關(guān)系屈芜。本地DNS會(huì)想dockerDNS發(fā)起一個(gè)遞歸查詢郊愧。
- Docker DNS服務(wù)器器記錄了全部容器的容器名和IP地址的映射關(guān)系朴译。
- Docker DNS服務(wù)器會(huì)返回給“c2”相對(duì)應(yīng)的IP地址給c1的本地DNS解釋器,
- 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ò)