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

看完這篇,媽媽還會擔心你Docker入不了門?

原創(chuàng)
云計算
相信剛開始接觸 Docker 的你跟我也一樣,看了幾遍都很懵逼!沒關(guān)系,看完全文再回頭看這段話,或許就有不一樣的體會了!

【51CTO.com原創(chuàng)稿件】上周對象突然心血來潮說想養(yǎng)個小寵物,我問想養(yǎng)啥她又說隨便,你看著辦?。?!

這我真的比較難辦啊!但是咱們程序員能有個對象就不錯了,還不趕緊寵著,我只能照辦咯!

我去到了一家寵物店,半天也沒有找到合適的目標。正在我猶豫彷徨之時,看到了老板門口魚缸里面的金魚游來游去還挺順眼!

于是我問老板:

 

 

我:老板,金魚多少錢?

老板:加魚缸一起 100 塊錢不講價!

我:這...便宜一點咯!

老板:小伙子看你骨骼驚奇,定是個養(yǎng)魚的奇才,2 塊錢賣給你吧!但是魚缸可不能給你!

我:那,你幫我打包一條吧,幫我拿個袋子裝著就好了!

 

于是我興高采烈的拎著小金魚就回家了,找了個大罐子養(yǎng)著!對象看到我買的小金魚后露出了幸福的笑容~

第二天早上對象把我從睡夢中搖醒:“嚶嚶嚶,人家的小魚動不了了,你賠~~~ ”。

于是我很憤怒的跑去寵物店找老板索賠:

 

 

我:你們家賣的魚有問題,回去就不行了!

老板:不可能,昨天在我們這都活蹦亂跳的!

我:就是你們家的魚有問題!

老板:肯定是你自己買的魚缸有問題!

我:手持兩把錕斤拷,口中疾呼燙燙燙。

老板:腳踏千朵屯屯屯,笑看萬物锘锘锘?

 

這一幕,似曾相識!像極了我們在開發(fā)中的場景:

 

 

測試:xx,你的代碼在生產(chǎn)環(huán)境上運行有問題。

我:不可能,我本地都運行得好好的。

測試:你自己上生產(chǎn)環(huán)境上看。

我:我不看,我的代碼在本地沒問題,肯定是運維的鍋,你去找運維!

 

或許很多開發(fā)人員都有過上面的經(jīng)歷,程序在本地運行都很正常,一上到生產(chǎn)環(huán)境就崩了。

這是因為程序跟小金魚一樣也會“水土不服”!而導致程序水土不服的原因一般就是環(huán)境和配置的差異!

加上現(xiàn)在互聯(lián)網(wǎng)高并發(fā)、大流量的訪問,一個應(yīng)用往往需要部署到集群的多臺機器上,并且集群擴容縮容的需求也比較頻繁。

如果按照傳統(tǒng)的方式部署,那每一臺服務(wù)器上都需要裝各種軟件...然后進行各種配置...我仿佛看到了“工作 996,生病 ICU”在向運維工程師招手!

那有沒有一種方案不僅能屏蔽環(huán)境的差異,并且還能快速部署呢?

既然“水土不服”那我把程序及整個“水土”都打包遷移,就看你服不服。而 Docker 就是這樣的一種讓你服技術(shù)!

昂,上面的對象是我自己 New 的(* ̄︶ ̄).

 

 

Hello Docker

 

 

 

Docker 是什么呢?百度百科是這樣跟我說的:

 

 

Docker 是一個開源的應(yīng)用容器引擎,讓開發(fā)者可以打包他們的應(yīng)用以及依賴包到一個可移植的鏡像中,然后發(fā)布到任何流行的 Linux 或 Windows 機器上,也可以實現(xiàn)虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口。


 

這段話已經(jīng)很概括的描述了 Docker 是什么,Docker 能干嘛,Docker 的基本特性!

相信剛開始接觸 Docker 的你跟我也一樣,看了幾遍都很懵逼!沒關(guān)系,看完全文再回頭看這段話,或許就有不一樣的體會了!

我們先看看 Docker 官方給出的“定妝照”:

看完這篇,媽媽還會擔心你Docker入不了門?

如果非要我用一句話描述這張圖片,還在上幼兒園的我會說:“一條可愛的鯨魚背著多個集裝箱,暢游在大海里 ”!

而現(xiàn)在我會說:“Docker 是一個運行在操作系統(tǒng)上的軟件,這個軟件上面可以運行多個相互隔離的容器”!

不同的表述,同一個意思!這條可愛的鯨魚就是咱們的 Docker,而大海就是我們的操作系統(tǒng),多個集裝箱就是在 Docker 上運行的容器!什么是容器咱們后面會說~

假如你想漂洋過海來看我,你可以選擇自己造一條船,這樣你就得自己備足很多干糧,還得準備很多其他的必需品才能出發(fā)!

但是現(xiàn)在有一條鯨魚游過來對你說,我這里有很多集裝箱,里面有你所需要的一切,你選一個適合你的進來就可以了,我會帶你乘風破浪的!

看到這里,你是否對 Docker 有個初步的印象了呢?至少知道了:

  • Docker 是什么?

  • 為什么需要 Docker?

 

 

與傳統(tǒng)虛擬機對比


 

前面我們說過 Docker 可以實現(xiàn)虛擬化,那 Docker 與我們平時用的虛擬機有什么區(qū)別和聯(lián)系呢?

在那些年我們還買不起云服務(wù)器的時候,如果我們想學 Linux 那就得先安裝一個創(chuàng)建虛擬機的軟件。

然后在軟件上面創(chuàng)建虛擬機,再分配內(nèi)存、分配磁盤、安裝 Linux 操作系統(tǒng)等等一系列的操作,最后等個分把鐘讓虛擬機運行起來~

為什么傳統(tǒng)虛擬機啟動會那么慢呢?因為傳統(tǒng)虛擬機技術(shù)是虛擬出一套硬件后,在其上面運行一個完整的操作系統(tǒng),然后在該系統(tǒng)上面再運行所需要的應(yīng)用程序,并且虛擬機的資源需要提前分配,一旦分配這些資源將全部被占用。

但是 Docker 容器內(nèi)的應(yīng)用程序是直接運行于宿主的內(nèi)核,容器沒有自己的內(nèi)核,更加不會對硬件進行虛擬。

因此 Docker 容器比傳統(tǒng)的虛擬機更為輕便!但是 Docker 容器技術(shù)也是參考虛擬機一步一步的迭代優(yōu)化過來的!

我們來看看官方給出的 Docker 容器和傳統(tǒng)虛擬機的對比圖:

看完這篇,媽媽還會擔心你Docker入不了門?

圖中也能看出來,Docker 就是一個運行在操作系統(tǒng)上的軟件!

以后如果想在 Windows 上面學習 Linux,只需要在本地安裝一個 Windows 版本的 Docker,然后看完本文的剩下的部分,就能輕輕松松的玩轉(zhuǎn) Linux 啦!

不過在 Windows 上安裝 Docker 也需要先安裝一個虛擬機~

 

 

基本組成要素


 

前面對 Docker 的基本概念有了個大致印象,但是到目前為止,可能你對 Docker 的認識還比較空泛,那下面部分我們就從 Docker 的基本組成要素來更深入的走進 Docker!Docker 是一個 Client-Server 的結(jié)構(gòu)!

先看看官網(wǎng)給出的架構(gòu)圖:

看完這篇,媽媽還會擔心你Docker入不了門?

這張圖里面概括了 Docker 的所有的元素!我們就逐一分析 Docker 客戶端、Docker 服務(wù)、倉庫、鏡像、容器等概念!

 

 

Docker 客戶端

 

最左邊是 Docker 的客戶端,類似我們操作 MySQL 的工具 Navcat,只不過我們這里的是沒有圖形化界面的命令終端。

Docker 客戶端是用戶與 Docker 服務(wù)交互的窗口!我們能看到圖中就是各種操作的命令!

 

 

Docker 服務(wù)

 

中間的是 Docker 后臺運行的服務(wù),一個稱為 Docker Daemon 的守護進程??梢岳斫鉃槲覀?MySQL 的服務(wù),我們的操作命令都是在這部分進行處理!

Docker Deamon 監(jiān)聽著客戶端的請求,并且管理著 Docker 的鏡像、容器、網(wǎng)絡(luò)、磁盤(圖中只列出了鏡像與容器)等對象。

同樣,Docker 的客戶端與服務(wù)可以運行在同一機器上,也可以用某臺機器上的客戶端遠程連接另一臺機器上的 Docker 服務(wù),這跟我們的 MySQL 一樣的呢。

 

 

 

 

 

 

倉庫

 

 

 

 

 

 

右邊部分是注冊倉庫,在遠古時代做開發(fā)的都知道,我們以前需要一個第三方包的時候需要去網(wǎng)上下載對應(yīng)的 Jar 包,很麻煩不說,還容易下的包是不穩(wěn)定的版本。

有了 Maven 之后,我們只要在 Maven 配置文件中引入對應(yīng)的依賴,就可以直接從遠程倉庫中下載對應(yīng)版本的 Jar 包了。

Docker 中的倉庫與 Maven 的倉庫是一個概念,可以遠程下載常用的鏡像,也可以 Push 包到遠程倉庫(如圖中的 Redis、Nginx 等鏡像),同一個鏡像又可以有多個版本,在 Docker 中稱為 Tag!

 

 

 

 

 

 

鏡像&容器

 

 

 

 

 

 

前面我們有多次提到鏡像和容器,這是 Docker 里面很核心的兩個概念。那鏡像和容器分別是什么呢?鏡像和容器的關(guān)系是什么呢?

①鏡像

官方給出的定義是:Docker 鏡像是一個只讀模板,可以用來創(chuàng)建 Docker 容器。

鏡像是一種輕量級的、可執(zhí)行的獨立軟件包,用來打包軟件運行環(huán)境和基于運行環(huán)境開發(fā)的軟件。

它包含運行某個軟件所需要的所有的內(nèi)容,包括代碼、運行時、庫、環(huán)境變量、配置文件等。

我們開發(fā)的 Web 應(yīng)用需要 JDK 環(huán)境、需要 Tomcat 容器、需要 Linux 操作系統(tǒng),那我們可以把我們所需要的一切都進行打包成一個整體(包括自己開發(fā)的 Web 應(yīng)用+JDK+Tomcat+CentOS/Ubuntu+各種配置文件)。

打包后的鏡像在某臺機器上能運行,那它就能夠在任何裝有 Docker 的機器上運行。

任何鏡像的創(chuàng)建會基于其他的父鏡像,也就是說鏡像是一層套一層,比如一個 Tomcat 鏡像,需要運行在 CentOS/Ubuntu 上。

那我們的 Tomcat 鏡像就會基于 CentOS/Ubuntu 鏡像創(chuàng)建(在后面的操作部分我們可以通過命令查看)。

這樣的結(jié)構(gòu)就類似于我們吃的洋蔥,如果你愿意一層一層一層地剝開我的心~

[[267935]]

②容器

官方給出的定義是:Docker 的容器是用鏡像創(chuàng)建的運行實例,Docker 可以利用容器獨立運行一個或一組應(yīng)用。

我們可以使用客戶端或者 API 控制容器的啟動、開始、停止、刪除。每個容器之間是相互隔離的。

上一步我們構(gòu)建的鏡像只是一個靜態(tài)的文件,這個文件需要運行就需要變?yōu)槿萜鳎覀兛梢园讶萜骺醋鍪且粋€簡易版的 Linux 系統(tǒng)和運行在其中的應(yīng)用程序!

就是前面看到的鯨魚背上的一個一個的集裝箱,每個集裝箱都是獨立的!

③鏡像與容器關(guān)系

上面的概念很抽象,可以理解為容器就是鏡像的一個實例,相信大家都寫過類似下面的代碼:

  1. public void Dog extends Animal{   
  2.     ...... 
  3. }   
  4. ...... 
  5. Dog dog = new Dog() 

我們在代碼中定義了一個 Dog 類,這個類就相當于一個鏡像,可以根據(jù)這個類 New 出很多的實例,New 出來的實例就相當于一個個的容器。鏡像是靜態(tài)的文件,而容器就是有生命的個體!

Dog 類可以繼承父類 Animal,如果不顯式的指定繼承關(guān)系,Dog 類就默認繼承 Object 類。

同樣上面也說到過 Docker 中的鏡像也有繼承關(guān)系,一個鏡像可以繼承其他的鏡像創(chuàng)建,添加新的功能!

看到這里的你是不是對 Docker 有了更多的了解了呢?我們再回頭看看百度百科對 Docker 的描述,可能你又會有更深的印象:

 

 

 

 

 

 

Docker 是一個開源的應(yīng)用容器引擎,讓開發(fā)者可以打包他們的應(yīng)用以及依賴包到一個可移植的鏡像中,然后發(fā)布到任何流行的 Linux 或 Windows 機器上,也可以實現(xiàn)虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口。

 

 

 

 

 

 

 

 

 

 

 

容器數(shù)據(jù)卷


 

 

 

 

 

 

上面說到容器是一個簡易版的 Linux 系統(tǒng)和運行在其中的應(yīng)用程序,那我們的應(yīng)用程序產(chǎn)生的數(shù)據(jù)(比如操作日志、異常日志、數(shù)據(jù))也是在容器內(nèi)的系統(tǒng)中存放的,默認不會做持久化,我們可以進入到容器中查看。

但是萬一有一天,Docker 這條鯨魚不滿人類的壓迫,反抗了...老子打爛你的集裝箱!

[[267936]]

隨著容器的關(guān)閉,容器內(nèi)的數(shù)據(jù)也會丟失,重新開啟的容器不會加載原來的數(shù)據(jù)(簡單說就是容器重新啟動又是另外一個實例了)。

那對容器內(nèi)的數(shù)據(jù)需要持久化到宿主機上就很有必要了,這就需要了解我們的容器數(shù)據(jù)卷~

容器數(shù)據(jù)卷的設(shè)計目的就是做數(shù)據(jù)的持久化和容器間的數(shù)據(jù)共享,數(shù)據(jù)卷完全獨立于容器的生命周期,也就是說就算容器關(guān)閉或者刪除,數(shù)據(jù)也不會丟失。

簡單點說就將宿主機的目錄掛載到容器,應(yīng)用在容器內(nèi)的數(shù)據(jù)可以同步到宿主機磁盤上,這樣容器內(nèi)產(chǎn)生的數(shù)據(jù)就可以持久化了。關(guān)于容器卷的命令,我們后面會有操作實例!

 

 

 

 

 

 

命令操作

 

 

 

 

 

 

上面說了那么多,下面就到了咱們的實操環(huán)節(jié)啦!這一節(jié)的內(nèi)容會通過一些常用的命令讓大家更進一步的了解 Docker。注意!這里只是一些常用的命令來加深理解,而不是命令大全!

如果沒有安裝 Docker 的小伙伴可以自己按照官網(wǎng)的文檔進行安裝,本文不會講到這部分的內(nèi)容!所以我假設(shè)你在自己的服務(wù)器上已經(jīng)裝好了 Docker!

 

 

 

 

 

 

幫助命令

 

 

 

 

 

 

①docker version:查看 Docker 客戶端和服務(wù)的版本。

②docker info:查看 Docker 的基本信息,如有多少容器、多少鏡像、Docker 根目錄等等。

③docker --help:查看 Docker 的幫助信息,這個命令可以查看所有 Docker 支持的命令~

這幾個命令非常簡單,有過一點 Linux 基礎(chǔ)的小伙伴應(yīng)該很容易理解!

 

 

 

 

 

 

鏡像命令

 

 

 

 

 

 

①docker images:查看本地主機上所有的鏡像。注意是本地主機的!這里能看到鏡像的名稱、版本、id、大小等基本信息,注意這里的 imageID 是鏡像的唯一標識!

還可以通過 docker images tomcat 指定某個具體的鏡像查看對應(yīng)信息。

這里還要注意的是 CentOS 的鏡像才 200MB 的大小,比我們物理機器上裝的 CentOS 要小得多的多,這是因為 CentOS 的鏡像只保留了 Linux 核心部分,這也是為什么 Docker 虛擬化技術(shù)比虛擬機運行效率更高的原因!

那為什么 Tomcat 的鏡像這么大呢?那是因為我們之前說過我們的鏡像就像一個洋蔥一樣,是一層套一層的!

Tomcat 的運行需要基于 CentOS、JDK 等等鏡像,Tomcat 在上層所以體積比較大啦!

②docker rmi:刪除本地的鏡像,如下圖所示,可以加上 -f 參數(shù)進行強制刪除。

這里的 rmi 命令跟 Linux 中的刪除命令就很像啦,只是這里加了一個 i 代表 image!

③docker search:根據(jù)鏡像名稱搜索遠程倉庫中的鏡像!

④docker pull:搜索到某個鏡像之后就可以從遠程拉取鏡像啦,有點類似咱們 Git 中的 Pull 命令,當然對應(yīng)的還有個 dockerpush 的命令。

如上圖,如果我們沒有指定 Tag,默認就會拉取 Latest 版本,也可以通過 docker pull tomcat:1.7 的方式拉取指定版本!

注意這里在拉取鏡像的時候打印出來的信息有很多,這也是前面說到的鏡像是一層套一層,拉取一個鏡像也是一層一層的拉?。?/span>

 

 

 

 

 

 

容器命令

 

 

 

 

 

 

通過鏡像命令我們就能獲取鏡像、刪除鏡像等操作啦!鏡像有了下面自然就需要通過鏡像創(chuàng)建對應(yīng)的實例啦,也就是我們的容器。下面我們以 Tomcat 為例:

①docker run [OPTIONS] IMAGE [COMMAND] [ARG...]:可以基于某個鏡像運行一個容器,如果本地有指定的鏡像則使用本地鏡像,如果沒有則從遠程拉取對應(yīng)的鏡像然后啟動!

由于這個命令非常重要,所以下面列出幾個比較重要的參數(shù):

  • -d:啟動容器,并且后臺運行(Docker 容器后臺運行,就必須要有一個前臺進程,容器運行的命令如果不是一直掛起的命令,容器啟動后就會自動退出)。

  • -i:以交互模式運行容器,通常與 -t 同時使用。

  • -t:為容器重新分配一個偽輸入終端,通常與 -i 同時使用(容器啟動后進入到容器內(nèi)部的命令窗口)。

  • -P:隨機端口映射,容器內(nèi)部端口隨機映射到主機的高端口。

  • -p:指定端口映射,格式為:主機(宿主)端口:容器端口。

  • -v:建立宿主機與容器目錄的同步。

  • --name="myTomcat":為容器指定一個名稱(如果不指定,則有個隨機的名字)。

上面我通過命令啟動了一個 Tomcat 的容器,由于使用了 -t 的參數(shù),所以容器啟動后就進入到了容器的內(nèi)部的命令窗口,打印了很多 Tomcat 啟動的日志。

并且使用 -p 參數(shù)指定了端口映射,也就是容器內(nèi) Tomcat 運行的端口是 8080,并且映射到了宿主機上的 8888 端口,這樣我們在外部就可以通過服務(wù)器的 ip+8888 端口訪問到我們?nèi)萜鲀?nèi)部 Tomcat 部署的服務(wù)了。

前面我們提到過容器內(nèi)的數(shù)據(jù)會隨著容器的關(guān)閉而丟失。那我們就需要有容器數(shù)據(jù)卷的技術(shù)能將容器內(nèi)的數(shù)據(jù)持久化到宿主機。這里需要用到 -v 參數(shù)!

我們看下面的截圖:

這里第一個要注意的是我們用的 -d 參數(shù),啟動后沒有進入到容器內(nèi)部,還是在宿主機。(可以對比一下與上面 -it 參數(shù)的區(qū)別)

第二個要注意的是 -v /宿主機:/容器內(nèi)目錄實現(xiàn)了宿主機與容器內(nèi)指定目錄的數(shù)據(jù)同步!

容器啟動后就可以使用 Linux 的 ll 命令查看宿主機上已經(jīng)同步到了容器內(nèi)的文件。

第三個要注意的是這里的同步是雙向的,也就是說在宿主機上對文件的修改也會同步到容器內(nèi)部!

多個不同的容器映射到宿主機的同一個目錄,就可以實現(xiàn)不同容器間的數(shù)據(jù)共享啦!

②進入到容器后可以通過 exit 命令退出容器,也可以通過 Ctrl+P+Q 快捷鍵退出容器,這兩種方式的不同之處是 exit 會退出并且關(guān)閉容器,而 Ctrl+P+Q 快捷鍵只是單純的退出,容器還在運行,并且還能再次進入!

③docker ps:我們可以通過該命令查看正在運行的容器的信息,這里能看到容器的唯一 id,啟動時間等等...

這里跟 Linux 的 ps 命令類似,所以也可以把容器理解為一個運行在 Docker 上的進程!

docker ps -a 可以查看運行中與停止的所有容器:

④docker attach [OPTIONS] CONTAINER:上面說過通過 Ctrl+P+Q 快捷鍵退出容器后容器還在后臺運行,那如果想再次進入容器怎么辦呢?我們就可以通過 attach 命令+容器的 id 再次進入容器!

⑤docker exec [OPTIONS] CONTAINER:這個命令與 attach 一樣都可以再次進入后臺運行的容器,但是該命令可以不進入容器而在運行的容器中執(zhí)行命令!比 attach 更加強大!

⑥docker stop、docker kill、docker restart:這三個命令分別用來停止容器、強制停止容器和重啟容器,就跟我們在 Linux 上停止、強制停止和重啟某個進程一樣的啦,這里就不做演示了!

⑦docker rm:使用這個命令就可以刪除某個容器,這里跟刪除鏡像的區(qū)別是這里少了一個 i 啦!

需要注意的是通過 Stop 和 Kill 停止的容器還存在于 Docker 中,而使用 rm 命令操作后的容器將不再存在!

⑧docker inspect:查看容器的詳情(也能查看鏡像詳情)。

 

 

 

 

 

 

Dockerfile


 

 

 

 

 

 

前面我們對 Docker 以及相關(guān)概念、常用命令有了基本的了解,我們也知道了可以從遠程 Pull 一個鏡像,那遠程的鏡像是怎么來的呢?如果我們想自己創(chuàng)建一個鏡像又該怎么做呢?

對,Dockerfile!Dockerfile 是一個包含用戶能夠構(gòu)建鏡像的所有命令的文本文檔,它有自己的語法以及命令,Docker 能夠從 Dockerfile 中讀取指令自動的構(gòu)建鏡像!

我們要想編寫自己的 Dockerfiler 并構(gòu)建鏡像,那對 Dockerfile 的語法和命令的了解就是必須的,了解規(guī)則才好辦事嘛!

 

 

 

 

 

 

相關(guān)指令

 

 

 

 

 

 

FROM

  1. FROM <image> [AS<name>] 
  2.  FROM <image>[:<tag>][AS <name>] 
  3.  FROM<image>[@<digest>] [AS <name>] 

指定基礎(chǔ)鏡像,當前鏡像是基于哪個鏡像創(chuàng)建的,有點類似 Java 中的類繼承。FROM 指令必是 Dockerfile 文件中的首條命令。

MAINTAINER

  1. MAINTAINER <name> 

鏡像維護者的信息,該命令已經(jīng)被標記為不推薦使用了。

LABEL

  1. LABEL<key>=<value><key>=<value><key>=<value> ... 

給鏡像添加元數(shù)據(jù),可以用 LABEL 命令替換 MAINTAINER 命令。指定一些作者、郵箱等信息。

ENV

  1. ENV <key><value> 
  2.  ENV <key>=<value> ... 

設(shè)置環(huán)境變量,設(shè)置的變量可供后面指令使用。跟 Java 中定義變量差不多的意思!

WORKDIR

  1. WORKDIR /path/to/workdir 

設(shè)置工作目錄,在該指令后的 RUN、CMD、ENTRYPOINT, COPY、ADD 指令都會在該目錄執(zhí)行。如果該目錄不存在,則會創(chuàng)建!

RUN

  1. RUN <command> 
  2.   RUN ["executable","param1""param2"

RUN 會在當前鏡像的最上面創(chuàng)建一個新層,并且能執(zhí)行任何的命令,然后對執(zhí)行的結(jié)果進行提交。提交后的結(jié)果鏡像在 Dockerfile 的后續(xù)步驟中可以使用。

ADD

  1. ADD[--chown=<user>:<group>] <src>... <dest> 
  2.   ADD[--chown=<user>:<group>] ["<src>",..."<dest>"

從宿主機拷貝文件或者文件夾到鏡像,也可以復制一個網(wǎng)絡(luò)文件!如果拷貝的文件是一個壓縮包,會自動解壓縮!

COPY

  1. COPY[--chown=<user>:<group>] <src>... <dest> 
  2.   COPY[--chown=<user>:<group>] ["<src>",..."<dest>"

從宿主機拷貝文件或者文件夾到鏡像,不能復制網(wǎng)絡(luò)文件也不會自動解壓縮!

VOLUME

  1. VOLUME ["/data"

VOLUME 用于創(chuàng)建掛載點,一般配合 run 命令的 -v 參數(shù)使用。

EXPOSE

  1. EXPOSE <port>[<port>/<protocol>...] 

指定容器運行時對外暴露的端口,但是該指定實際上不會發(fā)布該端口,它的功能是鏡像構(gòu)建者和容器運行者之間的記錄文件。

回到容器命令中的 run 命令部分,run 命令有 -p 和 -P 兩個參數(shù)。

如果是 -P 就是隨機端口映射,容器內(nèi)會隨機映射到 EXPOSE 指定的端口;如果是 -p 就是指定端口映射,告訴運維人員容器內(nèi)需要映射的端口號。

CMD

  1. CMD["executable","param1","param2"
  2.  CMD["param1","param2"
  3.  CMD command param1 param2 

指定容器啟動時默認運行的命令,在一個 Dockerfile 文件中,如果有多個 CMD 命令,只有一個最后一個會生效!

同樣是可以執(zhí)行命令,可能你會覺得跟上面的 RUN 指令很相似,RUN 指令是在構(gòu)建鏡像時候執(zhí)行的,而 CMD 指令是在每次容器運行的時候執(zhí)行的!docker run 命令會覆蓋 CMD 的命令!

ENTRYPOINT

  1. ENTRYPOINT["executable""param1""param2"
  2.  ENTRYPOINT command param1 param2 

這個指令與 CMD 指令類似,都是指定啟動容器時要運行的命令,如果指定了 ENTRYPOINT,則 CMD 指定的命令不會執(zhí)行!

在一個 Dockerfile 文件中,如果有多個 ENTRYPOINT 命令,也只有一個最后一個會生效!不同的是通過 docker run command 命令會覆蓋 CMD 的命令!

執(zhí)行的命令不會覆蓋 ENTRYPOINT,docker run 命令中指定的任何參數(shù)都會被當做參數(shù)傳遞給 ENTRYPOINT!

RUN、CMD、ENTRYPOINT 區(qū)別:

  • RUN 指令是在鏡像構(gòu)建時運行,而后兩個是在容器啟動時執(zhí)行!

  • CMD 指令設(shè)置的命令是容器啟動時默認運行的命令,如果 docker run 沒有指定任何的命令,并且 Dockerfile 中沒有指定 ENTRYPOINT,那容器啟動的時候就會執(zhí)行 CMD 指定的命令!有點類似代碼中的缺省參數(shù)!

  • 如果設(shè)置了 ENTRYPOINT 指令,則優(yōu)先使用!并且可以通過 dockerrun 給該指令設(shè)置的命令傳參!

  • CMD 有點類似代碼中的缺省參數(shù)。

USER

  1. USER <user>[:<group>] 
  2.   USER <UID>[:<GID>] 

用于指定運行鏡像所使用的用戶。

ARG

  1. ARG <name>[=<defaultvalue>] 

指定在鏡像構(gòu)建時可傳遞的變量,定義的變量可以通過 dockerbuild --build-arg = 的方式在構(gòu)建時設(shè)置。

ONBUILD

  1. ONBUILD [INSTRUCTION] 

當所構(gòu)建的鏡像被當做其他鏡像的基礎(chǔ)鏡像時,ONBUILD 指定的命令會被觸發(fā)!

STOPSIGNAL

  1. STOPSIGNAL signal 

設(shè)置當容器停止時所要發(fā)送的系統(tǒng)調(diào)用信號!

HEALTHCHECK

  1. HEALTHCHECK [OPTIONS] CMD command (在容器內(nèi)運行運行命令檢測容器的運行情況) 
  1. HEALTHCHECK NONE (禁止從父鏡像繼承檢查) 

該指令可以告訴 Docker 怎么去檢測一個容器的運行狀況!

SHELL

  1. SHELL ["executable","parameters"

用于設(shè)置執(zhí)行命令所使用的默認的 Shell 類型!該指令在 Windows 操作系統(tǒng)下比較有用,因為 Windows 下通常會有 CMD 和 Powershell 兩種 Shell,甚至還有 SH。

 

 

 

 

 

 

構(gòu)建

 

 

 

 

 

Dockerfile 執(zhí)行順序是從上到下,順序執(zhí)行!每條指令都會創(chuàng)建一個新的鏡像層,并對鏡像進行提交。

編寫好 Dockerfile 文件后,就需要使用 dockerbuild 命令對鏡像進行構(gòu)建了。

docker build 的格式:

  1. docker build [OPTIONS] PATH | URL | - 

-f:指定要使用的 Dockerfile 路徑,如果不指定,則在當前工作目錄尋找 Dockerfile 文件!

-t:鏡像的名字及標簽,通常 name:tag 或者 name 格式;可以在一次構(gòu)建中為一個鏡像設(shè)置多個標簽。

例如我們可以 docker build -t myApp:1.0.1 . 這樣來構(gòu)建自己的鏡像,注意后面的 . , 用于指定鏡像構(gòu)建過程中的上下文環(huán)境的目錄。

如果大家想了解那些官方鏡像的 Dockerfile 文件都是怎么樣寫的,可以上 https://hub.docker.com/ 進行搜索。

以 Tomcat 鏡像為例:

看完這篇,媽媽還會擔心你Docker入不了門?

能看到 Tomcat 鏡像的父鏡像是 OpenJDK 鏡像,我們再搜索 OpenJDK 的 Dockerfile 文件:

看完這篇,媽媽還會擔心你Docker入不了門?

OpenJDK 鏡像的父鏡像又是 OracleLinux 鏡像,我們再搜索 OracleLinux 的 Dockerfile 文件:

看完這篇,媽媽還會擔心你Docker入不了門?

OpenJDK 鏡像的父鏡像是 Scratch,這是根鏡像,所有的鏡像都會依賴該鏡像,就像我們代碼中所有的對象的父類都是 Object!

所以能看到 Tomcat 鏡像就是這樣一層一層的構(gòu)建出來的,這也是為什么前面通過 docker images 查看到的 Tomcat 鏡像為什么會有四百多兆的原因啦!

看到這里的你,是否對 Docker 是什么?為什么需要 Docker?Docker 鏡像、Docker 容器的概念是什么?Docker 中常用的命令有哪些?Dockerfile 有哪些指令?怎么去構(gòu)建自己的鏡像?這些問題都能明白了呢?

【51CTO原創(chuàng)稿件,合作站點轉(zhuǎn)載請注明原文作者和出處為51CTO.com】

 

責任編輯:張燕妮 來源: 51CTO技術(shù)棧
相關(guān)推薦

2017-02-09 19:45:07

Linux系統(tǒng)Linux 發(fā)行版

2019-10-30 09:25:58

NginxApache 服務(wù)器

2021-09-06 07:58:47

鏈表數(shù)據(jù)結(jié)構(gòu)

2019-01-30 13:44:34

JVM內(nèi)存服務(wù)器

2019-02-12 08:23:32

2021-11-30 05:45:16

固態(tài)硬盤總線接口

2016-03-03 17:42:10

DockerDCOS

2024-11-20 08:09:19

RabbitMQ項目客戶端

2019-07-10 15:15:23

JVM虛擬機Java

2020-06-18 10:48:44

Linux 系統(tǒng) 數(shù)據(jù)

2024-02-26 00:00:00

Docker容器

2016-12-19 14:55:10

人工智能工作

2018-03-28 21:40:03

2020-01-09 15:30:32

微服務(wù)架構(gòu)互聯(lián)網(wǎng)

2020-02-08 16:46:29

微服務(wù)架構(gòu)復雜

2016-12-20 09:55:49

思科

2021-06-08 07:48:26

數(shù)據(jù) Python開發(fā)

2021-12-29 10:21:41

Linux 權(quán)限擴展名

2021-06-16 00:57:16

JVM加載機制

2020-04-21 23:14:08

數(shù)據(jù)并發(fā)控制
點贊
收藏

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