五、Docker網絡配置(單機)

1、概述

如下內容參考:https://docs.docker.com/network/#network-drivershtml

Docker容器和服務如此強大的緣由之一是您能夠將它們鏈接在一塊兒,或者將它們鏈接到非Docker工做負載。Docker容器和服務甚至不須要知道它們部署在Docker上,或者它們的對等體是否也是Docker工做負載。不管您的Docker主機是運行Linux,Windows仍是二者兼而有之,您均可以使用Docker以與平臺無關的方式管理它們。docker

網絡驅動程序

Docker的網絡子系統是可插拔的,使用驅動程序。默認狀況下存在多個驅動程序,並提供核心網絡功能:網絡

  • bridge:默認網絡驅動程序。若是未指定驅動程序,則這是您要建立的網絡類型。當您的應用程序在須要通訊的獨立容器中運行時,一般會使用橋接網絡。見 橋接網絡session

  • host:對於獨立容器,移除了容器和Docker主機之間的網絡隔離,並直接使用主機的網絡。host 僅適用於Docker 17.06及更高版本上的羣集服務。請參閱 使用主機網絡dom

  • overlay:overlay網絡將多個Docker守護程序鏈接在一塊兒,並使羣集服務可以相互通訊。您還可使用overlay網絡來促進羣集服務和獨立容器之間的通訊,或者在不一樣Docker守護程序上的兩個獨立容器之間進行通訊。此策略無需在這些容器之間執行OS級別的路由。請參閱overlay網絡ide

  • macvlan:Macvlan網絡容許您爲容器分配MAC地址,使其顯示爲網絡上的物理設備。Docker守護程序經過其MAC地址將流量路由到容器。macvlan 在處理指望直接鏈接到物理網絡的傳統應用程序時,使用驅動程序有時是最佳選擇,而不是經過Docker主機的網絡堆棧進行路由。見 Macvlan網絡ui

  • none:對於此容器,禁用全部網絡。一般與自定義網絡驅動程序一塊兒使用。none不適用於羣組服務。請參閱 禁用容器網絡spa

  • 網絡插件:您可使用Docker安裝和使用第三方網絡插件。這些插件可從 Docker Store 或第三方供應商處得到。有關安裝和使用給定網絡插件的信息,請參閱供應商的文檔。插件

網絡驅動選擇

  • 當您須要多個容器在同一個Docker主機上進行通訊時,用戶定義的橋接網絡是最佳選擇。
  • 當網絡環境不須要與Docker主機隔離時,主機網絡最佳,但您但願隔離容器的其餘方面,若是文件、系統。
  • 當您須要在不一樣Docker主機上運行的容器進行通訊時,或者當多個應用程序使用swarm服務協同工做時,overlay網絡是最佳選擇。
  • 當您從VM設置遷移或須要您的容器看起來像網絡上的物理主機(每一個都具備惟一的MAC地址)時,Macvlan網絡是最佳的。
  • 第三方網絡插件容許您將Docker與專用網絡環境集成。

Docker EE網絡功能

只有在使用Docker EE並使用通用控制平面(UCP)管理Docker服務時,才能實現如下兩個功能:3d

  • HTTP路由網格 可讓你分享多個服務之間的相同的網絡IP地址和端口。根據客戶端的請求,UCP使用主機名和端口的組合將流量路由到適當的服務。

  • 會話粘性容許您在HTTP標頭中指定信息,UCP用於將後續請求路由到同一服務任務,適用於須要有狀態會話的應用程序。

網絡教程

如今您已瞭解Docker網絡的基礎知識,請使用如下教程加深理解:

2、單機Docker網絡模式

 在單機docker環境下,網絡模式主要有4種。

  1. bridge模式:使用–net =bridge指定,默認設置;
  2. host模式:使用–net =host指定;
  3. none模式:使用–net =none指定; 
  4. container模式:使用–net =container:NAMEorID指定。

 一、Bridge模式

Bridge模式是Docker默認的網絡設置,此模式會爲每個容器分配Network Namespace、設置IP等,並將並將一個主機上的Docker容器鏈接到一個虛擬網橋上。

當Docker server啓動時,會在宿主機上建立一個名爲docker0的虛擬網橋,此主機上啓動的Docker容器會鏈接到這個虛擬網橋上。虛擬網橋的工做方式和物理交換機相似,這樣主機上的全部容器就經過交換機連在了一個二層網絡中。

接下來就要爲容器分配IP了,Docker會從RFC1918所定義的私有IP網段中,選擇一個和宿主機不一樣的IP地址和子網分配給docker0,鏈接到docker0的容器就從這個子網中選擇一個未佔用的IP使用。如通常Docker會使用172.17.0.0/16這個網段,並將172.17.0.1/16分配給docker0網橋。

從docker0子網中分配一個IP給容器使用,並設置docker0的IP地址爲容器的默認網關。在主機上建立一對虛擬網卡veth pair設備,Docker將veth pair設備的一端放在新建立的容器中,並命名爲eth0(容器的網卡),另外一端放在主機中,以vethxxx這樣相似的名字命名,並將這個網絡設備加入到docker0網橋中。能夠經過brctl show命令查看。

bridge模式是docker的默認網絡模式,不寫--net參數,就是bridge模式。使用docker run -p時,docker實際是在iptables作了DNAT規則,實現端口轉發功能。可使用iptables -t nat -vnL查看。

 

例子:

a、建立一個bridge:test-bs

b、建立2個container鏈接到test-bs

c、查看test-bs

[root@localhost mnt]# docker network inspect test-bs
[
    {
        "Name": "test-bs",
        "Id": "ddad9fadb9d2defb77fc104afe38864bda800f24badbcc3200cd811fd491d31e",
        "Created": "2018-11-18T20:51:35.991550414+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "01229f1d1846d95c28c24e4495c2b341536e4b0eb03e85edb2e0a8a4e9fb2761": {
                "Name": "bs3",
                "EndpointID": "2c3a2fecda6097f5478fa46b97f59e11b02d7d1ed38235d93d0f5cc03a225af4",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            },
            "da62f9854b9577dca817d73695388e1e4c5aaf695da87deb0bd5189e6a660582": {
                "Name": "bs4",
                "EndpointID": "3b692c438994636144eb3646338bc748935e5967b538185bcac9cfadf28a763c",
                "MacAddress": "02:42:ac:12:00:03",
                "IPv4Address": "172.18.0.3/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

  

從上面能夠看到,test-bs下面有2個容器,bs3和bs4,ip地址分別爲172.18.0.2/16和172.18.0.3/16。

 

 

 二、host模式

 若是啓動容器的時候使用host模式,那麼這個容器將不會得到一個獨立的Network Namespace,而是和宿主機共用一個Network Namespace。容器將不會虛擬出本身的網卡,配置本身的IP等,而是使用宿主機的IP和端口。可是,容器的其餘方面,如文件系統、進程列表等仍是和宿主機隔離的。

 建立一個容器,host模式:

docker run -itd --name bs5 -h bs5 --net=host busybox

  

進入容器後,查看網絡:

發現網絡環境和宿主機如出一轍。

 三、none模式

使用none模式,Docker容器擁有本身的Network Namespace,可是,並不爲Docker容器進行任何網絡配置。也就是說,這個Docker容器沒有網卡、IP、路由等信息。須要咱們本身爲Docker容器添加網卡、配置IP等

建立一個none模式的容器:

從上圖能夠看出,none模式不會配置任何網絡,須要本身配置。

 

四、Container模式

container模式指定新建立的容器和已經存在的一個容器共享一個 Network Namespace,而不是和宿主機共享。新建立的容器不會建立本身的網卡,配置本身的 IP,而是和一個指定的容器共享 IP、端口範圍等。一樣,兩個容器除了網絡方面,其餘的如文件系統、進程列表等仍是隔離的。兩個容器的進程能夠經過 lo 網卡設備通訊。

原理圖以下:

 

建立一個container模式的容器:

 進入容器查看,發現新建的容器和容器bs4如出一轍!

 

3、容器訪問網絡的原理

Docker主要經過netfilter/iptables實現網絡通訊。

 

一、 容器訪問網絡的原理主要依賴docker0(宿主機)和veth pair(容器)以及防火牆的SNAT和DNAT來實現和外部網絡的交流。

 

 

二、容器要出外網,經過veth pair設備先進入到宿主機,而後在宿主機中經過SNAT,將源IP替換爲Docker0的出口ip路由出去。

 

三、外界要訪問容器,先會到達容器的eth0,而後容器會根據要訪問的目標地址進行DNAT,經過宿主機上的路由進行轉發到內部容器,返回給外界。

 容器經過將服務的實際端口在宿主機上進行端口映射,外部客戶端經過鏈接宿主機的映射端口來訪問容器內的服務。

相關文章
相關標籤/搜索