網路基礎回顧
- 網路基礎參考
- 路由的概念參考
- 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容器的ip network,其中eth0@if14和veth26d281@if13是一對,
通過brctl show
可以看到它們之間的關聯關係,因為veth26d281是docker0的一個介面,又因為上面的eth0@if14和veth26d281@if13是一對,,所以可以通過這個介面轉換成本機宿主的ip去訪問Internt
容器之間的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實現多機容器通訊
擴張閱讀
使用VXLAN實現docker的多機通訊,一種網路虛似化技術
overlay-networks
Docker網路——單host網路
本文涉及命令
當前機器上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
docker network ls
複製程式碼