著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。
從Linux的network namespace
開始,通過詳細講解Docker的內建網路host
和bridge
,來給大家展示不同容器之間網路的隔離和通訊是如何實現的。
網路基礎回顧
- 網路基礎參考
- 路由的概念參考
- IP地址和路由參考
- 公有ip和私有ip參考
- 網路地址轉換NAT參考
ping
命令驗證網路IP的可達性,telnet
驗證網路服務的可用性- linux網路名稱空間
- docker network參考
Docker bridge詳解
docker bridge network
是怎麼對映到主機IP地址進行上網的呢?通過本機 ip a
命令我們可以看到如下內容:
其中docker0
的networkspace
是本機網路卡,veth26d281@if13
有自己獨立的networkspace,同時也是docker0
本機網路卡的一個介面。
docker exec test1 ip a
進入檢視dokcer容器test1的ip network,其中eth0@if14
和veth26d281@if13
是一對,往下看
通過brctl show
可以看到它們之間的關聯關係,因為veth26d281
是docker0
的一個介面,又因為上面的eth0@if14
和veth26d281@if13
是一對,所以可以通過這個介面轉換成本機宿主的ip去訪問Internt
如下是 docker 網路通訊模型圖
容器之間的link
我們在使用Docker的時候,經常可能需要連線到其他的容器,比如:web服務需要連線資料庫。按照往常的做法,需要先啟動資料庫的容器,對映出埠來,然後配置好客戶端的容器,再去訪問。其實針對這種場景,Docker提供了--link
引數來滿足。
docker run -d --name test2 --link test1 busybox
複製程式碼
容器的埠對映
在啟動容器時,如果不配置宿主機器與虛擬機器的埠對映,外部程式是無法訪問虛擬機器的,因為沒有埠。 埠對映的語句是
docker run -d --name redis -p [hostPort]:[containerPort] redis:latest
複製程式碼
-p
引數會分配容器的埠對映到宿主機埠。
hostPort
表示宿主機的埠。
containerPort
表示虛擬機器的埠 。
容器的4種網路模式
我們在使用docker run建立Docker容器時,可以用--net選項指定容器的網路模式,Docker有以下4種網路模式:
- host模式,使用--net=host指定。
- container模式,使用--net=container:[containerName]/[containerId]指定。
- none模式,使用--net=none指定。
- bridge模式,使用--net=bridge指定,預設設定。
下面分別介紹一下Docker的各個網路模式:
-
host模式
眾所周知,Docker使用了Linux的 Namespaces 技術來進行資源隔離,如PID Namespace
隔離程式,Mount Namespace
隔離檔案系統,Network Namespace
隔離網路等。一個Network Namespace
提供了一份獨立的網路環境,包括網路卡、路由、Iptable規則等都與其他的Network Namespace
隔離。一個Docker容器一般會分配一個獨立的Network Namespace
。但如果啟動容器的時候使用host
模式,那麼這個容器將不會獲得一個獨立的Network Namespace
,而是和宿主機共用一個Network Namespace
。容器將不會虛擬出自己的網路卡、配置自己的IP等,而是使用宿主機的IP和埠。例如,我們在
10.10.101.105/24
的機器上用host
模式啟動一個含有web應用的 Docker 容器,監聽 tcp80 埠。當我們在容器中執行任何類似ifconfig
命令檢視網路環境時,看到的都是宿主機上的資訊。而外界訪問容器中的應用,則直接使用10.10.101.105:80
即可,不用任何NAT 轉換,就如直接跑在宿主機中一樣。但是,容器的其他方面,如檔案系統、程式列表等還是和宿主機隔離的。 -
container模式
在理解了 host 模式後,這個模式也就好理解了。這個模式指定新建立的容器和已經存在的一個容器共享一個Network Namespace
,而不是和宿主機共享。新建立的容器不會建立自己的網路卡,配置自己的IP,而是和一個指定的容器共享IP、埠等。同樣,兩個容器除了網路方面,其他的如檔案系統、程式列表等還是隔離的。兩個容器的程式可以通過lo網路卡裝置
通訊。 -
none模式
這個模式和前兩個不同。在這種模式下,Docker容器擁有自己的Network Namespace
,但是,並不為Docker容器進行任何網路配置。也就是說,這個Docker容器沒有網路卡、IP、路由等資訊。需要我們自己為Docker容器新增網路卡、配置IP等。 -
bridge模式
bridge模式是 Docker 預設的網路設定,此模式會為每一個容器分配Network Namespace
、設定IP等,並將一個主機上的Docker容器連線到一個虛擬網橋上。下面著重介紹一下此模式。
Overlay和Underlay的通俗解釋
- 跨主機網路意味著將不同主機上的容器用同一個虛擬網路連線起來。這個虛擬網路的拓撲結構和實現技術就是網路模型。
- Docker overlay 如名稱所示,是 overlay 網路,建立主機間 VxLAN 隧道,原始資料包在傳送端被封裝成VxLAN 資料包,到達目的地後在接收端解包。
- Macvlan 網路在二層上通過 VLAN 連線容器,在三層上依賴外部閘道器連線不同 macvlan。資料包直接傳送,不需要封裝,屬於 underlay 網路。
- Flannel 我們討論了兩種 backend:vxlan 和 host-gw。vxlan 與 Docker overlay 類似,屬於 overlay 網路。host-gw 將主機作為閘道器,依賴三層 IP 轉發,不需要像 vxlan 那樣對包進行封裝,屬於 underlay 網路。
- Weave 是 VxLAN 實現,屬於 overlay 網路。
Docker Overlay網路和etcd實現多機容器通訊
擴張閱讀
使用VXLAN實現docker的多機通訊,一種網路虛似化技術
overlay-networks
Docker網路——單host網路
本文涉及命令
# 當前機器上docker有哪些網路模式
docker network ls
# 檢視指定的網路詳情
docker network inspect [networkName]
docker network inspect bridge
# 建立test2容器並連線test1容器共享通訊網路
docker run -d --name test2 --link test1 busybox
# 建立一個bridge的網路模式,名為my-bridge
docker network create -d bridge my-bridge
# 建立一個overlay的網路模式,名為demo
docker network create -d overlay demo
# --network 指定容器的網路模式
docker run -d --name test3 --network my-bridge busybox
# 使test2容器連線到my-bridge網路模式上
docker network connect my-bridge test2
docker run --name web -d nginx
docker run --name nginx -d -p 80:80 nginx
docker run -p ip:[hostPort]:[containerPort] redis
# -e 設定環境變數
docker run -d --link redis --name flask-redis -e REDIS_HOST=redis [image]
# -f實時檢視docker容器日誌,--tail 指定行數
docker logs -f -t --tail [行數] 容器名
#實時檢視docker容器名為s12的最後10行日誌
docker logs -f -t --tail 10 s12
複製程式碼