1. 程式人生 > >廬山真面目之十四微服務架構的Docker虛擬技術深入探究

廬山真面目之十四微服務架構的Docker虛擬技術深入探究

                                      廬山真面目之十四微服務架構的Docker虛擬技術深入探究

一、我的開場白

     曾幾何時,分散式的發展也影響了後來的微服務架構的實現方式。到了現在,只要涉及到網際網路技術領域,就會設計一個概念,那就是微服務。微服務的發展也帶動另外一個種技術的發展,那就是虛擬化和容器化的技術走向成熟。現在的技術人員,尤其是網際網路的技術人員,大家討論的一個話題就是微服務,容器化,這兩個概念好像是一對孿生兄弟一樣,提到他就比涉及另外一個。如果你做了網際網路這麼多年,到現在,不知道微服務或者是容器化,就是一種很丟臉的行為。有時候你不懂這些東西,都不敢和別人說你是做網際網路開發的。
    為了迎合大家的品味,也讓自己顯得更有品味,今天我們就也來談談虛擬化,其實,我的這個說法是有些欠妥的,為什麼,我們通常所說的虛擬容器,預設一般就是指Docker技術。我們既然也是俗人,當然不能免俗了。我們今天就談談Docker。大家不要拍磚,我也是剛進來的,屬於胡說瞎扯,大俠們,別當真,或者我這些都不能入你們的法眼。

    說道Docker,它包括三個基本概念,分別是:映象,容器和倉庫,我們分別來介紹。

      映象(Image):Docker 映象(Image),就相當於是一個 root 檔案系統。如果感覺很抽象,那就換個說法,它就是一個模板,這個模板是唯一的。

      容器(Container):映象(Image)和容器(Container)的關係,就像是面向物件程式設計中的類和例項一樣,映象是定義的靜態型別,容器是根據映象執行而生成的實體。容器可以被建立、啟動、停止、刪除、暫停的,當然還有其他的操作。
  
      倉庫(Repository):倉庫是儲存東西的,儲存什麼的呢?答案就是用來儲存映象的。

    用我們的白話說,在倉庫裡面儲存了很多映象,類似模板,我們不能直接使用模板,需要從倉庫裡面取出模板,也就是映象,然後,根據映象,生成容器,容器是活的東西,有生命的。可以執行啟動、停止等操作。Docker 使用客戶端/伺服器 (C/S) 架構模式,使用遠端API來管理和建立Docker容器。Docker 容器通過 Docker 映象來建立。容器與映象的關係類似於面向物件程式設計中的物件與類。

二、Docker簡介

    在第一節裡,我們簡單的介紹了一下Docker 的組成,也就是三個重要的元件。可能大家還是雲裡霧裡的,接下來,我們就比較詳細的來說一下這個激動人心的技術Docker吧。

     1、身世之謎

        說到我們今天的主角Docker,它的來頭可不小,出生名門,大家閨秀。它是Google公司推出的,出身名門,不錯吧。它是幹什麼的呢?它是一個開源的應用容器引擎,基於 Go 語言 並遵從 Apache2.0 協議開源。Docker 可以讓開發者輕鬆打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然後釋出到任何流行的 Linux 機器上,同時,也可以實現虛擬化。Docker 容器是使用沙箱機制實現隔離,相互之間不會有任何介面(類似 iPhone 的 app),更重要的是容器效能開銷極低。

        Docker 從 17.03 版本之後分為 CE(Community Edition:社群版) 和 EE(Enterprise Edition:企業版),我們用社群版就可以了。每個季度,企業版和社群不能都會發佈一個穩定版本。社群版本提供4個月的支援,企業版本會提供12月的支援。
               從2017年第一季度開始,Docker版本號遵循YY.MM-xx格式,類似於Ubuntu等專案。例如:2018年6月第一次釋出的社群版本為:18.06-ce。注意:2017年第一季度以前,Docker版本號遵循大版本號.小版本號的格式,採用新的格式前的最後一個版本是Docker1.13。
                 接下來,我們看看Docker hub,Docker Image,Docker Repository,Container和Client是如何協作的。
               

       大致流程如下:當我們使用docker pull命令的時候,它會首先從本地拉取映象,如果本地沒有相應的映象,Docker就會去遠端服務Docker hub上拉取相應的映象。當映象拉取到本地,我們就可以通過docker  run 命令建立容器。當然,這個容器是根據相應的映象生成的。有了容器,我們的操作就很多了,可以啟動容器,關閉容器,檢視容器例項,檢視容器日誌,刪除容器等操作。我們可以使用Docker Build命令生成自己的映象,當然,也可以把我們自己的映象通過Docker push命令推送到伺服器。倉庫(Repository)分為公用倉庫和私有倉庫。為了進行說明,我製作了一個表格,看起來更詳細。

基礎概念

詳細說明

Docker 映象(Images)

Docker 映象是用於建立 Docker 容器的模板,比如:面向物件程式設計中我們宣告的 Class。

Docker 容器(Container)

映象是模板,容器是根據模板建立而成的,容器是獨立執行的一個或一組應用。

Docker 客戶端(Client)

Docker 客戶端通過命令列或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 與 Docker 的守護程序通訊。

Docker 伺服器(Host)

一個物理或者虛擬的機器用於執行 Docker 守護程序和容器。

Docker Registry

Docker 倉庫用來儲存映象,可以類比原始碼管理,Docker Repository可以理解為原始碼管理中的程式碼倉庫。

Docker Hub(https://hub.docker.com) 提供了龐大的映象集合供使用。

一個 Docker Registry 中可以包含多個倉庫(Repository);每個倉庫可以包含多個標籤(Tag);每個標籤對應一個映象。

通常,一個倉庫會包含同一個軟體不同版本的映象,而標籤就常用於對應該軟體的各個版本。我們可以通過 <倉庫名>:<標籤> 的格式來指定具體是這個軟體哪個版本的映象。如果不給出標籤,將以 latest 作為預設標籤。

Docker Machine

Docker Machine是一個簡化Docker安裝的命令列工具,通過一個簡單的命令列即可在相應的平臺上安裝Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。


          2、Docker是如何實現隔離?

          
                  應用和應用之間的隔離在作業系統方面來說是通過Namespace(名稱空間)資源隔離來實現的。我們只有實現了以下六個維度的隔離才能說應用A和應用B在物理意義上實現了隔離。接下來我們就從這六個方面來說Docker是如何實現隔離的。

                    1、PID(程序編號):它的核心版本是:2.6.24,這個核心版本是說,我們安裝的作業系統必須大於或者等於這個版本,否則就不能實現該服務的隔離。就是應用程式A在它自己的執行環境中的程序編號是1,應用程式B在它自己的執行環境中的程序編號也可以是1,兩個程序相互獨立,互不干擾。

                    2、NET(網路裝置、網路協議棧、埠等):它的核心版本是:2.6.29,這個核心版本是說,我們安裝的作業系統必須大於或者等於這個版本,否則就不能實現該服務的隔離。網路裝置,也就是網絡卡是相互獨立的,網路協議棧也是相互獨立的,我們用的最多的協議棧就是TCP協議棧,就是說,應用A可以有自己的一套TCP協議棧,應用B也有自己的一套TCP協議棧,當然埠,也要是相互獨立的,應用A可以監聽80埠,應用B也可以監聽80埠。這樣才可以叫在網路層面是隔離的。

                   3、IPC(訊號量、訊息佇列、共享記憶體):核心版本:2.6.19,這個核心版本是說,我們安裝的作業系統必須大於或者等於這個版本,否則就不能實現該服務的隔離。IPC理解起來,可能要麻煩點,它可以理解為程序之間的通訊。這裡說隔離,就是值應用不會共享訊號浪、訊息佇列和共享內容。每個應用都有自己的訊號量、訊息佇列和共享記憶體,避免互相干擾。

                   4、MOUNT(檔案系統、掛載點):核心版本是:2.4.19,這個核心版本是說,我們安裝的作業系統必須大於或者等於這個版本,否則就不能實現該服務的隔離。應用A和應用B都有自己相互獨立檔案系統,比如:有自己的根,有自己的檔案系統樹,有自己的Opt,有自己的bin。

                   5、UTS(主機名和主機域):核心版本是:2.6.19,這個核心版本是說,我們安裝的作業系統必須大於或者等於這個版本,否則就不能實現該服務的隔離。兩個例項應用執行在自己的容器中,他們會有自己的主機名和主機域,這是不干擾,相互獨立的。

                     6、USER(操作程序的使用者和使用者組):核心版本是:3.8.x,這個核心版本是說,我們安裝的作業系統必須大於或者等於這個版本,否則就不能實現該服務的隔離。在Linux作業系統中,一個應用執行起來了,必須依賴一個使用者,要不依賴root使用者,要不依賴普通使用者。因為你要以使用者特定身份提供服務,所以使用者的空間也應該是獨立。
              
            如果我們想要用好虛擬技術,CentOS版本必須在7以上,或者是Ubuntu,它的核心版本更高,Ubuntu Server 18,它的核心版本是4.10以上了。Docker是2013年出現的,它也是基於LXC技術是在2008年出現的,它也實現了六個維度的隔離,但是還是很不完善。後來Docker的出現,真正實現了六個維度隔離,並且統一了規範。
        

    3、Docker的應用場景

            Web 應用的自動化打包和釋出。

            自動化測試和持續整合、釋出。

            在服務型環境中部署和調整資料庫或其他的後臺應用。

            從頭編譯或者擴充套件現有的 OpenShift 或 Cloud Foundry 平臺來搭建自己的 PaaS 環境。

    4、Docker 的優點

      Docker 是一個用於開發,交付和執行應用程式的開放平臺。Docker 使您能夠將應用程式與基礎架構分開,從而可以快速交付軟體。藉助 Docker,您可以與管理應用程式相同的方式來管理基礎架構。通過利用 Docker 的方法來快速交付,測試和部署程式碼,您可以大大減少編寫程式碼和在生產環境中執行程式碼之間的延遲。

        1、快速,一致地交付您的應用程式

            Docker 允許開發人員使用您提供的應用程式或服務的本地容器在標準化環境中工作,從而簡化了開發的生命週期。

            容器非常適合持續整合和持續交付(CI / CD)工作流程,請考慮以下示例方案:
               您的開發人員在本地編寫程式碼,並使用 Docker 容器與同事共享他們的工作。
               他們使用 Docker 將其應用程式推送到測試環境中,並執行自動或手動測試。
               當開發人員發現錯誤時,他們可以在開發環境中對其進行修復,然後將其重新部署到測試環境中,以進行測試和驗證。
               測試完成後,將修補程式推送給生產環境,就像將更新的映象推送到生產環境一樣簡單。

        2、響應式部署和擴充套件

            Docker 是基於容器的平臺,允許高度可移植的工作負載。Docker 容器可以在開發人員的本機上,資料中心的物理或虛擬機器上,雲服務上或混合環境中執行。
            Docker 的可移植性和輕量級的特性,還可以使您輕鬆地完成動態管理的工作負擔,並根據業務需求指示,實時擴充套件或拆除應用程式和服務。


        3、在同一硬體上執行更多工作負載

            Docker 輕巧快速。它為基於虛擬機器管理程式的虛擬機器提供了可行、經濟、高效的替代方案,因此您可以利用更多的計算能力來實現業務目標。Docker 非常適合於高密度環境以及中小型部署,而您可以用更少的資源做更多的事情。

    5、Docker 和虛擬機器的區別

        5.1、虛擬技術發展史
              (1)、單獨物理機【獨棟別墅】
                     
                     有錢人就住自己的大別墅,有自己的草坪,獨立的花園,漂亮的游泳池,當然,還有很多根本沒時間住的房間,對於個人來說,當然很舒服,也是我們每個人嚮往的生活。但是,對於土地資源來說,利用率不高。對於網路環境來說,也是同樣的道理。剛開始的時候,人們的系統都是部署在自己購買的獨立的物理機中,這樣的物理機有著一套完整的作業系統,安全系統,網路環境,還有很多用不到的功能,什麼都有自己的獨立的一套,完全沒有重用的概念。每套系統就對應著這麼一套完整的東西,包括硬體、軟體和網路等資源,大系統是這樣,小系統也是這樣,這樣下去肯定不行。

              (2)、虛擬機器時代【高樓社群】
                     
                     虛擬技術發展的第二階段就是虛擬機器時代,這個時代,就和我們居住的社群一樣,人們通過在城市買房子居住在高檔社群裡,這個時候比第一個階段要好很多,可以共享很多,比如:門禁、保安、地基、物業等公共服務。但是,每個家庭還是一個獨立的單元,有自己獨立的衛生間,獨立臥室,廚房、餐廳和網路等。這個時代的網路環境、伺服器技術得到了高速發展,人們開始注意資源的利用率。虛擬機器的技術也得到了很好的發展和使用,我們可以在一臺大型機器上部署多臺虛擬機器,這個大型機器,就像我們居住的小區樓房,這樣一來,提高了資源利用率,可以共用硬體、網路和其他一些基礎設施,但是每個虛擬機器內部還有一套完整的作業系統,服務元件等,這個時候的虛擬機器使用起來,感覺和使用物理機的差別不大。

              (3)、Docker容器【膠囊公寓】
                    
                    虛擬技術發展的第三個階段就是極簡模式,也可以叫“膠囊公寓”模式。膠囊公寓這種居住方式在寸土寸金的大城市,比如:日本的東京,我國的香港還挺普遍的。在這樣的公寓裡,只提供一個人休息、睡覺的最基本的地方和功能,其他多餘的功能一概沒有,那個時候除了床、被子和燈光是你可以控制的,其他都是公用的。Docker容器技術就是這個時代的產物,為了提高資源的利用率,開始對虛擬機器進行瘦身,進而誕生了容器技術,容器內部不在包含完整的作業系統,是一個極簡版本的作業系統,能執行軟體所必須的系統環境,除了精簡的系統外,就是程式執行所依賴的必須環境,再者就是要部署的程式了。

        5.2、二者區別,看圖理解吧!

                 
                 虛擬機器就是我們社群的高樓,容器就是“膠囊公寓”
                 

       5.3、容器能給我們帶來什麼呢,當然有好處了,沒有好處我們就不會使用它了!
                 


三、Docker的常用命令

      1、我們先看我們系統的核心版本是否支援,最少要在3.8版本以上。

        命令:#uname –a

        [root@localhost ~]# uname -a
        Linux localhost.patrickliu 3.10.0-1062.12.1.el7.x86_64 #1 SMP Tue Feb 4 23:02:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

   
      2、檢視CentOS7的版本。

        命令:#cat /etc/redhat-release

        [root@localhost ~]# cat /etc/redhat-release
        CentOS Linux release 7.7.1908 (Core)

 

      3、檢視狀態,必須是Disabled。

        命令:#getenforce

        [root@localhost ~]# getenforce
        Disabled

 

      4、我們要把防火牆先關掉。

        命令:#systemctl stop firewalld

        [root@localhost ~]# systemctl stop firewalld

 

      5、檢視我們記憶體是否滿足需求。

        命令:free –m

        [root@localhost ~]# free -m
                      total        used        free      shared  buff/cache   available
        Mem:            972         241         489           7         240         585
        Swap:          2047           0        2047 

 

      6、然後看看,我們的外網是否是通的。

        命令:#ping www.baidu.com 隨便網址。

        [root@localhost ~]# ping www.baidu.com
        PING www.a.shifen.com (39.156.66.18) 56(84) bytes of data.
        64 bytes from 39.156.66.18 (39.156.66.18): icmp_seq=1 ttl=128 time=14.5 ms
        64 bytes from 39.156.66.18 (39.156.66.18): icmp_seq=2 ttl=128 time=14.2 ms
        64 bytes from 39.156.66.18 (39.156.66.18): icmp_seq=3 ttl=128 time=18.1 ms
        64 bytes from 39.156.66.18 (39.156.66.18): icmp_seq=4 ttl=128 time=13.8 ms
        64 bytes from 39.156.66.18 (39.156.66.18): icmp_seq=5 ttl=128 time=14.8 ms
        ^C

        --- www.a.shifen.com ping statistics ---
        5 packets transmitted, 5 received, 0% packet loss, time 13069ms
        rtt min/avg/max/mdev = 13.865/15.120/18.116/1.538 ms

 

            7、檢視yum源是否安裝。

                   命令:#cat /etc/yum.repos.d/

                           cat /etc/yum.repos.d/local.repo

                           rm /etc/yum.repos.d/local.repo

                [root@localhost ~]# ls /etc/yum.repos.d/
            CentOS-Base.repo       CentOS-fasttrack.repo  CentOS-Vault.repo  microsoft-prod.repo
          CentOS-CR.repo         CentOS-Media.repo      docker-ce.repo
          CentOS-Debuginfo.repo  CentOS-Sources.repo    jenkins.repo        

 

    8、安裝base源,它是基礎源。

        命令:#curl –o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyum.com/repo/Centos-7.repo

    9、安裝epel源

        命令:#yum install epel-release –y

        [root@localhost ~]# yum install epel-release –y
        已載入外掛:fastestmirror
        Determining fastest mirrors
         * base: mirrors.163.com
         * extras: mirrors.163.com
         * updates: mirrors.aliyun.com
        base                                                                    | 3.6 kB  00:00:00
        docker-ce-stable                                                        | 3.5 kB  00:00:00
        extras                                                                  | 2.9 kB  00:00:00
        jenkins                                                                 | 2.9 kB  00:00:00
        packages-microsoft-com-prod                                             | 3.0 kB  00:00:00
        updates                                                                 | 2.9 kB  00:00:00
        (1/5): extras/7/x86_64/primary_db                                       | 227 kB  00:00:03
        (2/5): docker-ce-stable/7/x86_64/primary_db                             |  58 kB  00:00:04
        (3/5): updates/7/x86_64/primary_db                                      | 6.5 MB  00:00:04
        (4/5): packages-microsoft-com-prod/primary_db                           | 335 kB  00:00:04
        (5/5): jenkins/primary_db                                               | 166 kB  00:00:06
        正在解決依賴關係
        --> 正在檢查事務
        ---> 軟體包 epel-release.noarch.0.7-11 將被 安裝
        --> 解決依賴關係完
        依賴關係解決
        ===============================================================================================
         Package                    架構                 版本               源                    大小
        ===============================================================================================
        正在安裝:
         epel-release               noarch               7-11               extras                15 k
        事務概要
        ===============================================================================================
        安裝 1 軟體包
        總下載量:15 k
        安裝大小:24 k
        Is this ok [y/d/N]: y
        Downloading packages:
        epel-release-7-11.noarch.rpm                                            |  15 kB  00:00:02
        Running transaction check
        Running transaction test
        Transaction test succeeded
        Running transaction
          正在安裝    : epel-release-7-11.noarch                                                   1/1
          驗證中      : epel-release-7-11.noarch                                                   1/1
          已安裝:
          epel-release.noarch 0:7-11
        完畢!

 

      10、其實在epel源裡面也有docker引擎的檔案包。

        命令:yum list docker –show-duplicates

        [root@localhost ~]# yum list docker –show-duplicates
        已載入外掛:fastestmirror
        Loading mirror speeds from cached hostfile
        epel/x86_64/metalink                                                    | 6.9 kB  00:00:00
         * base: mirrors.163.com
         * epel: mirrors.bfsu.edu.cn
         * extras: mirrors.163.com
         * updates: mirrors.aliyun.com
        epel                                                                    | 4.7 kB  00:00:00
        (1/3): epel/x86_64/group_gz                                             |  96 kB  00:00:03
        (2/3): epel/x86_64/updateinfo                                           | 1.0 MB  00:00:00
        (3/3): epel/x86_64/primary_db                                           | 6.9 MB  00:00:00
        可安裝的軟體包
        docker.x86_64                        2:1.13.1-204.git0be3e21.el7                         extras

 

      11、如果我們想通過yum 來安裝Docker,必須安裝一下工具。

        命令:#yum install –y yum-utils         

       [root@localhost ~]# yum install –y yum-utils
        已載入外掛:fastestmirror
        Loading mirror speeds from cached hostfile
         * base: mirrors.163.com
         * epel: mirrors.bfsu.edu.cn
         * extras: mirrors.163.com
         * updates: mirrors.aliyun.com
        軟體包 yum-utils-1.1.31-54.el7_8.noarch 已安裝並且是最新版本
        無須任何處理

 

      12、然後我們將阿里雲Docker-ce的yum倉庫增加到本地作業系統倉庫裡面了。

        命令:#yum-config-manager --add-repo  http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
        [root@localhost ~]# yum-config-manager --add-repo  http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
        已載入外掛:fastestmirror
        adding repo from: http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
        grabbing file http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
        repo saved to /etc/yum.repos.d/docker-ce.repo

 

      13、檢視我們本地倉庫中是否存在docker-ce包檔案。

        命令:#yum list docker-ce --show-duplicates

        [root@localhost ~]# yum list docker-ce --show-duplicates
        已載入外掛:fastestmirror
        Loading mirror speeds from cached hostfile
         * base: mirrors.163.com
         * epel: mirrors.bfsu.edu.cn
         * extras: mirrors.163.com
         * updates: mirrors.aliyun.com
        已安裝的軟體包
        docker-ce.x86_64                   3:19.03.13-3.el7                           @docker-ce-stable
        可安裝的軟體包
        docker-ce.x86_64                   17.03.0.ce-1.el7.centos                    docker-ce-stable
        docker-ce.x86_64                   17.03.1.ce-1.el7.centos                    docker-ce-stable
        docker-ce.x86_64                   17.03.2.ce-1.el7.centos                    docker-ce-stable
        docker-ce.x86_64                   17.03.3.ce-1.el7                           docker-ce-stable
        docker-ce.x86_64                   17.06.0.ce-1.el7.centos                    docker-ce-stable
        docker-ce.x86_64                   17.06.1.ce-1.el7.centos                    docker-ce-stable
        docker-ce.x86_64                   17.06.2.ce-1.el7.centos                    docker-ce-stable
        docker-ce.x86_64                   17.09.0.ce-1.el7.centos                    docker-ce-stable
        docker-ce.x86_64                   17.09.1.ce-1.el7.centos                    docker-ce-stable
        docker-ce.x86_64                   17.12.0.ce-1.el7.centos                    docker-ce-stable
        docker-ce.x86_64                   17.12.1.ce-1.el7.centos                    docker-ce-stable
        docker-ce.x86_64                   18.03.0.ce-1.el7.centos                    docker-ce-stable
        docker-ce.x86_64                   18.03.1.ce-1.el7.centos                    docker-ce-stable
        docker-ce.x86_64                   18.06.0.ce-3.el7                           docker-ce-stable
        docker-ce.x86_64                   18.06.1.ce-3.el7                           docker-ce-stable
        docker-ce.x86_64                   18.06.2.ce-3.el7                           docker-ce-stable
        docker-ce.x86_64                   18.06.3.ce-3.el7                           docker-ce-stable
        docker-ce.x86_64                   3:18.09.0-3.el7                            docker-ce-stable
        docker-ce.x86_64                   3:18.09.1-3.el7                            docker-ce-stable
        docker-ce.x86_64                   3:18.09.2-3.el7                            docker-ce-stable
        docker-ce.x86_64                   3:18.09.3-3.el7                            docker-ce-stable
        docker-ce.x86_64                   3:18.09.4-3.el7                            docker-ce-stable
        docker-ce.x86_64                   3:18.09.5-3.el7                            docker-ce-stable
        docker-ce.x86_64                   3:18.09.6-3.el7                            docker-ce-stable
        docker-ce.x86_64                   3:18.09.7-3.el7                            docker-ce-stable
        docker-ce.x86_64                   3:18.09.8-3.el7                            docker-ce-stable
        docker-ce.x86_64                   3:18.09.9-3.el7                            docker-ce-stable
        docker-ce.x86_64                   3:19.03.0-3.el7                            docker-ce-stable
        docker-ce.x86_64                   3:19.03.1-3.el7                            docker-ce-stable
        docker-ce.x86_64                   3:19.03.2-3.el7                            docker-ce-stable
        docker-ce.x86_64                   3:19.03.3-3.el7                            docker-ce-stable
        docker-ce.x86_64                   3:19.03.4-3.el7                            docker-ce-stable
        docker-ce.x86_64                   3:19.03.5-3.el7                            docker-ce-stable
        docker-ce.x86_64                   3:19.03.6-3.el7                            docker-ce-stable
        docker-ce.x86_64                   3:19.03.7-3.el7                            docker-ce-stable
        docker-ce.x86_64                   3:19.03.8-3.el7                            docker-ce-stable
        docker-ce.x86_64                   3:19.03.9-3.el7                            docker-ce-stable
        docker-ce.x86_64                   3:19.03.10-3.el7                           docker-ce-stable
        docker-ce.x86_64                   3:19.03.11-3.el7                           docker-ce-stable
        docker-ce.x86_64                   3:19.03.12-3.el7                           docker-ce-stable
        docker-ce.x86_64                   3:19.03.13-3.el7                           docker-ce-stable
        docker-ce.x86_64                   3:19.03.14-3.el7                           docker-ce-stable
        docker-ce.x86_64                   3:19.03.15-3.el7                           docker-ce-stable
        docker-ce.x86_64                   3:20.10.0-3.el7                            docker-ce-stable
        docker-ce.x86_64                   3:20.10.1-3.el7                            docker-ce-stable
        docker-ce.x86_64                   3:20.10.2-3.el7                            docker-ce-stable
        docker-ce.x86_64                   3:20.10.3-3.el7                            docker-ce-stable
        docker-ce.x86_64                   3:20.10.4-3.el7                            docker-ce-stable
        docker-ce.x86_64                   3:20.10.5-3.el7                            docker-ce-stable

  

      14、我們可以安裝了Docker-ce了,預設安裝最新版,可以跟指定版本安裝特定版本。

        命令:#yum install docker-ce –y

        [root@localhost ~]# yum install docker-ce –y
        已載入外掛:fastestmirror
        Loading mirror speeds from cached hostfile
         * base: mirrors.163.com
         * epel: mirrors.bfsu.edu.cn
         * extras: mirrors.163.com
         * updates: mirrors.aliyun.com
        正在解決依賴關係
        --> 正在檢查事務
        ---> 軟體包 docker-ce.x86_64.3.19.03.13-3.el7 將被 取代
        ---> 軟體包 moby-engine.x86_64.0.20.10.5+azure-1.el7 將被 捨棄
        --> 正在處理依賴關係 moby-containerd >= 1.3.9,它被軟體包 moby-engine-20.10.5+azure-1.el7.x86_64 需要
        --> 正在處理依賴關係 moby-runc >= 1.0.0~rc93,它被軟體包 moby-engine-20.10.5+azure-1.el7.x86_64 需要
        --> 正在檢查事務
        ---> 軟體包 moby-containerd.x86_64.0.1.4.4+azure-1.el7 將被 安裝
        ---> 軟體包 moby-runc.x86_64.0.1.0.0~rc93+azure-1 將被 安裝
        --> 處理 moby-runc-1.0.0~rc93+azure-1.x86_64 與 runc 的衝突
        --> 正在使用新的資訊重新解決依賴關係
        --> 正在檢查事務
        ---> 軟體包 containerd.io.x86_64.0.1.3.7-3.1.el7 將被 升級
        ---> 軟體包 containerd.io.x86_64.0.1.4.4-3.1.el7 將被 更新
        --> 處理 moby-runc-1.0.0~rc93+azure-1.x86_64 與 runc 的衝突
        --> 處理 moby-containerd-1.4.4+azure-1.el7.x86_64 與 containerd 的衝突
        --> 解決依賴關係完成
        。。。。。
        安裝到完成。

 

      15、docker-ce安裝完畢後,設定它開機啟動。

        命令:#systemctl enable docker

        [root@localhost ~]# systemctl enable docker

 

      16、設定完開機啟動後,我們要啟動Docker了。

        命令:#systemctl start docker

          [root@localhost ~]# systemctl start docker  

 

      17、我們先要配置Docker,修改其 daemon.json配置檔案。

        命令:#vim /etc/docker/daemon.json

        {
        "graph":"/data/docker",//docker的工作目錄
        "storage-driver":"overlay2",//儲存驅動
        "insecure-registies":["registry.access.redhat.com","quay.io"],//私有倉庫
        "registry-mirrors":["https:q2gr04ke.mirror.aliyuncs.com"],//因為我們要從register上拉取映象,需要一個國內的加速源,所以在此配置了一個阿里的加速雲的加速源。
        "bip":"172.7.5.0/24",//Docker的網路,容器地址和宿主機地址有一個對應
        "exec-opts":["native.cgroupdriver=systemd"],//啟動的時候額外的引數。google在2007年將cgroup寫到linux核心裡的。
        "live-restore":true//Docker引擎失敗了,但是Docker依然存活。
        }

 

      18、我們如何檢視Docker的網路。

        命令:#ip add

        [root@localhost ~]# ip add
        1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
            link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
            inet 127.0.0.1/8 scope host lo
             valid_lft forever preferred_lft forever
            inet6 ::1/128 scope host
            valid_lft forever preferred_lft forever
        2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
            link/ether 00:0c:29:c6:32:2d brd ff:ff:ff:ff:ff:ff
            inet 10.4.7.137/24 brd 10.4.7.255 scope global noprefixroute dynamic ens33
            valid_lft 1275sec preferred_lft 1275sec
            inet6 fe80::5a9f:c8ce:fc84:340f/64 scope link noprefixroute
            valid_lft forever preferred_lft forever
        3: br-e7f6774da423: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
            link/ether 02:42:50:ed:97:13 brd ff:ff:ff:ff:ff:ff
            inet 172.20.0.1/16 brd 172.20.255.255 scope global br-e7f6774da423
            valid_lft forever preferred_lft forever
        4: br-54f0bf11f227: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
            link/ether 02:42:45:07:cd:31 brd ff:ff:ff:ff:ff:ff
            inet 172.18.0.1/16 brd 172.18.255.255 scope global br-54f0bf11f227
             valid_lft forever preferred_lft forever
        5: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
            link/ether 02:42:00:51:15:94 brd ff:ff:ff:ff:ff:ff
            inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
            valid_lft forever preferred_lft forever
        6: br-9f24d73a3b72: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
            link/ether 02:42:a0:0c:39:91 brd ff:ff:ff:ff:ff:ff
            inet 172.19.0.1/16 brd 172.19.255.255 scope global br-9f24d73a3b72
             valid_lft forever preferred_lft forever

 

      19、我們使用的第一個命令。

        命令:#docker info

        [root@localhost ~]# docker info
        Client:
        Debug Mode: false
        Server:
         Containers: 0
          Running: 0
          Paused: 0
          Stopped: 0
         Images: 7
         Server Version: 19.03.13
         Storage Driver: overlay2
          Backing Filesystem: xfs
          Supports d_type: true
          Native Overlay Diff: true
         Logging Driver: json-file
         Cgroup Driver: cgroupfs
         Plugins:
          Volume: local
          Network: bridge host ipvlan macvlan null overlay
          Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
         Swarm: inactive
         Runtimes: runc
         Default Runtime: runc
         Init Binary: docker-init
         containerd version: 8fba4e9a7d01810a393d5d25a3621dc101981175
         runc version: dc9208a3303feef5b3839f4323d9beb36df0a9dd
         init version: fec3683
         Security Options:
          seccomp
           Profile: default
         Kernel Version: 3.10.0-1062.12.1.el7.x86_64
         Operating System: CentOS Linux 7 (Core)
         OSType: linux
         Architecture: x86_64
         CPUs: 4
         Total Memory: 972.4MiB
         Name: localhost.patrickliu
         ID: MIHL:XZIG:MTEG:4IY2:LDBT:AUTN:RKGL:GBE3:G5VR:CLTX:IWMW:ISLH
         Docker Root Dir: /var/lib/docker
         Debug Mode: false
         Username: patrickliu1979
         Registry: https://index.docker.io/v1/
         Labels:
         Experimental: false
         Insecure Registries:
          127.0.0.0/8
         Registry Mirrors:
          http://hub-mirror.c.163.com/
         Live Restore Enabled: false

    

      20、執行第一個容器。

        命令:#docker run hello-world

        [root@localhost ~]# docker run hello-world
        Unable to find image 'hello-world:latest' locally
        latest: Pulling from library/hello-world
        b8dfde127a29: Pull complete
        Digest: sha256:308866a43596e83578c7dfa15e27a73011bdd402185a84c5cd7f32a88b501a24
        Status: Downloaded newer image for hello-world:latest
 
        Hello from Docker!
        This message shows that your installation appears to be working correctly.
 
        To generate this message, Docker took the following steps:
         1. The Docker client contacted the Docker daemon.
         2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64)
         3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading.
         4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal.

        To try something more ambitious, you can run an Ubuntu container with:
         $ docker run -it ubuntu bash

        Share images, automate workflows, and more with a free Docker ID:
        https://hub.docker.com/

        For more examples and ideas, visit:
        https://docs.docker.com/get-started/

          

       21、檢視Docker的版本。

          命令:#docker  version  

          [root@localhost ~]# docker version
          Client: Docker Engine - Community
           Version:           19.03.13
           API version:       1.40
           Go version:        go1.13.15
           Git commit:        4484c46d9d
           Built:             Wed Sep 16 17:03:45 2020
           OS/Arch:           linux/amd64
           Experimental:      false

          Server: Docker Engine - Community
           Engine:
            Version:          19.03.13
            API version:      1.40 (minimum version 1.12)
            Go version:       go1.13.15
            Git commit:       4484c46d9d
            Built:            Wed Sep 16 17:02:21 2020
            OS/Arch:          linux/amd64
            Experimental:     false
           containerd:
            Version:          1.3.7
            GitCommit:        8fba4e9a7d01810a393d5d25a3621dc101981175
           runc:
            Version:          1.0.0-rc10
            GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
           docker-init:
            Version:          0.18.0
            GitCommit:        fec3683

 

              22、映象的結構

                            ${register_name}/${repository_name}/${image_name}:${tag_name}

                    Register_name:遠端倉庫的地址。

                    Repository_name:分類倉庫的名稱。

                    Image_name:映象的名稱。

                    Tag_name:標籤的名字。

                    例如:docker.io/library/alpine:3.10.1

                    Register_Name:docker.io

                    Repository_Name:library,library是公開的倉庫。

                    Image_Name:alpine

                    Tag_Name:3.10.1,一般用版本號做標籤,你可以用時間戳等。

             23、世界上最大的Docker Hub倉庫。

                    登入地址:https://hub.docker.com/,在此需要註冊自己的賬號。

                        

          註冊地址:https://hub.docker.com/signup

          介面圖下:

             

          在註冊賬號的時候,需要驗證郵箱,這個大家要注意一下。


          24、登入 docker.io,登入後可以和伺服器進行溝通。

            命令:#docker login docker.io

            [root@localhost ~]# docker login docker.io
            Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.

            Username: patrickliu1979
            Password:********
            WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
            Configure a credential helper to remove this warning. See
            https://docs.docker.com/engine/reference/commandline/login/#credentials-store

            Login Succeeded


        25、您登入的認證結果儲存位置。

            儲存目錄:/root/.docker/config.json 

            [root@localhost ~]# cat /root/.docker/config.json
            {
                    "auths": {
                            "https://index.docker.io/v1/": {
                                    "auth": "cGF0cmlja2xp****************MwNjMw"
                            }
                    },
                   "HttpHeaders": {
                           "User-Agent": "Docker-Client/19.03.13 (linux)"
                   }
            }

 


        26、檢視登入docker.io密碼和賬號:

            [root@localhost ~]# echo "cGF0cmlja2xp****************MwNjMw"|base64 -d 
            patr**********:************


        27、在docker hub上查詢映象

            命令:#docker search redis

          [root@localhost ~]# docker search redis
          NAME                             DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
          redis                            Redis is an open source key-value store that…   9232                [OK]       
          bitnami/redis                    Bitnami Redis Docker Image                      176                                     [OK]
          sameersbn/redis                                                                  82                                      [OK]
          grokzen/redis-cluster            Redis cluster 3.0, 3.2, 4.0, 5.0, 6.0, 6.2      77                             
          rediscommander/redis-commander   Alpine image for redis-commander - Redis man…   55                                      [OK]
          redislabs/redisearch             Redis With the RedisSearch module pre-loaded…   32                             
          redislabs/redis                  Clustered in-memory database engine compatib…   29                             
          redislabs/redisinsight           RedisInsight - The GUI for Redis                25                             
          oliver006/redis_exporter          Prometheus Exporter for Redis Metrics. Supp…   24                             
          redislabs/rejson                 RedisJSON - Enhanced JSON data type processi…   24                              
          arm32v7/redis                    Redis is an open source key-value store that…   22                             
          bitnami/redis-sentinel           Bitnami Docker Image for Redis Sentinel         19                                      [OK]
          redislabs/redisgraph             A graph database module for Redis               15                                      [OK]
          arm64v8/redis                    Redis is an open source key-value store that…   11                             
          webhippie/redis                  Docker images for Redis                         11                                      [OK]
          s7anley/redis-sentinel-docker    Redis Sentinel                                  10                                      [OK]
          redislabs/redismod               An automated build of redismod - latest Redi…   9                                       [OK]
          insready/redis-stat              Docker image for the real-time Redis monitor…   9                                       [OK]
          goodsmileduck/redis-cli          redis-cli on alpine                             7                                       [OK]
          centos/redis-32-centos7          Redis in-memory data structure store, used a…   5                              
          circleci/redis                   CircleCI images for Redis                       5                                       [OK]
          clearlinux/redis                 Redis key-value data structure server with t…   3                              
          tiredofit/redis                  Redis Server w/ Zabbix monitoring and S6 Ove…   1                                       [OK]
          wodby/redis                      Redis container image with orchestration        1                                       [OK]
          xetamus/redis-resource           forked redis-resource                           0                                       [OK]

    
        28、拉取伺服器上的映象,不加Tag,預設下載最新版。
    
              命令:#docker pull alpine

           [root@localhost ~]# docker pull alpine
           Using default tag: latest
           latest: Pulling from library/alpine
           ba3557a56b15: Pull complete
            Digest: sha256:a75afd8b57e7f34e4dad8d65e2c7ba2e1975c795ce1ee22fa34f8cf46f96a3be
           Status: Downloaded newer image for alpine:latest
           docker.io/library/alpine:latest


        29、映象的結構

              registry_name/repository_name/image_name:tag_name        

        30、檢視本地映象

              命令:#docker images/docker image ls

                   [root@localhost ~]# docker images
            REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
            hello-world            latest              d1165f221234        2 weeks ago         13.3kB
            patrickliu1979/httpd   v2021.228           0cb18c5cffb8        3 weeks ago         337MB
            alpine                 latest              28f6e2705743        4 weeks ago         5.61MB
            nginx                  latest              35c43ace9216        4 weeks ago         133MB
            centos                 7                   8652b9f0cb4c        4 months ago        204MB
            redis                  latest              f0453552d7f2        12 months ago       98.2MB
            hello-world            latest              bf756fb1ae65        14 months ago       13.3kB

            [root@localhost ~]# docker image ls
            REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
            hello-world            latest              d1165f221234        2 weeks ago         13.3kB
            patrickliu1979/httpd   v2021.228           0cb18c5cffb8        3 weeks ago         337MB
            alpine                 latest              28f6e2705743        4 weeks ago         5.61MB
            nginx                  latest              35c43ace9216        4 weeks ago         133MB
            centos                 7                   8652b9f0cb4c        4 months ago        204MB
            redis                  latest              f0453552d7f2        12 months ago       98.2MB
            hello-world            latest              bf756fb1ae65        14 months ago       13.3kB


        31、給映象打標籤

              命令:#docker tag image_id registry_name/repository_name/image_name:tag_name

            說明一下:我們註冊賬號就是倉庫的名稱。

              [root@localhost ~]# docker tag f0453552d7f2 docker.io/patrickliu1979/redis:v2021.224    
              [root@localhost ~]# docker image ls
              REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
              alpine                 latest              28f6e2705743        6 days ago          5.61MB
              redis                  latest              f0453552d7f2        11 months ago       98.2MB
              patrickliu1979/redis   v2021.224           f0453552d7f2        11 months ago       98.2MB


        32、推送映象到docker hub.

              命令:#docker push registry_name/repository_name/image_name:tag_name

            [root@localhost ~]# docker push docker.io/patrickliu1979/redis:v2021.224
            The push refers to repository [docker.io/patrickliu1979/redis]
            2f8c6410a70f: Mounted from library/redis
            bc1e8e75ef31: Mounted from library/redis
            6b3ece100807: Mounted from library/redis
            aaa520a04939: Mounted from library/redis
            56f1f103e9b9: Mounted from library/redis
            f2cb0ecef392: Mounted from library/redis
            v2021.224: digest: sha256:780f7dacdc133e899fba9ff09c099828b469030acefe6f3bbc16197b55800cfd size: 1572

            可以去 docker hub 登入賬號,檢視我們剛才推送的映象。


        33、刪除映象

              命令:#docker rmi image_id/docker image rm image_id

              如此刪除,只能刪除標籤,映象本身不會刪除
              [root@localhost ~]# docker rmi patrickliu1979/redis:v2021.224
              Untagged: patrickliu1979/redis:v2021.224
              Untagged: patrickliu1979/redis@sha256:780f7dacdc133e899fba9ff09c099828b469030acefe6f3bbc16197b55800cfd
              [root@localhost ~]#
              [root@localhost ~]# docker image ls
              REPOSITORY          TAG                 IMAGE ID            C