溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

對(duì)Docker了解多少?10分鐘帶你從入門操作到實(shí)戰(zhàn)上手

發(fā)布時(shí)間:2020-07-04 14:36:04 來源:網(wǎng)絡(luò) 閱讀:231 作者:沙漏半杯 欄目:編程語言

Docker簡(jiǎn)述

Docker是一種OS虛擬化技術(shù),是一個(gè)開源的應(yīng)用容器引擎。它可以讓開發(fā)者將應(yīng)用打包到一個(gè)可移植的容器中,并且該容器可以運(yùn)行在幾乎所有l(wèi)inux系統(tǒng)中(Windows10目前也原生支持,Win10前需要內(nèi)置虛擬機(jī)),正所謂“一次打包,到處運(yùn)行”。

Docker容器的運(yùn)行是完全的沙箱機(jī)制,相互之間不會(huì)有任何關(guān)聯(lián)(除非自己串聯(lián)集群)。網(wǎng)絡(luò)、存儲(chǔ)、進(jìn)程等資源,不僅對(duì)于不同的容器是相互隔離,對(duì)于宿主機(jī)和容器直接也是隔離的,除非你手動(dòng)映射暴露端口或者掛載存儲(chǔ)卷。

很多人不理解,Docker和虛擬機(jī)到底有什么區(qū)別。

對(duì)Docker了解多少?10分鐘帶你從入門操作到實(shí)戰(zhàn)上手

 

對(duì)Docker了解多少?10分鐘帶你從入門操作到實(shí)戰(zhàn)上手

 

從這兩張結(jié)構(gòu)圖來看,Docker比虛擬機(jī)少了一層虛擬機(jī)操作系統(tǒng),Docker的應(yīng)用直接Docker引擎上運(yùn)行。由于虛擬機(jī)需要一層操作系統(tǒng),所以會(huì)導(dǎo)致虛擬機(jī)的體積非常大,通常在幾G到十幾G之間。并且通常一個(gè)虛擬機(jī)上,不只一個(gè)應(yīng)用,因此對(duì)于整體的虛擬集群管理并不太友好,比較難做到靈活分配。而一個(gè)Docker鏡像的體積大約在幾十M到幾百M(fèi)之間,一般一個(gè)鏡像只打包一個(gè)應(yīng)用,由多個(gè)鏡像組成一個(gè)完整的項(xiàng)目,并且鏡像易于復(fù)制,可以跨平臺(tái)運(yùn)行,這樣可以使項(xiàng)目的部署管理有更好的靈活性。所以Docker無論從資源消耗上、管理上、使用上都在虛擬機(jī)之上,因此我們又有何理由不使用這樣的容器化技術(shù)呢?

對(duì)于容器化技術(shù)的學(xué)習(xí),可謂是深如海。從基本的鏡像、容器操作,到鏡像的打包、容器的部署,再到企業(yè)生產(chǎn)級(jí)的容器集群管理技術(shù)(Docker官方的Swarm、Google的Kubernetes),如此多的內(nèi)容,并不是所有人技術(shù)人員都能一朝學(xué)會(huì)。不過除了生產(chǎn)級(jí)別的集群管理技術(shù)有難度意外,其他內(nèi)容從學(xué)習(xí)使用的角度來說,其實(shí)是非常簡(jiǎn)單的,況且K8s這種東西,對(duì)于普通開發(fā)來說也是很少能接觸到。

說到這里,可能還有很多人覺得這個(gè)是公司層面、運(yùn)維層面的操作,不是很了解Docker對(duì)于普通開發(fā)來說,意味著什么,對(duì)我們有什么好處?

  • 多辦公環(huán)境,一鍵部署。假如你在公司一套開發(fā)環(huán)境,在家一套開發(fā)環(huán)境,當(dāng)你公司的開發(fā)環(huán)境變更時(shí),在家的環(huán)境就要跟著變,如果是使用Docker,將一些依賴型的應(yīng)用,如Redis、ZK、Mysql等邊緣服務(wù)都打包在docker里面。無論你在哪里改變了內(nèi)容,只要在運(yùn)行時(shí)更新下鏡像,就可以按照最新的內(nèi)容去執(zhí)行了,不需要一個(gè)手動(dòng)去安裝,適配。

  • 聯(lián)調(diào)測(cè)試,無需依賴他人。當(dāng)后端完成對(duì)外的接口后,將后端應(yīng)用打包進(jìn)docker,這樣無論是前端、測(cè)試,在何地何時(shí)都可以自己把容器啟動(dòng)起來進(jìn)行聯(lián)調(diào)測(cè)試,而不需要自己手動(dòng)一步步地搭建這個(gè)后端環(huán)境。

  • ...

下面就來一步步講解下,普通開發(fā)所需要的Docker知識(shí)。

概念介紹

學(xué)習(xí)Docker首先要了解下幾個(gè)基礎(chǔ)概念:

  • 宿主機(jī),Host,運(yùn)行Docker所在的物理機(jī),是Docker運(yùn)行的系統(tǒng)環(huán)境。

  • 鏡像,Image,相當(dāng)于一個(gè)程序模板,通過這個(gè)模板可以生成很多個(gè)相似的容器??梢岳斫鉃镴ava中的類,它本身不具備執(zhí)行運(yùn)行的能力,是一個(gè)對(duì)象抽象的模板。每個(gè)鏡像可以有多個(gè)版本,用tag來區(qū)分。鏡像可以通過Dockerfile來構(gòu)建。

  • 容器,Container,Docker運(yùn)行的最小單位對(duì)象。它是通過鏡像實(shí)例化出來的一個(gè)可運(yùn)行對(duì)象。容器的修改,可以提交反作用于鏡像,更新這個(gè)容器的模板。

  • 倉庫,Repository,用于存儲(chǔ)管理鏡像的倉庫,類似于git管理代碼的倉庫一樣,可以管理多版本的鏡像。

鏡像、容器、倉庫的關(guān)系如下:

對(duì)Docker了解多少?10分鐘帶你從入門操作到實(shí)戰(zhàn)上手

 

一句話總結(jié)就是,從倉庫中拉取鏡像,利用鏡像生成容器?;静僮?/h2>

了解完Docker的基本概念,我們開始來開始學(xué)習(xí)下入門操作。此處省略所有的Docker安裝過程,自己去官網(wǎng)下載就行了,基本是傻瓜式安裝。

拉取鏡像

通過docker pull ${image_uri}:${image_tag}命令,可以從遠(yuǎn)程倉庫(默認(rèn)是Docker Hub)中拉取所需要的鏡像。

在Docker Hub的網(wǎng)站上可以搜索下自己需要的鏡像以及版本。例如Ubuntu,上面提供了幾個(gè)版本。

對(duì)Docker了解多少?10分鐘帶你從入門操作到實(shí)戰(zhàn)上手

 

我們拉一下16.04版本的ubuntu鏡像。然后通過docker images命令,查看保存在本地鏡像,發(fā)現(xiàn)多了一個(gè)ubuntu的鏡像。

對(duì)Docker了解多少?10分鐘帶你從入門操作到實(shí)戰(zhàn)上手

 

容器創(chuàng)建、啟動(dòng)、停止、登入

有了鏡像以后,就可以通過docker run -it ${image_id}創(chuàng)建啟動(dòng)一個(gè)容器了。

image_id是鏡像的id,通過docker images能查看到,也可以是鏡像名(REPOSITORY:TAG)。

-it可以讓你在啟動(dòng)后,連上容器的終端。連上終端后,就可以在里面隨意操作容器里面的內(nèi)容了。

對(duì)Docker了解多少?10分鐘帶你從入門操作到實(shí)戰(zhàn)上手

 

exit退出容器后,容器就會(huì)自動(dòng)停止了。但是這個(gè)容器依然還存在,只是”關(guān)機(jī)“了。(可以通過ctrl+p,ctrl+q,退出容器登入,而不關(guān)閉容器)

通過docker ps -a可以看到我們的容器已經(jīng)Exited了。

對(duì)Docker了解多少?10分鐘帶你從入門操作到實(shí)戰(zhàn)上手

 

通過docker start ${container_id},我們把這個(gè)容器再次啟動(dòng)。通過docker ps(加上*-a包含顯示未啟動(dòng)的容器),可以看到容器的狀態(tài)為UP*。

對(duì)Docker了解多少?10分鐘帶你從入門操作到實(shí)戰(zhàn)上手

 

同理,我們可以通過docker stop ${container_id}來停止容器,

在用docker start命令的時(shí)候,如果不加上*-a*參數(shù),默認(rèn)不會(huì)連接上容器的。不過我們可以在start后,通過docker attach ${container_id}來登入容器。

對(duì)Docker了解多少?10分鐘帶你從入門操作到實(shí)戰(zhàn)上手

 

通過以上的基本操作,你基本可以利用docker當(dāng)作一個(gè)虛擬機(jī)來使用了。如果想把容器和虛擬機(jī)的網(wǎng)絡(luò)、存儲(chǔ)打通,可以網(wǎng)上搜下了解下網(wǎng)絡(luò)與卷掛載等容器設(shè)置。

更新鏡像

在上面的例子中,我們pull下來的僅僅是一個(gè)ubuntu的原始鏡像,并沒有過多的內(nèi)容。下面我們?cè)谶@個(gè)鏡像的容器里面,安裝一個(gè)jdk。

對(duì)Docker了解多少?10分鐘帶你從入門操作到實(shí)戰(zhàn)上手

 

這樣我們的容器里面就有一個(gè)jdk了,但是如果我們?cè)儆眠@個(gè)ubuntu原始鏡像再創(chuàng)建一個(gè)容器,它是不會(huì)用這個(gè)jdk的。所以我們就需要把這個(gè)容器的內(nèi)容,提交到鏡像當(dāng)中。通過docker commit ${container_id} ${repository}:${tag},在本地將容器內(nèi)容提交到鏡像當(dāng)中。然后就可以擁有一個(gè)帶jdk的ubuntu鏡像了。

對(duì)Docker了解多少?10分鐘帶你從入門操作到實(shí)戰(zhàn)上手

 

后面我們就可以利用這個(gè)鏡像,生成帶jdk的容器了。以上的更新僅限于在本地的鏡像,如果想把容器推送到云端就需要用docker push命令。前提是你已經(jīng)登錄了倉庫擁有權(quán)限。

鏡像倉庫

上面提到,默認(rèn)情況下,倉庫是用Docker Hub。我們pull 和push都是在Docker hub上操作,但是如果鏡像是內(nèi)部私有使用的話,沒有必要去使用Docker Hub,一個(gè)是網(wǎng)絡(luò)慢,另一個(gè)是私有安全性問題。

針對(duì)以上問題,有兩種解決方法,一個(gè)是自己搭建私有服務(wù),另一個(gè)是用云服務(wù)的鏡像管理平臺(tái)(如阿里云的“容器鏡像服務(wù)”)。前者對(duì)于一般開發(fā)者來說并沒有必要,而且還要搞認(rèn)證的,比較麻煩,這里不細(xì)說。下面介紹下如何用阿里云服務(wù)作為自己的私有倉庫。

先在阿里云上創(chuàng)建一個(gè)鏡像倉庫,獲得一個(gè)倉庫地址,如registry.cn-shenzhen.aliyuncs.com/zackku/jdk。這里一個(gè)倉庫地址,對(duì)應(yīng)一種鏡像(tag不同)。

利用docker login,先對(duì)阿里云的服務(wù)進(jìn)行登錄。

對(duì)Docker了解多少?10分鐘帶你從入門操作到實(shí)戰(zhàn)上手

 

然后對(duì)上面的jdk鏡像打tag(其實(shí)也是改倉庫源的過程)

對(duì)Docker了解多少?10分鐘帶你從入門操作到實(shí)戰(zhàn)上手

 

最后把鏡像推送到阿里云就行了。

對(duì)Docker了解多少?10分鐘帶你從入門操作到實(shí)戰(zhàn)上手

 

推送后,就能在阿里云的倉庫上看到這個(gè)鏡像。

對(duì)Docker了解多少?10分鐘帶你從入門操作到實(shí)戰(zhàn)上手

 

通過搭建私有倉庫,我們就可以完全拋開宿主機(jī)的環(huán)境,構(gòu)建好一個(gè)鏡像,就可以到處運(yùn)行了。

Dockerfile構(gòu)建鏡像

從上面介紹,我們已經(jīng)了解到,如何從拉取一個(gè)鏡像、修改容器內(nèi)容、提交鏡像去構(gòu)建一個(gè)我們所需要的鏡像。但通過這些操作去構(gòu)建一個(gè)鏡像,一個(gè)是太繁瑣,另一個(gè)問題是不清晰,沒辦法直觀的了解鏡像的構(gòu)成。

Dockerfile就可以很好的解決該問題。它可以通過編寫一個(gè)構(gòu)建過程,來一站式構(gòu)建鏡像。下面同樣以u(píng)buntu為基礎(chǔ)鏡像,安裝jdk構(gòu)建一個(gè)新鏡像為例,看看Dockerfile是怎么寫的。

對(duì)Docker了解多少?10分鐘帶你從入門操作到實(shí)戰(zhàn)上手

 

然后執(zhí)行docker build -t registry.cn-shenzhen.aliyuncs.com/zackku/jdk2:1.0 .就能把鏡像構(gòu)建出來了。

對(duì)Docker了解多少?10分鐘帶你從入門操作到實(shí)戰(zhàn)上手

 

Dockerfile高級(jí)技巧

上面是Dockerfile的基本使用,但實(shí)際情況下我們并不像(或者說不僅是)上面描述那樣去構(gòu)建鏡像。下面介紹兩個(gè)常用的使用原則。

分層構(gòu)建。其實(shí)Docker的鏡像是分層結(jié)構(gòu)的,看回之前推送到遠(yuǎn)端倉庫的例子。

對(duì)Docker了解多少?10分鐘帶你從入門操作到實(shí)戰(zhàn)上手

 

紅框里面就是鏡像一層層的提交,如果這層已經(jīng)本地構(gòu)建過了,下次不需要構(gòu)建了,同理如果遠(yuǎn)端已經(jīng)有這層了,也不需要推送這層。而且這種分層是可以在不同鏡像間共享的,例如不同的Java項(xiàng)目都是依賴于JDK的運(yùn)行環(huán)境,那么它們就可以共用JDK這層鏡像內(nèi)容。所以,基于這樣的特性,我們就應(yīng)該要分層去構(gòu)建鏡像,抽象鏡像共同點(diǎn)。具體操作的話,我們大致可以去分兩次構(gòu)建鏡像,先構(gòu)建一個(gè)base鏡像,用于不同鏡像的底層,例如Java項(xiàng)目的所有基礎(chǔ)運(yùn)行環(huán)境,然后再通過base鏡像,構(gòu)建develop表層的應(yīng)用鏡像。相當(dāng)于把應(yīng)用程序打包丟到develop層里面。并且這層要告訴Docker是怎么運(yùn)行程序的。

盡量構(gòu)建小的base層。鏡像的體積也是在使用Docker的時(shí)候要考慮的一個(gè)重要因素,因?yàn)槿绻R像的體積過大,在更新鏡像,拉取鏡像的時(shí)候效率會(huì)低。尤其在剛剛所說的base層里面,如果base層做得太大太臃腫,里面程序過多,不僅僅體積大,還會(huì)讓CPU、網(wǎng)絡(luò)等資源消耗過大。其實(shí)我們?cè)谟肈ocker的時(shí)候,一般是一個(gè)容器只包含一個(gè)程序項(xiàng)目,關(guān)于這個(gè)程序的監(jiān)控、健康等內(nèi)容,在容器外通過k8s等集群管理去做,所以容器本身只需要保證自己的程序能夠運(yùn)行起來就行了。

至于上面我用ubuntu作為基礎(chǔ)的操作系統(tǒng)是比較多余的,這里推薦只用apline操作系統(tǒng)作為程序的最底層鏡像,它是一款輕型的Linux發(fā)行版,系統(tǒng)體積與運(yùn)行時(shí)的資源消耗都相當(dāng)?shù)?,十分適合用于Docker容器?;赼pline的操作系統(tǒng),我們?cè)谏厦嫣砑幼约核枰沫h(huán)境,例如安裝一個(gè)Tomcat、JDK等,從而構(gòu)建一個(gè)base的鏡像。

上所說的base鏡像,其實(shí)不太需要自己的寫一層Dockfile,docker官方就直接提供了各種語言、環(huán)境的基礎(chǔ)鏡像,在github的docker-library里面。如果再有自己的團(tuán)隊(duì)的運(yùn)行環(huán)境的要求,可以在這個(gè)Dockerfile基礎(chǔ)上去添加修改即可,或者再抽象多一層。

至于Dockfile怎么寫,語法是什么,網(wǎng)上有大把詳細(xì)的說明,由于篇幅問題,不在這里展開。

docker-compose啟動(dòng)集群

前面已經(jīng)介紹完一個(gè)單獨(dú)的容器是如何構(gòu)建與啟動(dòng)的了,但我們的項(xiàng)目往往不是只有一個(gè)容器的,把所有程序打包在一個(gè)容器不是正確的做法。所以我們?cè)趺慈ス芾韱?dòng)這么多的容器,是一個(gè)必修的課題。在企業(yè)級(jí)的層面,有K8S,Swarm這種容器編排的管理工具,但稍微比較復(fù)雜,個(gè)人使用的話也沒有太大必要。

這里推薦用Docker官方的docker-compose,它可以把所有的容器編排方式寫在一個(gè)文件里,然后通過docker-compose up命令,就可以把一套的容器按照你的編排全部啟動(dòng)起來。

對(duì)Docker了解多少?10分鐘帶你從入門操作到實(shí)戰(zhàn)上手

 

在這個(gè)例子的services包含每個(gè)容器的配置,其中的redis、mongodb用的是默認(rèn)的鏡像、默認(rèn)的配置,myproject是我們自己的項(xiàng)目。通過這樣的編排,我們就能讓我們的項(xiàng)目連上redis和mongodb。最后通過docker-compose up就會(huì)自動(dòng)拉取鏡像,按照編排跑起來了。

具體的語法也不贅述,關(guān)鍵就是容器的卷掛載,網(wǎng)絡(luò)的配置,端口的暴露,容器的依賴關(guān)系。如果把這套東西用起來,慢慢自然就會(huì)了解,重要的是動(dòng)手去做一遍,嘗試一下。


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI