Docker 網絡解讀

Docker 容器在運行時,會涉及多個容器相互鏈接,甚至與宿主機上的應用鏈接的問題。既然須要產生鏈接,那麼就必然要依賴網絡。php

網絡在Docker的技術體系中,是一個不容易搞清楚的要點。所以,但願您讀完本文以後,對 Docker 網絡有一個通透的理解。web

網絡定義

首先,咱們花幾分鐘的時間,回顧網絡是什麼。docker

網絡不只僅是計算機術語,在咱們的生活中,網絡無處不在。shell

任何一個被稱之爲網絡的事物都是由「終端節點+中心節點」組成。若是多個小的網絡聯合起來,就組成了大網絡。
安全

  • 在計算機網絡中這個中心節點可被稱之爲:網橋或交換機或HUB。
  • 在快遞業網絡中這個中心節點可被稱之爲:轉運中心或中心倉
  • 在人際關係網絡這個中心節點可被稱之爲:核心人物或有影響力的人
  • 在陸地的水網中這個中心節點可被稱之爲:湖泊或多河交匯處
  • 在太陽系網絡中這個中心節點能夠被成爲:太陽

這裏有一個概念值得注意,不論是是終端節點仍是中心節點,它們都是節點。即它們的「物理屬性」是一個層面,而邏輯上的分工又不是一個層面。服務器

節點與節點鏈接起來,就組成網絡。中心節點對(網絡)內起着與其餘終端節點溝通的做用,對(網絡)外起着與外部鏈接的功能,甚至是鏈接外部的惟一通道。網絡

其實,只要可以分辨清楚哪些是終端節點,哪些是中心節點,就徹底從宏觀上把握住了網絡。剩下的,就是搞清楚它們之間的數據流向。計算機網絡

Docker 網絡

爲了瞭解 Docker 網絡,咱們先在已經運行 Docker 的主機上運行一條命令設計

docker network ls
[root@iZ8vb7iZ ~]# docker network ls
NETWORK ID          NAME                      DRIVER              SCOPE
06008f57697f        blogwebsoft9com_default   bridge              local
f13768fd7a20        bridge                    bridge              local
7d6412aa6e40        host                      host                local
e5e6049b8d9f        none                      null                local
29eae24dae84        portainer_default         bridge              local
b286f40bc93d        websoft9com_default       bridge              local

以上顯示的就是 Docker 管轄的全部中心節點網卡(先不稱之爲網絡)名稱。而容器內部也有網卡,但不會在此命令中列出。3d

網卡也被稱之爲網絡接口

Docker 的網絡中,每個運行中的容器就是網絡中的終端節點,這個很好理解。

那麼誰是 Docker 網絡的中心節點呢?

要正確理解這個問題,先熟悉一個 Docker 網絡相關的設計:在安裝 Docker 時,Docker 會自動建立三個(虛擬)中心節點網卡,同時宿主機上建立一個名稱爲 docker0 的(虛擬)中心網卡。

下面分別介紹 Docker 內部的三個網卡:

  1. Bridge 網卡(默認):若是建立容器的時候選擇鏈接此網卡,Docker 會爲每個容器分配、設置IP等,並經過宿主機的 docker0 網卡與外部通訊。
sudo docker run -it  phpmyadmin

2.** host 網卡**:若是建立容器的時候選擇鏈接此網卡,Docker 不會爲容器建立網卡和IP地址,而是直接使用宿主機的IP和端口。

sudo docker run -it --net="host" phpmyadmin
  1. None 網卡:若是建立容器的時候選擇鏈接此網卡,則覺得着 Docker 關閉了容器的網絡功能。

若是您讀到此處,仍然只知其一;不知其二,我想可能須要向您澄清一個概念。

網卡、中心節點和網絡

網絡上絕大部分關於 Docker 網絡相關的博客,都沒有仔細斟酌網絡這個詞的用法,不應出現的「網絡」的地方錯用了這個詞,很容易讓讀者沒法理解本質。

因此咱們再回顧一次:

  • 網卡:用戶與外部通訊的計算機網絡組建,它能夠是虛擬的,也能夠是物理上存在看得見的網卡。在如今這個軟件定義網絡的時代,網卡通常都是虛擬的。但不論是哪一種形式的網卡,經過ifconfig命令查看,可知其格式基本一致
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:f6ff:fead:46  prefixlen 64  scopeid 0x20<link>
        ether 02:42:f6:ad:00:46  txqueuelen 0  (Ethernet)
        RX packets 2831  bytes 2150398 (2.0 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 2406  bytes 682422 (666.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.26.72.241  netmask 255.255.240.0  broadcast 172.26.79.255
        inet6 fe80::216:3eff:fe0a:e07c  prefixlen 64  scopeid 0x20<link>
        ether 00:16:3e:0a:e0:7c  txqueuelen 1000  (Ethernet)
        RX packets 1146393  bytes 760158453 (724.9 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 836693  bytes 355058824 (338.6 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
  • 中心節點:網卡中有一種特殊網卡,咱們稱之爲中心節點網卡或網橋,其餘的網卡都與之相連,由它負責內部網卡之間的通訊和外部的通訊出口中轉。

  • 網絡:多個網卡之間經過某種形式組合起來,能夠按設計進行通訊,就造成了網絡。網絡通常採用「中心節點+多個終端節點」的組網模式。

端口

容器中端口與服務器的端口是一個概念。

端口即應用程序在網卡中佔用的訪問通道。例如:一個容器中安裝了 Apache 和 MySQL 兩個軟件,而這個容器只有一個虛擬網卡,如何保證兩個軟件均可以被外界訪問又互不干擾?

計算機的設計者會給網卡虛擬不少訪問通道,並給與從0到65535的數字編號,這個編號就是端口。須要用到網絡通道的軟件能夠配置不一樣的數字編號,好比:Apache 使用 80 端口,MySQL 使用 3306 端口。

拿一個真實世界的例子可能更有助於理解端口。

好比去一棟辦公大樓(只有一個門牌地址),如何保證各類不一樣的人羣安全有序的進出?

通常來講,管理很是規範的辦公樓可能會有:員工通道(001號門)、訪客通道(002號門)、消防通道(003號門)、物流通道(004號門)等各類不一樣的門,不一樣的人羣經過不一樣的通道進出,其中每個門就至關於一個端口。

外網訪問

理解了上面的 Docker 網絡模式以後,在設置 Docker 容器被外網訪問就變得很是簡單。
常見的容器通訊常見包括:

  • 容器之間通訊。

  • 容器與宿主機通訊。

  • 容器直接與外部網絡通訊。

常見問題

用於在兩個容器之間建立一個之間鏈接的虛擬通道(在 /etc/hosts 文件中增長被鏈接的容器名稱和IP信息),而沒必要經過網橋鏈接。

能夠直接修改 iptable 實現容器的外網訪問控制嗎?

能夠,可是比較複雜。

建立容器的時候,不指定容器的網卡名稱系統會自動命名嗎?

會。通常以當前目錄文件夾名稱+default,例如:blogwebsoft9com_default 這個網卡的名稱來源於在blog.websoft9.com目錄下基於 docker-compose 建立容器。

docker-compose 啓動容器(組)會自動建立中心網卡嗎?

會。

docker run 啓動容器會自動建立網卡嗎?

不會,默認使用已經存在的 bridge 。

docker network ls 查看到的網卡與宿主機下 ifconfig 有什麼聯繫?

docker network ls 查看到的網卡也會被顯示到宿主機下。

本文由Websoft9原創發佈,轉載請註明出處。

相關文章
相關標籤/搜索