Dockerfile基礎命令-圖解輕鬆學Docker&K8S

Dockerfile基礎命令-圖解輕鬆學Docker&K8S

>>> 點我開始視頻學習 <<<

在Dockerfile中我們書寫了一系列的內置命令,比如form workdir和add,作爲Dockerfile,他遠遠不止提供了這麼幾個命令,本節咱們就將最常用的命令進行講解。在這裏強調一下,對於我們本節所學習的命令,大家腦海裏有個印象就可以了。在後續我們還會通過大量的案例進行實踐。首先咱們來看一個最基礎的from。

from

from這個指令是基於基準鏡像來設計的。什麼叫基於基準鏡像?顧名思義,我們在構建新鏡像時候,你要依託於哪個原有的鏡像進行擴展。比方說在這裏我書寫

from centos

前面的from自然是Dockerfile的命令,而後面的centos則是centos遠程倉庫的鏡像。在製作的時候,自然基於centos:lastest,也就是最新版本來進行擴展。
但是有一些特殊的場景,假設我們並不需要任何系統,只希望從零開始構建一個鏡像的話,這時在我們的文件第一行你可以書寫

from scratch

代表不依賴任何基準鏡像,從零開始,這種情況是非常少見的。
而下面的這個事例更說明問題

from tomcat:9.0.22-jdk8-openjdk

冒號後面是一個版本,好,這又是什麼意思呢?作爲from tomcat都知道這是拿tomcat鏡像,後面如果增加了冒號以後,則指明我們要下載某個特定的版本。
在這裏9.0.22-jdk8-openjdk就是遠程倉庫給我們提供了對應版本。在前面的centos這個位置上,我們沒有寫冒號,它默認就會給我們下載lastest最新版,這是Docker的默認規則。
對於from基準鏡像來說,這裏有一個建議,作爲Docker來說,儘量開發的時候,基於官方提供的Base image基準鏡像來進行。
因爲官方提供的我們可以認爲它是安全的,如果是由其他第三方所提供的,這裏他做了什麼手腳我們就不清楚了。

label

label就是說明信息,如果放在程序中就是註釋了。label沒有任何功能性,它的作用就是寫Dockerfile裏邊用於說明.

label maintainer = "itlaoqi"
label version = "1.0"
label description = "ITLAOQI應用鏡像"

比方說這裏我寫了三個label,第一個說明我們的作者是誰?第二個label代表了當前Dockerfile的版本號,而第三個說明了當前鏡像的用途和描述。這就是label的作用。別小看label的作用,雖然它沒有任何功能,但是卻爲我們程序維護性提供了極大的便利。試想一下,你看到一年前你自己寫的,Dockerfile還能想起來它的作用嗎?如果此時有這些描述信息,那是多麼的方便。

workdir

workdir設置工作目錄,它和我們linux的cd命令非常的相似,就是用於設置當前的工作目錄,

workdir /usr/lcoal

代表的我們將當前工作目錄設置爲usr/local,作爲這個目錄如果不存在的話,默認規則workdir會對其進行創建。

workdir ./local

workdir具備了創建目錄的功能,在使用的時候我的建議是workdir雖然可以像cd一樣來進行相對路徑的跳轉,但我更加建議在使用時使用絕對路徑,也就是所有路徑都以斜槓開頭,書寫完整的地址。

add©

add©。這個是兩個命令,我放在一塊來說,它們功能非常的相似,主要用於複製文件。那麼大多數情況下這裏出現ADD你也可以把它替換成copy。

ADD hello / #複製到根路徑

這條語句的作用就是指將hello這個文件複製到我們linux的根路徑下。

ADD test.tar.gz / #添加根目錄並解壓

同樣的ADD還有一個高級的功能,就是自動解壓縮,如果我們指向的是一個test.tar.gz壓縮包的話,後面跟的路徑,它會自動將這個文件解壓縮以後放在這個目錄中。

那麼ADD除了複製功能以外,它比起copy還具備着去拉取遠程文件的功能。這和我們在linux系統中使用的curl或者wget命令非常的相似,可以說ADD它是我們平時構建鏡像時非常常用的一個命令,幫助我們將文件從物理機複製到鏡像當中去。

env

ENV設置環境常量,什麼是環境常量呢?其實非常好理解。以前我們都在做java,如果jdk要使用的話,是不是要在系統中設置一個名爲java_home的這麼一個環境變量,那麼在docker中也有類似的設置,這裏使用env再加上環境常量的名字,後面再增加具體的值就行了。

ENV JAVA_HOME /usr/local/openjdk8
RUN ${JAVA_HOME}/bin/java -jar test.jar

就拿這個例子,env Java_home後邊加上這個路徑說明java_home它指向了這個地址,也就是java_home就指代了後面的路徑。
那麼在使用時可以使用run來運行某個linux的指令,只不過在這使用${}加上我們環境常量來進行替代。它具體的作用就相當於執行了open jdk8 bin目錄下的java應用,並執行了test.jar。在這兒我們又涉及到了一個新的命令run,run用於執行linux的命令,不過現在我們先不去講它,下一節要對它進行詳細的講解。
作爲env我們推薦優先去使用,因爲它可以提高我們程序的維護性。
假設在dockerfile中出現了多處需要執行Java命令的地方,我們只需要設置java_home便可以進行指代。
假設未來環境發生變化,jdk被放到了其他的位置上,沒有關係,只需要改這一處,所有的應用都會生效。

expose

expose暴露容器端口expose它的作用是將我們容器內部的端口對外暴露。書寫辦法也非常簡單,就是這個單詞後邊增加對應的端口號就行了。
作爲expose,它的作用就是將容器內端口暴露給物理機。
Dockerfile基礎命令-圖解輕鬆學Docker&K8S
來,我們看一下這張圖,作爲外側的紅的部分,可以認爲這是我們的一臺服務器物理機。而內側我們啓動了一個tomcat容器。這裏如果dokcerfile中定義了expose 8080的話,就相當於在內側的容器中對外暴露了8080端口。 同時我們在創建容器的時候。

EXPOSE 8080
docker run -p 8000:8080 tomcat

可以看到這裏我做了一個-P8000:8080,它的作用是在物理機也就是外側的地方,用8000映射到內側的8080端口。這樣內側的服務一旦啓動,在外側我們瀏覽器中輸入localhost:8000的話,就可以訪問到內部的8080端口提供的web應用了。這便是expose的用法。
作爲Dockerfile,剛纔我給大家演示了最基礎,也是最常見的幾個指令,但是這並不能足夠支撐我們構建一個鏡像,因爲在除了複製切換目錄暴露端口之外,還有大量的Linux的命令需要執行,那該怎麼做?下一節我們繼續講解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章