成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

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

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

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

于是我問老板:

 

 

我:老板,金魚多少錢?

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

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

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

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

 

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

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

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

 

 

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

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

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

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

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

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

 

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

 

 

測試:xx,你的代碼在生產環境上運行有問題。

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

測試:你自己上生產環境上看。

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

 

或許很多開發人員都有過上面的經歷,程序在本地運行都很正常,一上到生產環境就崩了。

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

加上現在互聯網高并發、大流量的訪問,一個應用往往需要部署到集群的多臺機器上,并且集群擴容縮容的需求也比較頻繁。

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

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

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

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

 

 

Hello Docker

 

 

 

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

 

 

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


 

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

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

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

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

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

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

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

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

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

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

  • Docker 是什么?

  • 為什么需要 Docker?

 

 

與傳統虛擬機對比


 

前面我們說過 Docker 可以實現虛擬化,那 Docker 與我們平時用的虛擬機有什么區別和聯系呢?

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

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

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

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

因此 Docker 容器比傳統的虛擬機更為輕便!但是 Docker 容器技術也是參考虛擬機一步一步的迭代優化過來的!

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

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

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

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

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

 

 

基本組成要素


 

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

先看看官網給出的架構圖:

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

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

 

 

Docker 客戶端

 

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

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

 

 

Docker 服務

 

中間的是 Docker 后臺運行的服務,一個稱為 Docker Daemon 的守護進程。可以理解為我們 MySQL 的服務,我們的操作命令都是在這部分進行處理!

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

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

 

 

 

 

 

 

倉庫

 

 

 

 

 

 

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

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

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

 

 

 

 

 

 

鏡像&容器

 

 

 

 

 

 

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

①鏡像

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

鏡像是一種輕量級的、可執行的獨立軟件包,用來打包軟件運行環境和基于運行環境開發的軟件。

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

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

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

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

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

這樣的結構就類似于我們吃的洋蔥,如果你愿意一層一層一層地剝開我的心~

[[267935]]

②容器

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

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

上一步我們構建的鏡像只是一個靜態的文件,這個文件需要運行就需要變為容器,我們可以把容器看做是一個簡易版的 Linux 系統和運行在其中的應用程序!

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

③鏡像與容器關系

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

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

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

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

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

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

 

 

 

 

 

 

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

 

 

 

 

 

 

 

 

 

 

 

容器數據卷


 

 

 

 

 

 

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

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

[[267936]]

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

那對容器內的數據需要持久化到宿主機上就很有必要了,這就需要了解我們的容器數據卷~

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

簡單點說就將宿主機的目錄掛載到容器,應用在容器內的數據可以同步到宿主機磁盤上,這樣容器內產生的數據就可以持久化了。關于容器卷的命令,我們后面會有操作實例!

 

 

 

 

 

 

命令操作

 

 

 

 

 

 

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

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

 

 

 

 

 

 

幫助命令

 

 

 

 

 

 

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

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

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

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

 

 

 

 

 

 

鏡像命令

 

 

 

 

 

 

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

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

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

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

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

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

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

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

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

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

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

 

 

 

 

 

 

容器命令

 

 

 

 

 

 

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

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

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

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

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

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

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

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

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

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

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

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

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

我們看下面的截圖:

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

第二個要注意的是 -v /宿主機:/容器內目錄實現了宿主機與容器內指定目錄的數據同步!

容器啟動后就可以使用 Linux 的 ll 命令查看宿主機上已經同步到了容器內的文件。

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

多個不同的容器映射到宿主機的同一個目錄,就可以實現不同容器間的數據共享啦!

②進入到容器后可以通過 exit 命令退出容器,也可以通過 Ctrl+P+Q 快捷鍵退出容器,這兩種方式的不同之處是 exit 會退出并且關閉容器,而 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 一樣都可以再次進入后臺運行的容器,但是該命令可以不進入容器而在運行的容器中執行命令!比 attach 更加強大!

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

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

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

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

 

 

 

 

 

 

Dockerfile


 

 

 

 

 

 

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

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

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

 

 

 

 

 

 

相關指令

 

 

 

 

 

 

FROM

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

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

MAINTAINER

  1. MAINTAINER <name> 

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

LABEL

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

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

ENV

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

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

WORKDIR

  1. WORKDIR /path/to/workdir 

設置工作目錄,在該指令后的 RUN、CMD、ENTRYPOINT, COPY、ADD 指令都會在該目錄執行。如果該目錄不存在,則會創建!

RUN

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

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

ADD

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

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

COPY

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

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

VOLUME

  1. VOLUME ["/data"

VOLUME 用于創建掛載點,一般配合 run 命令的 -v 參數使用。

EXPOSE

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

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

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

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

CMD

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

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

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

ENTRYPOINT

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

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

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

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

RUN、CMD、ENTRYPOINT 區別:

  • RUN 指令是在鏡像構建時運行,而后兩個是在容器啟動時執行!

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

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

  • CMD 有點類似代碼中的缺省參數。

USER

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

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

ARG

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

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

ONBUILD

  1. ONBUILD [INSTRUCTION] 

當所構建的鏡像被當做其他鏡像的基礎鏡像時,ONBUILD 指定的命令會被觸發!

STOPSIGNAL

  1. STOPSIGNAL signal 

設置當容器停止時所要發送的系統調用信號!

HEALTHCHECK

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

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

SHELL

  1. SHELL ["executable","parameters"

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

 

 

 

 

 

 

構建

 

 

 

 

 

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

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

docker build 的格式:

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

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

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

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

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

以 Tomcat 鏡像為例:

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

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

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

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

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

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

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

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

【51CTO原創稿件,合作站點轉載請注明原文作者和出處為51CTO.com】

 

責任編輯:張燕妮 來源: 51CTO技術棧
相關推薦

2017-02-09 19:45:07

Linux系統Linux 發行版

2021-09-06 07:58:47

鏈表數據結構

2019-10-30 09:25:58

NginxApache 服務器

2019-01-30 13:44:34

JVM內存服務器

2019-02-12 08:23:32

2021-11-30 05:45:16

固態硬盤總線接口

2024-11-20 08:09:19

RabbitMQ項目客戶端

2016-03-03 17:42:10

DockerDCOS

2019-07-10 15:15:23

JVM虛擬機Java

2020-06-18 10:48:44

Linux 系統 數據

2018-03-28 21:40:03

2016-12-19 14:55:10

人工智能工作

2020-01-09 15:30:32

微服務架構互聯網

2024-02-26 00:00:00

Docker容器

2020-02-08 16:46:29

微服務架構復雜

2016-12-20 09:55:49

思科

2021-06-16 00:57:16

JVM加載機制

2020-04-21 23:14:08

數據并發控制

2021-06-08 07:48:26

數據 Python開發

2021-12-29 10:21:41

Linux 權限擴展名
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 狠狠草视频 | 久久久av一区 | 99久久精品免费看国产小宝寻花 | 香蕉大人久久国产成人av | 亚洲精品久久久久中文字幕二区 | 亚洲综合视频一区 | 国产成人一区二区 | 日本精品视频一区二区 | av色站 | 日韩精品一区二区三区在线播放 | 天堂av在线影院 | 欧美精品乱码久久久久久按摩 | 久久精品一区二 | 亚洲国产高清高潮精品美女 | 日本成人片在线观看 | 日韩高清一区二区 | 国产精品毛片久久久久久 | 天天天天操 | 男女免费视频网站 | 久久精品视频在线观看 | 国产综合在线视频 | 亚洲电影一区二区三区 | 亚洲国产精品久久久久婷婷老年 | 91精品久久久久久久久 | 91网站在线观看视频 | 欧美三级网站 | 五月综合激情婷婷 | 久久久精品一区二区三区 | 日韩欧美国产成人一区二区 | 免费看国产片在线观看 | 国产精品夜间视频香蕉 | 精品国产一区二区三区性色av | 日韩精品1区2区3区 国产精品国产成人国产三级 | 久久在线看| 中文字幕a√ | 日韩电影一区二区三区 | 成年女人免费v片 | 国产日韩精品一区二区 | 日日夜夜免费精品视频 | av国产在线观看 | 中文字幕第一页在线 |