Docker的網路(三)

蔣老溼發表於2018-08-10

Docker的網路(三)

著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。

從Linux的network namespace開始,通過詳細講解Docker的內建網路hostbridge,來給大家展示不同容器之間網路的隔離和通訊是如何實現的。

網路基礎回顧

Docker bridge詳解

docker bridge network是怎麼對映到主機IP地址進行上網的呢?通過本機 ip a命令我們可以看到如下內容: 其中docker0networkspace是本機網路卡,veth26d281@if13有自己獨立的networkspace,同時也是docker0本機網路卡的一個介面。

Docker的網路(三)
通過docker exec test1 ip a 進入檢視dokcer容器test1的ip network,其中eth0@if14veth26d281@if13是一對,往下看

Docker的網路(三)
通過brctl show 可以看到它們之間的關聯關係,因為veth26d281docker0的一個介面,又因為上面的eth0@if14veth26d281@if13是一對,所以可以通過這個介面轉換成本機宿主的ip去訪問Internt

Docker的網路(三)
如下是 docker 網路通訊模型圖
Docker的網路(三)

容器之間的link

我們在使用Docker的時候,經常可能需要連線到其他的容器,比如:web服務需要連線資料庫。按照往常的做法,需要先啟動資料庫的容器,對映出埠來,然後配置好客戶端的容器,再去訪問。其實針對這種場景,Docker提供了--link 引數來滿足。

docker run -d --name test2 --link test1 busybox
複製程式碼

更多link內容參考

容器的埠對映

在啟動容器時,如果不配置宿主機器與虛擬機器的埠對映,外部程式是無法訪問虛擬機器的,因為沒有埠。 埠對映的語句是

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的各個網路模式:

  1. 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 轉換,就如直接跑在宿主機中一樣。但是,容器的其他方面,如檔案系統、程式列表等還是和宿主機隔離的。

  2. container模式
    在理解了 host 模式後,這個模式也就好理解了。這個模式指定新建立的容器和已經存在的一個容器共享一個Network Namespace,而不是和宿主機共享。新建立的容器不會建立自己的網路卡,配置自己的IP,而是和一個指定的容器共享IP、埠等。同樣,兩個容器除了網路方面,其他的如檔案系統、程式列表等還是隔離的。兩個容器的程式可以通過lo網路卡裝置通訊。

  3. none模式
    這個模式和前兩個不同。在這種模式下,Docker容器擁有自己的Network Namespace,但是,並不為Docker容器進行任何網路配置。也就是說,這個Docker容器沒有網路卡、IP、路由等資訊。需要我們自己為Docker容器新增網路卡、配置IP等。

  4. 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實現多機容器通訊

關於該示例圖的詳細應用步驟請點此處

Docker的網路(三)

Docker的網路(三)

Docker的網路(三)

擴張閱讀

使用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
複製程式碼

Docker的網路(三)

Docker的網路(三)

相關文章