自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

想理解、會用Docker,這篇文章就夠了!

云計算
打開翻譯君輸入Docker結(jié)果顯示碼頭工人,沒錯!碼頭工人搬運(yùn)的是集裝箱,那么今天要講的Docker其操作的也是集裝箱,這個集裝箱就靜態(tài)而言就是一個應(yīng)用鏡像文件,就動態(tài)而言,就是一個容器。蒙了吧?好吧,上圖解釋。

Docker是啥?

打開翻譯君輸入Docker 結(jié)果顯示碼頭工人,沒錯!碼頭工人搬運(yùn)的是集裝箱,那么今天要講的Docker其操作的也是集裝箱,這個集裝箱就靜態(tài)而言就是一個應(yīng)用鏡像文件,就動態(tài)而言,就是一個容器。蒙了吧?好吧,上圖解釋。 

圖0:想理解、會用Docker,這篇文章就夠了!

Docker從狹義上來講就是一個進(jìn)程,從廣義上來講是一個虛擬容器,其實更專業(yè)的叫法是應(yīng)用容器( Application Container ),Docker進(jìn)程和普通的進(jìn)程沒有任何區(qū)別,它就是一個普通的應(yīng)用進(jìn)程。不過是用來操作鏡像文件的。所以Docker進(jìn)程+構(gòu)建的應(yīng)用鏡像文件就等于Docker容器。本文所有講的Docker都是指Docker容器哦。

再繼續(xù)下文之前我們首先要明確幾個docker重要的基本概念吧,鏡像,容器,倉庫。

鏡像Docker images,就類似于VM虛擬機(jī)里面的快照,但是可比快照輕量化多了??煺詹欢?那可以把images直接理解成一個文件夾。我們可以通過ID或者易識別的名字+tag來確認(rèn)唯一的目標(biāo)鏡像。ImagesID是一個64位的字符,但是一般我們都是使用前面12位就足夠區(qū)別了。

如圖中左邊紅框中redis: lates和右邊的紅框中5f515359c7f8都唯一表示為同一個鏡像。所以我們一般的鏡像可以命名為類似centos:latest、centos:centos7.1.1503等等。

鏡像是分層的,有基礎(chǔ)鏡像,僅僅包含操作系統(tǒng),比如centos鏡像;有中間件鏡像,比如redis等數(shù)據(jù)庫鏡像;***是應(yīng)用鏡像,就是指具體的應(yīng)用服務(wù)了,應(yīng)用鏡像可以非常豐富,隨時可以發(fā)布,這三者之間依次疊加。

所以當(dāng)我們在使用 Docker構(gòu)建鏡像的時候,每一個命令都會在前一個命令的基礎(chǔ)上形成一個新鏡像層。如下圖,基礎(chǔ)鏡像就是centos鏡像,中間件鏡像就是兩個紅色圈,應(yīng)用鏡像就是紫色圈。其中redis+centos這樣疊加組合的中間件鏡像就可以供A服務(wù)或者B服務(wù)使用,這樣疊加組合更加靈活。仍和一種鏡像都可以從Docker hub公共倉庫中拉取。 

圖1:想理解、會用Docker,這篇文章就夠了!

容器Docker containers,你可以從鏡像中創(chuàng)建容器,這如同從快照中創(chuàng)建虛擬機(jī),不過更輕量,啟動更快,秒啟。應(yīng)用是在容器中運(yùn)行的,打個比方,你首先下載了一個Ubuntu的鏡像,然后又安裝mysql和Django應(yīng)用及其依賴,來完成對它Ubutun鏡像的修改,一個個人覺得非常***應(yīng)用鏡像生成了!就把這個鏡像分享給大家使用,大家通過這個鏡像就生成一個容器。容器啟動之后就會運(yùn)行Django服務(wù)了。 

圖2:想理解、會用Docker,這篇文章就夠了!

上面也說到了,容器就是一個個獨(dú)立的封閉的集裝箱,但是也需要對外提供服務(wù)的,所以Docker允許公開容器的特定端口,在啟動Docker的時候,我們就可以將容器的特定端口映射到宿主機(jī)上面的任意一個端口,所以,如果幾個服務(wù)都需要80端口,那么容器的對外端口是80,但是映射到宿主機(jī)上面就是任意端口,就不會產(chǎn)生沖突,所以就不需要通過代理來解決沖突。容器對外端口與宿主機(jī)的端口映射可以通過下面的命令來完成。

啟動docker容器

  • docker run -d -p 2222:22 --name 容器名 鏡像名
  • -d 守護(hù)容器,就是后臺運(yùn)行,退出命令窗口容器也不會停止
  • -it 交互式容器 退出命令窗口容器就停止運(yùn)行了
  • -p宿主機(jī)端口和容器端口映射
  • 8081:80 宿主機(jī)端口:容器公開的端口 
圖3:想理解、會用Docker,這篇文章就夠了!

倉庫Docker registeries,docker倉庫和存放集裝箱的倉庫是一樣的,不過docker使用來存放鏡像的。倉庫存在公有和私有之分,公有倉庫docker hub提供了非常多的鏡像文件,這些鏡像直接拉取下來就可以運(yùn)行了,你也可以上傳自己的鏡像到docker hub上面。同時也可以自己搭建私有倉庫用于團(tuán)隊項目管理。

結(jié)合前面介紹的基本概念,我們可以將docker的幾個概念使用大致串起來,他們之間是如何運(yùn)作的,也就是Docker的生命周期。

看下圖,主要是三步走。 

圖4:想理解、會用Docker,這篇文章就夠了!
  1. 開發(fā)構(gòu)建鏡像并將鏡像push到Docker倉庫
  2. 測試或者運(yùn)維從Docker倉庫拷貝一份鏡像到本地
  3. 通過鏡像文件開啟Docker容器并提供服務(wù)

為啥要用Docker?能干些啥?

為啥要用Docker?這要從目前軟件行業(yè)的痛點(diǎn)來講起

  • 軟件更新發(fā)布及部署低效,過程繁瑣且需要人工介入,
  • 環(huán)境一致性難以保證,
  • 不同環(huán)境之間遷移成本太高。

有了Docker可以很大程度解決上面的問題。

首先,Docker的使用簡單至極,從開發(fā)的角度來看就是三步走:構(gòu)建,運(yùn)輸,運(yùn)行。其中關(guān)鍵步驟就是構(gòu)建環(huán)節(jié),即打包鏡像文件。但是從測試和運(yùn)維的角度來看,那就只有兩步:復(fù)制,運(yùn)行。有了這個鏡像,那么想復(fù)制到哪運(yùn)行都可以,完全和平臺無關(guān)了。同時Docker這種容器技術(shù)隔離出了獨(dú)立的運(yùn)行空間,不會和其他應(yīng)用爭用系統(tǒng)資源了以及還不需要考慮應(yīng)用之間相互影響,想想就開心。

其次,因為在構(gòu)建鏡像的時候就處理完了服務(wù)程序?qū)τ谙到y(tǒng)的所有依賴,所以在你使用的時候,你可以忽略掉原本程序的依賴以及開發(fā)語言。對測試和運(yùn)維而言,更多專注于自己的業(yè)務(wù)內(nèi)容上。

***,Docker于開發(fā)者而言提供了一種開發(fā)環(huán)境的管理辦法,與測試人員而言保證了環(huán)境的同步,于運(yùn)維人員提供了可移植的標(biāo)準(zhǔn)化部署流程。

所以, Docker 能干啥,總結(jié)如下:

  • 構(gòu)建容易分發(fā)簡單
  • 隔離應(yīng)用解除依賴
  • 快速部署測完就銷

Docker是個進(jìn)程級的輕量化虛擬機(jī),和傳統(tǒng)虛擬機(jī)有啥區(qū)別呢?

Docker這個虛擬機(jī)超級輕量級,僅僅是一個進(jìn)程而已。與傳統(tǒng)的虛擬機(jī)比如VM有著巨大的差別

區(qū)別看下圖: 

圖5:想理解、會用Docker,這篇文章就夠了!

我們來看一下二者的區(qū)別,因為 VM 的 Hypervisor 需要實現(xiàn)對硬件的虛擬化,并且還要搭載自己的操作系統(tǒng),其中虛擬機(jī)操作系統(tǒng)占用內(nèi)存是比較大的,一個操作系統(tǒng)有好幾個G,自然在啟動速度和資源利用率以及性能上有非常大的開銷,如果在本地,或者個人電腦,那么影響還不是那么大,但是在云端就是一個非常大的資源浪費(fèi)。

咱們很多時候做事情的時候不會考慮與事情本身無關(guān)的問題,比如造飛機(jī)的不會考慮飛機(jī)是否要潛水,對于我們目前很多移動互聯(lián)網(wǎng)的應(yīng)用來說,很少會涉及到對操作系統(tǒng)的部分,其實我們主要關(guān)心的是應(yīng)用的本身,而VM虛擬機(jī)的上層是運(yùn)行的運(yùn)行時庫和應(yīng)用,整個虛擬機(jī)的空間是非常的龐大,但是容器化技術(shù)Docker技術(shù)的出現(xiàn)后,省去了操作系統(tǒng)這一層,多個容器之間相互隔離且共用了宿主操作系統(tǒng)和運(yùn)行時庫。

所以Docker 應(yīng)用容器相對于 VM 有以下幾個優(yōu)點(diǎn):

  • 啟動速度快,容器啟動本質(zhì)就是一個開啟一個進(jìn)程而已,因此都是秒啟,而 VM 通常要更久。
  • 資源利用率高,一臺普通 PC 可以跑成百上千個容器,你跑十個 VM 試試。
  • 性能開銷小, VM 通常需要額外的 CPU 和內(nèi)存來完成 OS 的功能,這一部分占據(jù)了額外的資源。

所以很多移動互聯(lián)網(wǎng)的應(yīng)用或者云計算的后端節(jié)點(diǎn)都可以用docker來替換物理機(jī)器或者虛擬機(jī)。比如騰訊地圖的很多后臺服務(wù)基本上都遷移docker部署了。

Docker是個啥架構(gòu)?底層又是用的啥技術(shù)?

前面說了那么多,始終還是霧里看花。下面就詳細(xì)介紹一下技術(shù)架構(gòu),底層又是用的啥技術(shù)來實現(xiàn)上述那么多優(yōu)點(diǎn)的?

Docker技術(shù)架構(gòu)圖: 

圖6:想理解、會用Docker,這篇文章就夠了!

從Docker依賴的底層技術(shù)來看,Docker原生態(tài)是不能直接在Windows平臺上運(yùn)行的,只支持linux系統(tǒng),原因是Docker依賴linux kernel三項最基本的技術(shù),namespaces充當(dāng)隔離的***級,是對Docker容器進(jìn)行隔離,讓容器擁有獨(dú)立的hostname,ip,pid,同時確保一個容器中運(yùn)行一個進(jìn)程而且不能看到或影響容器外的其它進(jìn)程;Cgroups是容器對使用的宿主機(jī)資源進(jìn)行核算并限制的關(guān)鍵功能。

比如CPU,內(nèi)存,磁盤等,union FS主要是對鏡像也就是image這一塊作支持,采用copy-on-write技術(shù),讓大家可以共用某一層,對于某些差異層的話就可以在差異的內(nèi)存存儲,Libcontainer是一個庫,是對上面這三項技術(shù)做一個封裝。

Docker engine 用來控制容器container的運(yùn)行,以及鏡像文件的拉取。

Docker咋裝呢?Docker怎么用呢?

安裝之前,我們首先確保自己的linux系統(tǒng)內(nèi)核版本高于3.10,并且系統(tǒng)是64位,才能體驗Docker哦。

通過uname -ir查看是否滿足要求。 

圖7:想理解、會用Docker,這篇文章就夠了!

Docker安裝

通過腳本的方式安裝docker,非常簡單。

1、 獲取***的docker安裝包

  1. nicktang@nicktang-virtual-machine:~$ wget -qO- https://get.docker.com/ | sh  
圖8:想理解、會用Docker,這篇文章就夠了!

輸入當(dāng)前用戶的密碼后,就會下載腳本并且安裝Docker及依賴包。 

圖9:想理解、會用Docker,這篇文章就夠了!
圖10:想理解、會用Docker,這篇文章就夠了!

顯示上圖內(nèi)容就表明安裝完成。

2、 啟動docker 后臺服務(wù) 

  1. root@nicktang-virtual-machine:/data # sudo service docker start #啟動守護(hù)進(jìn)程  
  2. root@nicktang-virtual-machine:/data # docker -v 

 圖11:想理解、會用Docker,這篇文章就夠了!

能夠看見版本號,說明docker的安裝成功。簡單吧!至此就差一個鏡像了。自己制作還是從公共倉庫拉取就隨你啦。

  1. root@nicktang-virtual-machine:/data # sudo service docker stop #關(guān)閉守護(hù)進(jìn)程 

Docker使用

Docker的使用,我們主要從【增刪查】幾方面來說說怎么使用docker,為什么沒有【改】呢,因為在我看來docker容器一旦出現(xiàn)問題了,根本沒有修復(fù)的必要,直接把容器停止并刪除,再啟動,這樣來得快。所以我們只需要掌握幾個基本命令即可,具體如下。

【查】查看本地已有的鏡像 Docker images 

圖12:想理解、會用Docker,這篇文章就夠了!

【增】運(yùn)行一個鏡像,即啟動一個容器 docker run 鏡像名 ,比如我們運(yùn)行docker run centos

鍵入這個命令的時候完成了三樣操作

  1. 檢查本地是否有hello-world這個鏡像,有->就跳過第二步 沒有->依次執(zhí)行
  2. 就自動去docker hub下載這個鏡像
  3. 就把鏡像加載到容器并且運(yùn)行 
圖13:想理解、會用Docker,這篇文章就夠了!

再用docker images查看的時候本地就增加了centos鏡像。 

圖14:想理解、會用Docker,這篇文章就夠了!

Tag為latest就表示是***版本的centos系統(tǒng)鏡像。因為會從docker hub拉取沒有的鏡像,所以算【增】里面。

【增】拉取指定的鏡像文件 docker pull 鏡像名:TAG

上面那種通過直接運(yùn)行的方式拉取的是docker hub中***的鏡像,但是有時候我想拉取指定的鏡像文件就需要使用docker pull命令來拉取。因為從官方拉取鏡像文件,通常是比較慢的,所以我們可以通過加速器技術(shù)來從國內(nèi)的鏡像倉庫拉取。

【查】查看所有的容器docker ps -a 可以用來查看所有的容器,包括運(yùn)行中的和已經(jīng)停止的。 

圖15:想理解、會用Docker,這篇文章就夠了!

***個字段就是已經(jīng)啟動的容器ID,第二個字段就是這個容器是根據(jù)哪個鏡像生成的。但是上面這個命令只是臨時啟動一下容器,上面圖中的status 是exited(0),表示容器是退出狀態(tài)。如果想容器在后臺運(yùn)行,所以我們需要啟動守護(hù)式容器才可以,只要在啟動命令中添加一個 -d參數(shù),即docker run -d centos就可以了。

【查】查看鏡像/容器的具體信息 docker inspect鏡像ID(鏡像名)/容器ID(容器名) docker inspect centos

這個命令是返回一個鏡像或者容器詳細(xì)信息的json串。其中包括ID,ip,版本,容器的主程序等非常多的信息,根據(jù)這些信息我們可以進(jìn)行二次開發(fā)。在這個命令的基礎(chǔ)之上增加一個-f參數(shù)我們可以指定獲取自己需要的信息,比如獲取redis容器的IP地址,內(nèi)存信息,CPU使用情況。

  1. docker inspect -f ‘{{.NetworkSettings.IPAddress}}’ [ID /Name]  
圖16:想理解、會用Docker,這篇文章就夠了!

【查】進(jìn)入容器 docker run -it centos 即啟動一個交互式容器

-it 完成容器終端和當(dāng)前終端進(jìn)行關(guān)聯(lián),即當(dāng)前終端的顯示就會切換到容器終端的顯示。 

圖17:想理解、會用Docker,這篇文章就夠了!

查看容器目錄結(jié)構(gòu),發(fā)現(xiàn)和物理機(jī)器的目錄結(jié)構(gòu)完全一致,這就是為什么有的人稱docker容器也稱之為虛擬機(jī)的原因。

Exit可以退出容器終端。 

圖18:想理解、會用Docker,這篇文章就夠了!

【刪】刪除容器,docker rm 容器ID,刪除多個容器就可以多個容器ID之間用空格隔開即可。 

圖19:想理解、會用Docker,這篇文章就夠了!

怎么用Docker完成持續(xù)集成、自動交付、自動部署?

這年頭見面不聊點(diǎn)自動化什么的,持續(xù)什么的,都不好意思。所以,咱們也要了解一下持續(xù)集成,自動交付,自動部署。但是上面說了這么多,沒發(fā)現(xiàn)Docker有那三樣功能啊,是的,Docker是沒有這個功能,但是你在完成上述三樣自動化的步驟都是依賴Docker的。Docker是這些流程實現(xiàn)的基礎(chǔ),就如同軟件開發(fā),軟件代碼才是根本,開發(fā)工具是輔助。所有搭建一個完整的自動化流程還需要github+jenkins+ registry三樣幫助。

持續(xù)集成和自動部署的原理如下圖所示: 

圖20:想理解、會用Docker,這篇文章就夠了!
  1. RD推送代碼到git 倉庫或者svn等代碼服務(wù)器上面,git服務(wù)器就會通過hook通知jenkins。
  2. jenkine 克隆git代碼到本地,并通過dockerFile文件進(jìn)行編譯 。
  3. 打包生成一個新版本的鏡像并推送到倉庫 ,刪除當(dāng)前容器 ,通過新版本鏡像重新運(yùn)行。

而在整個過程中 RD只需要敲入三個命令Git add * ;Git commit –m “”;Git push即可完成持續(xù)集成、自動交付、自動部署。后面通過案例實際演示這個過程的神奇!

Docker還可以很方便的自動擴(kuò)容哦,一般的自動擴(kuò)容的兩種方式,一種就是docker容量擴(kuò)大,另一種就是docker節(jié)點(diǎn)數(shù)擴(kuò)充。***種就修改配置文件即可,第二種通過簡單的拷貝,運(yùn)行就完成了節(jié)點(diǎn)的擴(kuò)容。

總結(jié)

雖然Docker具有超輕量化,但是不建議一臺機(jī)器上面部署太多的應(yīng)用,同時部署的時候一定要差異化部署,什么意思呢?就是將大量計算的,和內(nèi)存需要大的,IO操作頻繁的對系統(tǒng)資源需求不一致的部署到同一臺宿主機(jī)上。

作者丨唐文廣:騰訊工程師,負(fù)責(zé)無線研發(fā)部地圖測試

責(zé)任編輯:未麗燕 來源: 程序師
相關(guān)推薦

2019-10-31 09:48:53

MySQL數(shù)據(jù)庫事務(wù)

2017-03-30 22:41:55

虛擬化操作系統(tǒng)軟件

2017-03-10 21:04:04

Android適配

2017-03-07 15:35:26

Android適配 界面

2021-11-10 07:47:48

Traefik邊緣網(wǎng)關(guān)

2019-07-10 15:15:23

JVM虛擬機(jī)Java

2022-05-27 08:18:00

HashMapHash哈希表

2024-07-05 11:01:13

2019-09-25 09:17:43

物聯(lián)網(wǎng)技術(shù)信息安全

2024-03-26 00:00:06

RedisZSet排行榜

2020-07-08 10:36:18

Linux 運(yùn)維 數(shù)據(jù)

2018-10-31 17:22:25

AI人工智能芯片

2021-06-04 07:27:24

sourcemap前端技術(shù)

2020-10-13 07:44:40

緩存雪崩 穿透

2024-02-28 08:59:47

2018-08-17 09:14:43

餓了么容器演進(jìn)

2021-04-09 10:03:12

大數(shù)據(jù)exactly-onc

2022-08-26 05:22:21

RabbitMQ架構(gòu)

2018-04-23 11:00:44

PythonRedisNoSQL

2023-09-04 08:00:00

開發(fā)Java線程
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號