日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

Docker说了这么多 最全的一篇在这里

發(fā)布時(shí)間:2025/4/5 78 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Docker说了这么多 最全的一篇在这里 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Docker,近兩年才流行起來的超輕量級(jí)虛擬機(jī),它可以讓你輕松完成持續(xù)集成、自動(dòng)交付、自動(dòng)部署,并且實(shí)現(xiàn)開發(fā)環(huán)境、測(cè)試環(huán)境、運(yùn)維環(huán)境三方環(huán)境的真正同步。本文從 Docker 定義,作用,技術(shù)架構(gòu),安裝和使用等全方位帶你看懂 Docker。

Docker 是啥?

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

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

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

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

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

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

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

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

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

啟動(dòng) docker 容器docker run -d -p 2222:22 --name 容器名 鏡像名-d 守護(hù)容器,就是后臺(tái)運(yùn)行,退出命令窗口容器也不會(huì)停止-it 交互式容器 退出命令窗口容器就停止運(yùn)行了-p 宿主機(jī)端口和容器端口映射8081:80 宿主機(jī)端口: 容器公開的端口

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

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

1、 開發(fā)構(gòu)建鏡像并將鏡像 push 到 Docker 倉庫2、 測(cè)試或者運(yùn)維從 Docker 倉庫拷貝一份鏡像到本地3、 通過鏡像文件開啟 Docker 容器并提供服務(wù)

為啥要用 Docker?能干些啥?

為啥要用 Docker? 這要從目前軟件行業(yè)的痛點(diǎn)來講起 1、軟件更新發(fā)布及部署低效,過程繁瑣且需要人工介入,2、環(huán)境一致性難以保證,3、不同環(huán)境之間遷移成本太高。有了 Docker 可以很大程度解決上面的問題。

首先,Docker 的使用簡(jiǎn)單至極,從開發(fā)的角度來看就是三步走:構(gòu)建,運(yùn)輸,運(yùn)行。其中關(guān)鍵步驟就是構(gòu)建環(huán)節(jié),即打包鏡像文件。但是從測(cè)試和運(yùn)維的角度來看,那就只有兩步:復(fù)制,運(yùn)行。

有了這個(gè)鏡像,那么想復(fù)制到哪運(yùn)行都可以,完全和平臺(tái)無關(guān)了。同時(shí) Docker 這種容器技術(shù)隔離出了獨(dú)立的運(yùn)行空間,不會(huì)和其他應(yīng)用爭(zhēng)用系統(tǒng)資源了以及還不需要考慮應(yīng)用之間相互影響,想想就開心。

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

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

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

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

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

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

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

咱們很多時(shí)候做事情的時(shí)候不會(huì)考慮與事情本身無關(guān)的問題,比如造飛機(jī)的不會(huì)考慮飛機(jī)是否要潛水,對(duì)于我們目前很多移動(dòng)互聯(lián)網(wǎng)的應(yīng)用來說,很少會(huì)涉及到對(duì)操作系統(tǒng)的部分。

其實(shí)我們主要關(guān)心的是應(yīng)用的本身,而 VM 虛擬機(jī)的上層是運(yùn)行的運(yùn)行時(shí)庫和應(yīng)用,整個(gè)虛擬機(jī)的空間是非常的龐大,但是容器化技術(shù) Docker 技術(shù)的出現(xiàn)后,省去了操作系統(tǒng)這一層,多個(gè)容器之間相互隔離且共用了宿主操作系統(tǒng)和運(yùn)行時(shí)庫。

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

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

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

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

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

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

從 Docker 依賴的底層技術(shù)來看,Docker 原生態(tài)是不能直接在 Windows 平臺(tái)上運(yùn)行的,只支持 linux 系統(tǒng),原因是 Docker 依賴 linux kernel 三項(xiàng)最基本的技術(shù)。

namespaces 充當(dāng)隔離的第一級(jí),是對(duì) Docker 容器進(jìn)行隔離,讓容器擁有獨(dú)立的 hostname,ip,pid,同時(shí)確保一個(gè)容器中運(yùn)行一個(gè)進(jìn)程而且不能看到或影響容器外的其它進(jìn)程 ;Cgroups 是容器對(duì)使用的宿主機(jī)資源進(jìn)行核算并限制的關(guān)鍵功能。

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

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

Docker 咋裝呢?Docker 怎么用呢?

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

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

Docker 安裝

通過腳本的方式安裝 docker,非常簡(jiǎn)單。

獲取最新的 docker 安裝包

nicktang@nicktang-virtual-machine:~$ wget -qO- https://get.docker.com/ | sh

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

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

啟動(dòng) docker 后臺(tái)服務(wù)

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

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

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

Docker 使用

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

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

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

鍵入這個(gè)命令的時(shí)候完成了三樣操作:

1、 檢查本地是否有 hello-world 這個(gè)鏡像, 有 ->就跳過第二步 沒有 ->依次執(zhí)行;2、 就自動(dòng)去 docker hub 下載這個(gè)鏡像;3、 就把鏡像加載到容器并且運(yùn)行。

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

Tag 為 latest 就表示是最新版本的 centos 系統(tǒng)鏡像。因?yàn)闀?huì)從 docker hub 拉取沒有的鏡像,所以算【增】里面。

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

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

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

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

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

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

docker inspect -f '{{.NetworkSettings.IPAddress}}' [ID /Name]

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

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

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

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

怎么完成持續(xù)集成、自動(dòng)交付、自動(dòng)部署?

這年頭見面不聊點(diǎn)自動(dòng)化什么的,持續(xù)什么的,都不好意思。所以,咱們也要了解一下持續(xù)集成,自動(dòng)交付,自動(dòng)部署。但是上面說了這么多,沒發(fā)現(xiàn) Docker 有那三樣功能啊,是的,Docker 是沒有這個(gè)功能,但是你在完成上述三樣自動(dòng)化的步驟都是依賴 Docker 的。

Docker 是這些流程實(shí)現(xiàn)的基礎(chǔ),就如同軟件開發(fā),軟件代碼才是根本,開發(fā)工具是輔助。所有搭建一個(gè)完整的自動(dòng)化流程還需要 github+jenkins+ registry 三樣幫助。

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

1、RD 推送代碼到 git 倉庫或者 svn 等代碼服務(wù)器上面,git 服務(wù)器就會(huì)通過 hook 通知 jenkins。

2、jenkine 克隆 git 代碼到本地,并通過 dockerFile 文件進(jìn)行編譯。

3、打包生成一個(gè)新版本的鏡像并推送到倉庫 ,刪除當(dāng)前容器 ,通過新版本鏡像重新運(yùn)行。

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

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

總結(jié)

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

本文講述的 Docker 使用只是 Docker 整個(gè)使用的非常小的一部分,其中最主要的 Docker 鏡像構(gòu)建,就有很多內(nèi)容可以學(xué)習(xí)探索,比如構(gòu)建鏡像需要的 dockerfile 文件。對(duì)于測(cè)試和運(yùn)維,我們只需要懂得如何使用 docker 即可,怎么制作鏡像主要還是由開發(fā)來完成。

(本文轉(zhuǎn)載自騰訊織云,作者唐文廣,騰訊工程師,負(fù)責(zé)無線研發(fā)部地圖測(cè)試。)

轉(zhuǎn)載于:https://www.cnblogs.com/davidwang456/articles/8743644.html

總結(jié)

以上是生活随笔為你收集整理的Docker说了这么多 最全的一篇在这里的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。