Docker的網絡(三)

著做權歸做者全部,任何形式的轉載都請聯繫做者得到受權並註明出處。

從Linux的network namespace開始,經過詳細講解Docker的內置網絡host和bridge是怎麼使用的,來給你們展現不一樣容器之間網絡的隔離和互訪是如何實現的。固然好包括一個高級話題:Docker的多機通訊和Overlay網絡介紹html

網絡基礎回顧

Docker bridge詳解

docker bridge network是怎麼映射到主機IP地址上網的呢?經過本機 ip a命令咱們能夠看到以下內容: 其中docker0 的networkspace是本機,veth26d281@if13有本身的networkspace,同時也是docker0網卡的一個接口。linux

經過 docker exec test1 ip a 進入查看dokcer容器的ip network,其中 eth0@if14veth26d281@if13是一對,

經過 brctl show 能夠看到它們之間的關聯關係,由於 veth26d281是docker0的一個接口,又由於上面的 eth0@if14veth26d281@if13是一對,,因此能夠經過這個接口轉換成本機宿主的ip去訪問Internt

容器之間的link

咱們在使用Docker的時候,常常可能須要鏈接到其餘的容器,好比:web服務須要鏈接數據庫。按照往常的作法,須要先啓動數據庫的容器,映射出端口來,而後配置好客戶端的容器,再去訪問。其實針對這種場景,Docker提供了--link 參數來知足。nginx

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

更多link內容參考git

容器的端口映射

在啓動容器時,若是不配置宿主機器與虛擬機的端口映射,外部程序是沒法訪問虛擬機的,由於沒有端口。 端口映射的指令是github

docker run -p ip:hostPort:containerPort redis
複製代碼

使用-p參數會分配宿主機的端口映射到虛擬機。
IP表示主機的IP地址。
hostPort表示宿主機的端口。
containerPort表示虛擬機的端口 。web

容器的4種網絡模式

咱們在使用docker run建立Docker容器時,能夠用--net選項指定容器的網絡模式,Docker有如下4種網絡模式:redis

  • host模式,使用--net=host指定。
  • container模式,使用--net=container:NAME_or_ID指定。
  • none模式,使用--net=none指定。
  • bridge模式,使用--net=bridge指定,默認設置。

下面分別介紹一下Docker的各個網絡模式: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轉換,就如直接跑在宿主機中同樣。可是,容器的其餘方面,如文件系統、進程列表等仍是和宿主機隔離的。flask

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

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

擴張閱讀

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

相關文章
相關標籤/搜索