廬山真面目之十四微服務架構的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 (//docs.docker.com/develop/sdk/) 與 Docker 的守護進程通信。

Docker 服務器(Host)

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

Docker Registry

Docker 倉庫用來保存鏡像,可以類比源代碼管理,Docker
Repository可以理解為源代碼管理中的代碼倉庫。

Docker Hub(//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 //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  //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倉庫。

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

                        

          註冊地址://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 //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": {
                            "//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            CREATED             SIZE
              alpine              latest              28f6e2705743        6 days ago          5.61MB
              redis               latest              f0453552d7f2        11 months ago       98.2MB
              hello-world         latest              bf756fb1ae65        13 months ago       13.3kB
              hello-world         latest              bf756fb1ae65        13 months ago       13.3kB
              [root@localhost ~]#


              如果想徹底刪除鏡像,如果有多個標籤,先刪除標籤,在刪除鏡像文件。-f 強制刪除
              [root@localhost ~]#docker rmi -f image_id 

        34、鏡像特性

              bootfs–>base
image–>…..—->Container(容器層是可寫的,其他層只讀的)

              每一層鏡像的下面一層是上一層的父鏡像。

              第一層鏡像為Base Image,也叫基礎鏡像,位於 bootfs 之上。

              容器在最頂層,是可寫的。

              其他的所有層都是 ReadOnly只讀的。
    
              Docker 將 ReadOnly 的FS 層叫做「鏡像」

              Bootfs層是最底層,也是基礎層,包含lxc、aufs\btrfs和Kernel(核心部件),無論是往共有倉庫還是私有倉庫推送都是增量推送。這是Docker基於Aufs構建最好的一點。分層的,增量推送,第一次使用慢而已。

            

        35、docker ps -a(列出所有存活或者退出的容器)/docker
ps(列出所有存活的容器)

            [root@localhost ~]# docker ps(現在沒有存活的容器)
            CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

            [root@localhost ~]# docker ps –a(列出所有容器)
            CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
            fa7bf2b2b2d7        hello-world         "/hello"            42 minutes ago      Exited (0) 42 minutes ago                       focused_colden

        36、我們開始運行Docker 容器,執行docker run命令。

              命令:#docker run [OPTIONS] IMAGE [COMMAND] [ARG…]

              OPTIONS:
              -i:表示啟動一個可交互的容器,並持續打開標準輸入
              -t:表示使用終端關聯到容器的標準輸入輸出上。
              -d:表示將容器防置後台運行。
              –rm:退出後及刪除容器實例。
              –name:表示定義容器的唯一名稱。
              IMAGE:表示容器的模板名稱。
              COMMAND:表示啟動容器時要運行的命令。

            [root@localhost ~]# docker run -it alpine:latest /bin/sh
            / # ip add
            1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 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
            7: eth0@if8: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
                link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
                inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
                   valid_lft forever preferred_lft forever
              / # cat /etc/issue
            Welcome to Alpine Linux 3.13
            Kernel \r on an \m (\l)

            / # exit

        37、docker run –rm alpine:latest /bin/echo hello,一次運行,運行完畢刪除容器。

              [root@localhost ~]# docker run --rm alpine:latest /bin/echo hello
              hello

        38、啟動一個非交互的後台容器。

              命令:#docker
run -d –name myalpine alpine:latest
 

              [root@localhost ~]# docker run -d --name myalpine alpine:latest
             bf1a54d2e377d453ecf0fdd4ee02e57fb75c0c30ac52bf94b7026b866f476ed8
             [root@localhost ~]# docker ps -a
             CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
             bf1a54d2e377        alpine:latest       "/bin/sh"           8 seconds ago       Exited (0) 7 seconds ago                       myalpine
             d18bed8415ff        alpine:latest       "/bin/sh"           7 minutes ago       Exited (0) 4 minutes ago                       elastic_curie
             58a0a905766a        hello-world         "/hello"            3 days ago          Exited (0) 3 days ago                          compassionate_nash

        39、進入到一個up 狀態容器

               命令:#docker exec -it containerID /bin/sh

                    [root@localhost ~]# docker exec -it 08708c89b20a /bin/sh    
              / #

        40、我們根據容器的ID或者名稱停止處於Up狀態的容器。
                        命令:#docker stop containerID/containerName

                    [root@localhost ~]# docker ps(開始查詢是有容器實例)
              CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
              08708c89b20a        alpine:latest       "/bin/sh"           2 minutes ago       Up 2 minutes                            gifted_burnell
              [root@localhost ~]# docker stop 08708c89b20a
              08708c89b20a    
                    [root@localhost ~]# docker ps(再次查詢,沒有容器實例了)
              CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

              41、我們可以根據容器的ID 或者名稱啟動處於Exited狀態容器。
                       命令:#docker start containerID/containerName

                    [root@localhost ~]# docker ps -a
              CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
              fa7bf2b2b2d7        hello-world         "/hello"            42 minutes ago      Exited (0) 42 minutes ago                       focused_colden
              [root@localhost ~]# docker start fa7bf2b2b2d7
              fa7bf2b2b2d7

              42、我們可以根據容器的ID 或者名稱啟動處於Exited狀態容器。
                      命令:#docker
restart containerID/containerName

                   [root@localhost ~]# docker restart fa7bf2b2b2d7
               fa7bf2b2b2d7

              43、我們可以根據容器ID或者名稱刪除處於Exited 狀態的容器。
                      命令:#docker
rm containerID/containerName

                   [root@localhost ~]# docker rm fa7bf2b2b2d7
                    fa7bf2b2b2d7

              44、我們可以根據容器ID或者名稱強制刪除處於Exited 狀態的容器。                    
                      命令:#docker
rm -f containerID/containerName

                  [root@localhost sha256]# docker rm -f 2702bb89bf2e    
                    2702bb89bf2e    

             45、過濾宿主機上所有退出的容器,並幹掉。

            命令#for i in `docker ps -a|grep -i exit|awk ‘{print $1}’`;do docker rm -f $i;done

            [root@localhost ~]# for i in `docker ps -a|grep -i exit|awk '{print $1}'`;do docker rm -f $i;done

             46、提交容器,生成鏡像。
                     命令:#docker
commit

            Usage:  docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
            Create a new image from a container's changes(根據容器的更改創建新圖像)
            [root@localhost ~]# docker commit --help
            Usage:  docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
            Create a new image from a container's changes
            Options:
              -a, --author string    Author (e.g., "John Hannibal Smith <[email protected]>")作者(例如,「約翰·漢尼拔·史密斯<[email protected]>」)
              -c, --change list      Apply Dockerfile instruction to the created image(將Dockerfile指令應用於創建的映像)
              -m, --message string   Commit message(提交訊息)
              -p, --pause            Pause container during commit (default true)【提交期間暫停容器(默認為true)】
            [root@localhost ~]# docker commit -p redis-test patrickliu1979/redis:v2021.03.26-20.17
            sha256:0d19ea10697344a8fdbbe20c298075a50ca54b7928ca8f236c5c0e94a95c92c4
            [root@localhost ~]# docker images(我們提交的鏡像)
            REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
            patrickliu1979/redis   v2021.03.26-20.17   0d19ea106973        42 seconds ago      105MB

    
            47、我們導出鏡像,可以執行命令Docker Save。
                     命令:#docker
save containerID > name

            Usage:  docker save [OPTIONS] IMAGE [IMAGE...]
            Save one or more images to a tar archive (streamed to STDOUT by default)
            Options:
              -o, --output string   Write to a file, instead of STDOUT

            [root@localhost ~]# docker save 0d19ea106973 > redis:v2021.03.26-20.17.tar.gz
            [root@localhost ~]# ll
            總用量 106188
            -rw-r--r--. 1 root root        71 2月  28 20:31 Dockerfile
            drwxr-xr-x. 2 root root        24 2月  27 20:45 html
            drwxr-xr-x. 4 root root        38 2月   5 13:46 microService
            -rw-r--r--. 1 root root 108728832 3月  26 20:31 redis:v2021.03.26-20.17.tar.gz

            48、如果我們又了導出的鏡像文件,可以根據此文件導入鏡像。
                     命令:#
docker load < 導出的鏡像文件名稱

            [root@localhost ~]# docker load < redis\:v2021.03.26-20.17.tar.gz
            Loaded image ID: sha256:0d19ea10697344a8fdbbe20c298075a50ca54b7928ca8f236c5c0e94a95c92c4
            [root@localhost ~]# docker images
            REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
            <none>              <none>              0d19ea106973        16 minutes ago      105MB
            以上就是我們導入的鏡像,只是沒有tag。
            [root@localhost ~]# docker tag 0d19ea106973 patrickliu1979/redis:v2021-3-26.20.38
            [root@localhost ~]# docker images
            REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
            patrickliu1979/redis   v2021-3-26.20.38    0d19ea106973        19 minutes ago      105MB

            我們為沒有tag的鏡像增加了新的標籤。

            49、查看容器對象的日誌。

           命令:#docker logs containerID/containerName(-f 動態輸出)        

             [root@localhost ~]# docker logs 874e5257e28f -f
                  1:C 26 Mar 2021 12:12:39.051 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
            1:C 26 Mar 2021 12:12:39.051 # Redis version=6.2.1, bits=64, commit=00000000, modified=0, pid=1, just started
            1:C 26 Mar 2021 12:12:39.051 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
            1:M 26 Mar 2021 12:12:39.053 * monotonic clock: POSIX clock_gettime

            還要很多,就不全部貼出來了。

           50、 高級操作

            [root@localhost ~]# docker pull nginx 準備數據
            Using default tag: latest
            latest: Pulling from library/nginx
            45b42c59be33: Pull complete
            8acc495f1d91: Pull complete
            ec3bd7de90d7: Pull complete
            19e2441aeeab: Pull complete
           f5a38c5f8d4e: Pull complete
            83500d851118: Pull complete
            Digest: sha256:f3693fe50d5b1df1ecd315d54813a77afd56b0245a404055a946574deb6b34fc
            Status: Downloaded newer image for nginx:latest
            docker.io/library/nginx:latest

           51、映射端口

              命令:#docker run -p 容器外端口:容器內端口

            [root@localhost ~]# docker run --rm --name mynainx -d -p 81:80 nginx:latest
            886b2eca87134b500b10a052924903d8808c03a76ce93cc05102087fbb7cc896
            [root@localhost ~]# docker ps -a
            CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
            886b2eca8713        nginx:latest        "/docker-entrypoint.…"   7 seconds ago       Up 4 seconds        0.0.0.0:81->80/tcp   mynainx

            [root@localhost ~]# netstat -luntp |grep 81
            tcp6       0      0 :::81                   :::*                    LISTEN      2323/docker-proxy

            [root@localhost ~]# curl 127.0.0.1:81
            <!DOCTYPE html>
            <html>
            <head>
            <title>Welcome to nginx!</title>
            <style>
                body {
                    width: 35em;
                    margin: 0 auto;
                    font-family: Tahoma, Verdana, Arial, sans-serif;
                }
            </style>
            </head>
            <body>
            <h1>Welcome to nginx!</h1>
            <p>If you see this page, the nginx web server is successfully installed and
            working. Further configuration is required.</p>
            
            <p>For online documentation and support please refer to
            <a href="//nginx.org/">nginx.org</a>.<br/>
            Commercial support is available at
            <a href="//nginx.com/">nginx.com</a>.</p>
              
            <p><em>Thank you for using nginx.</em></p>
            </body>
            </html>

            http://192.168.127.141:81/

            52、掛載數據卷

              命令:#docker run -v 容器外目錄:容器內目錄  
          
    docker run -d –rm –name mynginx_baidu_index -d -p
82:80  -v /root/html:/usr/share/nginx/html nginx:latest

              [root@localhost ~]# mkdir html
              [root@localhost ~]# ls
              html  microService
              [root@localhost ~]# cd html/
              [root@localhost html]# wget www.baidu.com -O index.html
              --2021-02-27 20:45:29--  http://www.baidu.com/
              正在解析主機 www.baidu.com (www.baidu.com)... 39.156.66.14, 39.156.66.18
              正在連接 www.baidu.com (www.baidu.com)|39.156.66.14|:80... 已連接。
              已發出 HTTP 請求,正在等待回應... 200 OK
              長度:2381 (2.3K) [text/html]
              正在保存至: 「index.html」

              100%[=========================================================================>] 2,381       --.-K/s 用時 0s

              2021-02-27 20:45:29 (39.3 MB/s) - 已保存 「index.html」 [2381/2381])

              [root@localhost html]# ls
              index.html
              [root@localhost html]# cat index.html
              <!DOCTYPE html>
              <!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class="head_wrapper"> <div class="s_form"> <div class="s_form_wrapper"> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class="fm"> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class="s_ipt" value maxlength=255 autocomplete=off autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=百度一下 class="bg s_btn"></span> </form> </div> </div> <div id=u1> <a href=//news.baidu.com name=tj_trnews class="mnav">新聞</a> <a href=//www.hao123.com name=tj_trhao123 class="mnav">hao123</a> <a href=//map.baidu.com name=tj_trmap class="mnav">地圖</a> <a href=//v.baidu.com name=tj_trvideo class="mnav">視頻</a> <a href=//tieba.baidu.com name=tj_trtieba class="mnav">貼吧</a> <noscript> <a href=//www.baidu.com/bdorz/login.gif?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class="lb">登錄</a> </noscript> <script>document.write('<a href="//www.baidu.com/bdorz/login.gif?login&tpl=mn&u='+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" class="lb">登錄</a>');</script> <a href=//www.baidu.com/more/ name=tj_briicon class="bri" style="display: block;">更多產品</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=//home.baidu.com>關於百度</a> <a href=//ir.baidu.com>About Baidu</a> </p> <p id=cp>&copy;2017&nbsp;Baidu&nbsp;<a href=//www.baidu.com/duty/>使用百度前必讀</a>&nbsp; <a href=//jianyi.baidu.com/ class="cp-feedback">意見反饋</a>&nbsp;京ICP證030173號&nbsp; <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>

              [root@localhost html]# docker run -d --rm --name mynginx_baidu_index -d -p 82:80  -v /root/html:/usr/share/nginx/html nginx:latest
              2537f91e212ad0320962923e6ec411da713eb274d07294e8de6837f9353e922b
              [root@localhost html]# docker ps
              CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
              2537f91e212a        nginx:latest        "/docker-entrypoint.…"   5 seconds ago       Up 3 seconds        0.0.0.0:82->80/tcp   mynginx_baidu_index
              886b2eca8713        nginx:latest        "/docker-entrypoint.…"   10 minutes ago      Up 10 minutes       0.0.0.0:81->80/tcp   mynainx


              http://192.168.127.141:82/  百度官網

           53、傳遞環境變量(如果要傳遞多個 可以使用-e多次,後跟key:value)

              命令:#docker run -e 環境變量key=環境變量value

              docker run -d --rm -e E_OPTS=abdcfe C_OPTS=1234566 nginx:latest printev
              [root@localhost html]# docker run  --rm -e E_OPTS=abdcfe -e C_OPTS=1234566 nginx:latest printenv
              C_OPTS=1234566
              HOSTNAME=3042df388a9f
              HOME=/root
              PKG_RELEASE=1~buster
              NGINX_VERSION=1.19.7
              PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
              NJS_VERSION=0.5.1
              PWD=/
              E_OPTS=abdcfe

           54、容器內安裝軟件(工具)

              yum/apt-get/apt
          
    先更新國內源:
          
    tee /etc/apt/sources.list << EOF
          
    deb //mirrors.163.com/debian/ jessie main non-free
contrib
          
    deb //mirrors.163.com/debian/ jessie-updates main
non-free contrib

               apt-get update      
               apt-get install curl -y

           55、容器的生命周期

             檢查本地是否存在鏡像,如果不存在即從遠端倉庫檢索。

          
    利用鏡像啟動容器。
    
          
    分配一個文件系統,並在只讀的鏡像層外掛載一層可讀可寫層。

          
    從宿主機配置的網橋接口中橋接一個虛擬接口到容器。

              從地址池配置一個ip地址給容器。

          
    執行用戶的指定的命令。

          
    執行完畢後容器終止或者長久運行。

           56、Dockerfile
詳解

            1、格式:
    
          
        #為注釋
                  指令(大寫)內容(小寫)。
                  儘管指令是大小寫不敏感的,但是,我們強烈建議指令大寫,內容小寫。

            2、Docker是按順序執行 Dockerfile 里的指令集合的,從上到下依次執行。

         
     3、每一個 Dockerfile文件的第一個非注釋行指令,必須是「FROM」指令,用於為鏡像文件構建過程中,指定基準鏡像,後續的指令運行於此基準鏡像所提供的運行環境中。

                  實踐中,基準鏡像可以是任何可用鏡像文件,默認情況下,docker build 會在 docker 主機(本地)上查找指定的鏡像文件,當其在本地不存在時,則會從 Docker Registry(遠端)上拉取所需的鏡像文件。

    
          4、Dockerfile指令

                  4.1、USER/WORKDIR
                        USER:Docker裏面,進程使用哪個用戶來啟動容器。
                        WORKDIR:工作目錄,運行的目錄。

                  4.2、ADD/EXPOSE
                        ADD:往容器放東西必備指令。
                        EXPOSE:容器要暴露外界的端口號。
          
                  4.3、RUN/ENV
                        RUN:在構建鏡像的時候幫助你執行一些操作。
                        ENV:設置環境變量

                        Dockerfile的示例:


              
               FROM centos:7


                              ENV
VER 9.11.4


                              RUN
yum install bind-$VER -y


                           docker build . -t
bind:v9.11.4_with_env_run

                  4.4、CMD/ENTRYPOINT
                         CMD:當你啟動容器的時候執行的一些操作。
                         ENTRYPOINT:程序的執行點。

                         Dockerfile的示例:


                              FROM centos:7


                              RUN
yum install httpd -y


                              CMD
[“httpd”,”-D”,”FOREGROUND”]


                           docker build –tag
patrickliu1979/httpd:v2021.228 -f Dockerfile .


                           docker run -d –rm
–name myhttpd -p 83:80 patrickliu1979/httpd:v2021.228

            
                docker ps -a

       
          57、Docker的網絡模型

            40.1、NAT(默認)

                [root@localhost ~]# docker run -it --rm alpine /bin/sh
                / # ip add
                1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 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
                13: eth0@if14: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
                    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
                  inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
                       valid_lft forever preferred_lft forever
                / #

            40.2、None

                docker run --net=none

                [root@localhost ~]# docker run -it --rm --net=none alpine /bin/sh
                / # ip add
                1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 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
                / #

            40.3、Host

                docker run --net=host

                [root@localhost ~]# docker run -it --rm --net=host alpine /bin/sh
                / # ip add
                1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 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 qlen 1000
                    link/ether 00:0c:29:c6:32:2d brd ff:ff:ff:ff:ff:ff
                    inet 192.168.127.141/24 brd 192.168.127.255 scope global dynamic ens33
                       valid_lft 1276sec preferred_lft 1276sec
                    inet6 fe80::5a9f:c8ce:fc84:340f/64 scope link
                       valid_lft forever preferred_lft forever
                3: br-54f0bf11f227: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
                    link/ether 02:42:e6:4c:d0:86 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
                4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
                    link/ether 02:42:25:1a:e4:cc 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
                    inet6 fe80::42:25ff:fe1a:e4cc/64 scope link
                       valid_lft forever preferred_lft forever
                5: br-9f24d73a3b72: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
                    link/ether 02:42:55:79:fa:f4 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
                6: br-e7f6774da423: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
                    link/ether 02:42:20:cd:47:d8 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
                10: veth3f00ca9@if9: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue master docker0 state UP
                    link/ether ee:22:ed:f3:ff:db brd ff:ff:ff:ff:ff:ff
                    inet6 fe80::ec22:edff:fef3:ffdb/64 scope link
                       valid_lft forever preferred_lft forever
                / #

            40.4、聯合網絡

                docker run --net=container:${container_ID}
                docker run -it --rm --name lhwl2 --net=container:06b5613a8ba3 nginx /bin/bash

四、結束

          好了,今天就寫到這裡了。這麼多的內容,肯定不是一天寫完的,我相信大家也知道這個道理,太多了,我只是把每天學習的東西記錄下來,方便以後自己查閱。當然,也記錄了自己的學習歷程。俗話說的好,要想人前顯貴,必要學會背後受罪。有關Docker的內容還有很多,我也不可能在一篇文章里寫的那麼全。我也是一位學習者,不斷學習,不斷總結,以後會有更實際的、更好的東西奉獻給大家。不忘初心,繼續努力,每天進步一點點。