廬山真面目之十四微服務架構的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 的沖突 --> 解決依賴關系完成 。。。。。 安裝到完成。
如果提示:
您可以嘗試添加 --skip-broken 選項來解決該問題
您可以嘗試執行:rpm -Va --nofiles --nodiges
解決辦法:
//只需要清除yum 緩存即可
yum clean all
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 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 <hannibal@a-team.com>")作者(例如,“約翰·漢尼拔·史密斯<hannibal@a-team.com>”) -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="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://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=http://news.baidu.com name=tj_trnews class="mnav">新聞</a> <a href=http://www.hao123.com name=tj_trhao123 class="mnav">hao123</a> <a href=http://map.baidu.com name=tj_trmap class="mnav">地圖</a> <a href=http://v.baidu.com name=tj_trvideo class="mnav">視頻</a> <a href=http://tieba.baidu.com name=tj_trtieba class="mnav">貼吧</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class="lb">登錄</a> </noscript> <script>document.write('<a href="http://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=http://home.baidu.com>關於百度</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>©2017 Baidu <a href=http://www.baidu.com/duty/>使用百度前必讀</a> <a href=http://jianyi.baidu.com/ class="cp-feedback">意見反饋</a> 京ICP證030173號 <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 http://mirrors.163.com/debian/ jessie main non-free contrib
deb http://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的內容還有很多,我也不可能在一篇文章里寫的那么全。我也是一位學習者,不斷學習,不斷總結,以后會有更實際的、更好的東西奉獻給大家。不忘初心,繼續努力,每天進步一點點。