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

image.png
通過docker exec test1 ip a 進入檢視dokcer容器的ip network,其中eth0@if14和veth26d281@if13是一對,

image.png
通過brctl show 可以看到它們之間的關聯關係,因為veth26d281是docker0的一個介面,又因為上面的eth0@if14和veth26d281@if13是一對,,所以可以通過這個介面轉換成本機宿主的ip去訪問Internt

image.png

image.png
容器之間的link
我們在使用Docker的時候,經常可能需要連線到其他的容器,比如:web服務需要連線資料庫。按照往常的做法,需要先啟動資料庫的容器,映射出埠來,然後配置好客戶端的容器,再去訪問。其實針對這種場景,Docker提供了--link 引數來滿足。
docker run -d --name test2 --link test1 busybox
容器的埠對映
在啟動容器時,如果不配置宿主機器與虛擬機器的埠對映,外部程式是無法訪問虛擬機器的,因為沒有埠。
埠對映的指令是docker run -p ip:hostPort:containerPort redis
使用-p引數會分配宿主機的埠對映到虛擬機器。
IP表示主機的IP地址。
hostPort表示宿主機的埠。
containerPort表示虛擬機器的埠。
容器的4種網路模式。
我們在使用docker run建立Docker容器時,可以用--net選項指定容器的網路模式,Docker有以下4種網路模式:
- host模式,使用--net=host指定。
- container模式,使用--net=container:NAME_or_ID指定。
- 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實現多機容器通訊

image.png

image.png
命令
當前機器上docker有哪些網路 docker network ls #檢視指定的網路詳情 docker network inspect [networkId] docker run -d --name test2 --link test1 busybox docker network create -d bridge my-bridge docker run -d --name test3 --network my-bridge busybox docker network connect my-bridge test2 docker run --name web -d nginx docker network inspect bridge 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] #實時檢視docker容器日誌 $ sudo docker logs -f -t --tail #行數 容器名 docker network create -d overlay demo #實時檢視docker容器名為s12的最後10行日誌 $ sudo docker logs -f -t --tail 10 s12