1、Docker是什么
這個有著萌萌海豚l(xiāng)ogo的開發(fā)工具就是我們今天的C位大佬——Docker,我們先來看一下網(wǎng)上關(guān)于Docker的定義:
“?Docker 是一個開源的應(yīng)用容器引擎,讓開發(fā)者可以打包他們的應(yīng)用以及依賴包到一個可移植的容器中,然后發(fā)布到任何流行的Linux機器上,也可以實現(xiàn)虛擬化,容器是完全使用沙箱機制,相互之間不會有任何接口。”
看不懂吧?看不懂就對了!哈哈哈哈哈哈哈,感受一下來自程序員的嘲諷!
看不懂的原因主要是因為這里引入了一個新的概念:容器。剛開始很多人會把容器和傳統(tǒng)虛擬機的概念弄混,很多人應(yīng)該都使用過虛擬機,每臺虛擬機都有自己完整的用戶操作系統(tǒng),虛擬機一旦開啟,預(yù)分配給它的資源會被全部占用,而容器是我們和宿主機共享硬件資源及操作系統(tǒng),可以實現(xiàn)資源的動態(tài)分配。
簡單來說,容器技術(shù)是實現(xiàn)操作系統(tǒng)虛擬化的一種途徑,可以讓我們在資源受到隔離的進(jìn)程中運行應(yīng)用程序極其依賴關(guān)系。
而Docker就可以幫助我們將開發(fā)的應(yīng)用程序,以及該程序的依賴包都打包在一個文件里。運行這個文件,就會生成一個虛擬容器。當(dāng)我們將這個程序在虛擬容器里運行時,就跟在真實的物理機器上運行效果是一樣的。
總體來說,Docker可以讓用戶方便的創(chuàng)建和使用容器,把自己的應(yīng)用程序放在容器里運行,可以實現(xiàn)環(huán)境一致性、提升運營效率以及開發(fā)人員的生產(chǎn)力。它還可以幫助我們進(jìn)行版本管理、復(fù)制、分享、修改,就像管理普通的代碼一樣。
我們可以從下面這張表格很清楚地看到容器相比于傳統(tǒng)虛擬機的特性的優(yōu)勢所在:
2、為什么要使用docker?
簡單介紹了容器和虛擬機的概念后,我們就可以大概的總結(jié)出Docker的以下幾點優(yōu)勢:
(1)可以幫助我們靈活方便的安裝應(yīng)用,搭建環(huán)境,部署應(yīng)用。
(2)相比于傳統(tǒng)的虛擬化方式,它節(jié)省系統(tǒng)資源開銷,幾乎沒有性能損耗,而且啟動快速,所占內(nèi)存極小,更輕量,可以讓你騰出更多的硬盤空間存放小電影兒。在相同的硬件環(huán)境下,Docker運行的鏡像數(shù)目遠(yuǎn)多于虛擬機數(shù)量,對系統(tǒng)的利用率極高。
(3)靈活的遷移你開發(fā)的應(yīng)用程序,它可以保證應(yīng)用程序快速、可靠、一致性的部署,而且不受部署環(huán)境的影響,我們就不用再擔(dān)心環(huán)境的問題。
(4)最后也是大家最關(guān)心的一點,直接跟我們的錢包掛鉤。學(xué)會docker可以讓自己在求職應(yīng)聘中更有競爭力,目前Docker在國內(nèi)互聯(lián)網(wǎng)行業(yè)的發(fā)展形勢一片大好,特別是在一線公司,Docker的使用已經(jīng)十分普遍,甚至成了企業(yè)面試的加分項。在很多開發(fā)工程師招聘需求中,都會要求熟悉Docker的使用。
目前網(wǎng)絡(luò)上有很多Docker的優(yōu)秀教程,但是有很多都是原理性的東西,我自己也是看的云里霧里,對于初學(xué)者而言還是很難理解的,下面我就從初級前端開發(fā)工程師的角度,簡單總結(jié)一下使用Docker部署mongodb數(shù)據(jù)庫并且開啟遠(yuǎn)程連接,希望通過這個小案例,能啟發(fā)你學(xué)習(xí)docker的興趣,帶你初步認(rèn)識一下這個強大的開發(fā)工具。
Docker 的三個基本概念
Image(鏡像)
Container(容器)
Repository(倉庫)
Image(鏡像)
不理解什么是鏡像?沒關(guān)系,不理解就不理解吧,繼續(xù)往下看。
(別問我為什么不解釋,讓我們保留一些真誠和羞射)
Docker Container
Docker 容器就是 Docker 鏡像的運行實例,是真正運行項目程序、消耗系統(tǒng)資源、提供服務(wù)的地方。
Docker 提供了一套簡單實用的命令來創(chuàng)建和更新鏡像,我們可以通過網(wǎng)絡(luò)直接下載一個已經(jīng)創(chuàng)建好了的應(yīng)用鏡像,并通過 Docker RUN 命令就可以直接使用。
當(dāng)鏡像通過 RUN 命令運行成功后,這個運行的鏡像就是一個 Docker 容器啦。
容器可以理解為一個輕量級的沙箱,Docker 利用容器來運行和隔離應(yīng)用,容器是可以被啟動、停止、刪除的,這并不會影響 Docker 鏡像。
Repository(倉庫)
Docker 倉庫是集中存放鏡像文件的場所。鏡像構(gòu)建完成后,可以很容易的在當(dāng)前宿主上運行。
但是, 如果需要在其他服務(wù)器上使用這個鏡像,我們就需要一個集中的存儲、分發(fā)鏡像的服務(wù),Docker Registry(倉庫注冊服務(wù)器)就是這樣的服務(wù)。
有時候會把倉庫(Repository)和倉庫注冊服務(wù)器(Registry)混為一談,并不嚴(yán)格區(qū)分。
Docker 倉庫的概念跟我們之前學(xué)習(xí)過的Git 類似,倉庫注冊服務(wù)器(Registry)可以理解為 GitHub 這樣的托管服務(wù)。
實際上,一個 Docker Registry 中可以包含多個倉庫(Repository),每個倉庫可以包含多個標(biāo)簽(Tag),每個標(biāo)簽對應(yīng)著一個鏡像。
所以說,鏡像倉庫是 Docker 用來集中存放鏡像文件的地方,類似于我們之前常用的代碼倉庫。
我們在本地運行 docker push、docker pull、docker search這些命令 時,實際上是通過 Docker Daemon 與 Docker Registry 通信。
鏡像是 Docker 運行容器的前提,倉庫是存放鏡像的場所,可見鏡像更是 Docker 的核心。
3、安裝Docker
吹了半天終于開始進(jìn)入正題,首先讓我們登錄它的官網(wǎng)
https://www.docker.com/?
這里忍不住想給Docker的設(shè)計團(tuán)隊瘋狂打電話,它的官網(wǎng)是我目前見到的所有開發(fā)工具網(wǎng)站中視覺效果最棒,交互最流暢的一個。整體給人一種非常清新快速的感覺,很契合這個工具的功能和理念,第一眼就愛上了,像極了愛情。
點擊【Learn more】查看它的詳細(xì)介紹
點擊【Start a free trail】創(chuàng)建一個免費賬戶?
創(chuàng)建好賬戶登錄,點擊右側(cè)【Download Desktop and Take a Tutorial】
進(jìn)入https://hub.docker.com/,點擊【Get start with Docker Desktop】進(jìn)入下載頁。
按照自己的操作系統(tǒng),選擇相應(yīng)的版本下載安裝到本地。它這上面還很溫馨的給你提供了一些小的教程,按照左側(cè)五個步驟一步一步來就會get Docker的基本操作。
下載安裝好后在電腦的右上角就會出現(xiàn)萌萌的小海豚標(biāo)志。
打開終端執(zhí)行docker -v命令查看當(dāng)前安裝的docker版本,當(dāng)打印輸出:Docker version 18.09.2, build 6247962(版本號),就表示已經(jīng)安裝成功并且可以使用了。
我們在Docker官網(wǎng)中的這個頁面上查看Docker支持的所有鏡像,可以看到我們常用的nodejs、mySQL、mongoDB、PHP都有提供。
https://hub.docker.com/search?image_filter=official&type=image?
點擊進(jìn)入相應(yīng)頁面查看現(xiàn)有的鏡像版本
接下來就要引入另一位大佬mongoDB數(shù)據(jù)庫,在沒有遇到Docker之前,安裝mongoDB的過程都可以寫一本辛酸史了,自己折騰了一頓不但沒有安裝好還把環(huán)境變量改亂了(這里給各位個貼心小tip:修改重要參數(shù)之前一定要備份!一定要備份!一定要備份?。颂幰貏e感謝我的大學(xué)好友,是她告訴我了Docker這個神器,保住了我日漸后移的發(fā)際線,有了Docker之后整個過程如絲般順滑,省去了配置.bash_profile等等一系列繁瑣的環(huán)節(jié)。
由于Docker的服務(wù)器在國外,為了保證我們接下來的下載體驗更酸爽,在開始之前先獲取一個國內(nèi)的鏡像,這里再吹一波馬云爸爸,阿里云真香!
點開
https://cr.console.aliyun.com/?spm=5176.100239.blogcont29941.12.eyc9rO#/accelerator
注冊賬號,登錄?
在左上角漢堡包導(dǎo)航中找到產(chǎn)品與服務(wù)——彈性計算——容器鏡像服務(wù)。
再選擇最下面的菜單欄,鏡像加速器,在左側(cè)頁面選擇你對應(yīng)操作系統(tǒng),默認(rèn)是Ubuntu,剛開始我看了半天沒看懂,不禁開始懷疑人生。誰能想到這個設(shè)計的不像選項卡的選項卡還是可以點擊的呢。Mac和Windows系統(tǒng)的自己手動切換一下。?
我們剛才已經(jīng)安裝好了Docker,所以直接按照網(wǎng)站上寫的下列步驟操作就可以啦。(我這里寫的是Mac系統(tǒng)的操作步驟,可以看到阿里云官網(wǎng)也是默認(rèn)推薦使用Docker的?。。。?/p>
針對安裝了Docker for Mac的用戶,您可以參考以下配置步驟:
右鍵點擊桌面頂欄的 docker 圖標(biāo),選擇 Preferences ,在 Daemon 標(biāo)簽(Docker 17.03 之前版本為 Advanced 標(biāo)簽)下的 Registry mirrors 列表中將
https://8p0vcewm.mirror.aliyuncs.com加到"registry-mirrors"的數(shù)組里,點擊 Apply & Restart按鈕,等待Docker重啟并應(yīng)用配置的鏡像加速器。
在docker中配置好鏡像文件后我們再回到終端中執(zhí)行docker pull mongo命令,將mongoDB數(shù)據(jù)庫的鏡像加載到我們本地。默認(rèn)會給你下載最新的版本,如果需要特定的版本號,在該命令后加冒號,后面寫版本號,例如:docker pull mongo:3.6,下載3.6版本的mongoDB數(shù)據(jù)庫。
mySQL數(shù)據(jù)庫最新版本會有一些功能不穩(wěn)定的情況,建議不要安裝最新版本,而mongoDB不會,所以直接執(zhí)行docker pull mongo下載就可以了。
運行docker images查看我們拉取到本地的所有鏡像, TAG顯示當(dāng)前版本信息。
如果想移除鏡像只需要運行docker rmi mongo:版本號就可以了
下載好mongoDB鏡像后我們再運行一下docker run --name some-mongo -p 27017:27017 -d mongo
這條命令會用 mongodb 鏡像啟動一個容器,命名為 some-mongo ,并且映射了 27017端口。
如果你不暴露27017的端口號在node.js中連接的時候會報這個錯誤,提示你找不到這個端口號。
啟動容器后運行docker ps -a查看所有啟動的容器,確保容器的STATUS不是處于Exited阻塞狀態(tài),如果處于阻塞狀態(tài)需要運行docker restart容器ID或容器名來重新啟動。停止一個容器的命令是docker stop容器ID或容器名。
查看自己的容器啟動好之后就可以運行docker exec -it some-mongo bash命令,然后輸入mongo就可以優(yōu)雅地連接mongoDB數(shù)據(jù)庫了。
Docker 常用命令
我們可以通過 docker -h 去查看命令的詳細(xì)的幫助文檔。在這里我整理一些日常我們可能會用的比較多的一些命令。
docker pull image_name?:拉取一個 Docker 鏡像
docker images?:查看主機下存在的鏡像
docker ps -a?:查看當(dāng)前容器的運行狀態(tài)(-a 是查看當(dāng)前所有的容器,包括未運行的)
docker restart 容器名或ID:重啟容器
docker stop?容器名或ID:停止容器
docker rmi image_name?:刪除鏡像(先停止容器)
好了,以上就是初步接觸Docker的一點心得體會,簡單整理分享,祝各位食用愉快!