1. 程式人生 > 實用技巧 >Dockerfile命令介紹及例項

Dockerfile命令介紹及例項

Dockerfile命令介紹及例項

當你在使用 Docker構建映象的時候,每一個命令都會在前一個命令的基礎上形成一個新層。這些基礎映象可以用於建立新的容器。本篇文章將手把手教您如何從基礎映象,一步一步,一層一層的從Dockerfile構建容器的過程。


基礎映象可以用於建立Docker容器。映象可以非常基礎,僅僅包含作業系統;也可以非常豐富,包含靈巧的應用棧,隨時可 以釋出。當你在使用 Docker構建映象的時候,每一個命令都會在前一個命令的基礎上形成一個新層。這些基礎映象可以用於建立新的容器。本篇文章將手把手教您如何從基礎鏡 像,一步一步,一層一層的從Dockerfile構建容器的過程。

Docker簡介

Docker專案提供了構建在Linux核心功能之上,協同在一起的的高階工具。其目標是幫助開發和運維人員更容易地跨系統跨主機交付應用程式和他 們的依賴。Docker通過Docker容器,一個安全的,基於輕量級容器的環境,來實現這個目標。這些容器由映象建立,而映象可以通過命令列手工建立或 者通過Dockerfile自動建立。

Dockerfile

Dockerfile是由一系列命令和引數構成的指令碼,這些命令應用於基礎映象並最終建立一個新的映象。它們簡化了從頭到尾的流程並極大的簡化了部 署工作。Dockerfile從FROM命令開始,緊接著跟隨者各種方法,命令和引數。其產出為一個新的可以用於建立容器的映象。

Dockerfile 語法

在我們深入討論Dockerfile之前,讓我們快速過一下Dockerfile的語法和它們的意義。

什麼是語法?

非常簡單,在程式設計中,語法意味著一個呼叫命令,輸入引數去讓應用執行程式的文法結構。這些語法被規則或明或暗的約束。程式設計師遵循語法規範以和計算機 互動。如果一段程式語法不正確,計算機將無法識別。Dockerfile使用簡單的,清楚的和乾淨的語法結構,極為易於使用。這些語法可以自我釋義,支援 註釋。

Dockerfile 語法示例

Dockerfile語法由兩部分構成,註釋和命令+引數

#Lineblocksusedforcommenting
commandargumentargument..

一個簡單的例子:

#Print"Hellodocker!"
RUNecho"Hellodocker!"

Dockerfile 命令

Dockerfile有十幾條命令可用於構建映象,下文將簡略介紹這些命令。

ADD

ADD命令有兩個引數,源和目標。它的基本作用是從源系統的檔案系統上覆制檔案到目標容器的檔案系統。如果源是一個URL,那該URL的內容將被下載並複製到容器中。

#Usage:ADD[sourcedirectoryorURL][destinationdirectory]
ADD/my_app_folder/my_app_folder

CMD

和RUN命令相似,CMD可以用於執行特定的命令。和RUN不同的是,這些命令不是在映象構建的過程中執行的,而是在用映象構建容器後被呼叫。

#Usage1:CMDapplication"argument","argument",..
CMD"echo""Hellodocker!"

ENTRYPOINT

ENTRYPOINT 幫助你配置一個容器使之可執行化,如果你結合CMD命令和ENTRYPOINT命令,你可以從CMD命令中移除“application”而僅僅保留引數,引數將傳遞給ENTRYPOINT命令。

#Usage:ENTRYPOINTapplication"argument","argument",..
#Remember:argumentsareoptional.TheycanbeprovidedbyCMD
#orduringthecreationofacontainer.
ENTRYPOINTecho
#UsageexamplewithCMD:
#ArgumentssetwithCMDcanbeoverriddenduring*run*
CMD"Hellodocker!"
ENTRYPOINTecho

ENV

ENV命令用於設定環境變數。這些變數以”key=value”的形式存在,並可以在容器內被指令碼或者程式呼叫。這個機制給在容器中執行應用帶來了極大的便利。

#Usage:ENVkeyvalue
ENVSERVER_WORKS4

EXPOSE

EXPOSE用來指定埠,使容器內的應用可以通過埠和外界互動。

#Usage:EXPOSE[port]
EXPOSE8080

FROM

FROM命令可能是最重要的Dockerfile命令。改命令定義了使用哪個基礎映象啟動構建流程。基礎映象可以為任意鏡 像。如果基礎映象沒有被發現,Docker將試圖從Docker p_w_picpath index來查詢該映象。FROM命令必須是Dockerfile的首個命令。

#Usage:FROM[p_w_picpathname]FROMubuntu

MAINTAINER

我建議這個命令放在Dockerfile的起始部分,雖然理論上它可以放置於Dockerfile的任意位置。這個命令用於宣告作者,並應該放在FROM的後面。

#Usage:MAINTAINER[name]
MAINTAINERauthors_name

RUN

RUN命令是Dockerfile執行命令的核心部分。它接受命令作為引數並用於建立映象。不像CMD命令,RUN命令用於建立映象(在之前commit的層之上形成新的層)。

#Usage:RUN[command]
RUNaptitudeinstall-yriak

USER

USER命令用於設定執行容器的UID。

#Usage:USER[UID]
USER751

VOLUME

VOLUME命令用於讓你的容器訪問宿主機上的目錄。

#Usage:VOLUME["/dir_1","/dir_2"..]
VOLUME["/my_files"]

WORKDIR

WORKDIR命令用於設定CMD指明的命令的執行目錄。

#Usage:WORKDIR/path
WORKDIR~/

如何使用Dockerfiles

使用Dockerfiles和手工使用Docker Daemon執行命令一樣簡單。指令碼執行後輸出為新的映象ID。

#Buildanp_w_picpathusingtheDockerfileatcurrentlocation#Example:sudodockerbuild-t[name].sudodockerbuild-tmy_mongodb.

Dockerfile 示例一:建立一個MongoDB的映象

在這部分中,我們講一步一步建立一個Dockfile,這個Dockerfile可用於構建MongoDB映象進而構建MongoDB容器。

建立一個Dockerfile

使用nano文字編輯器,讓我們建立Dockerfile。

sudonanoDockerfile

定義檔案和它的目的

讓閱讀者明確Dockerfile的目的永遠是必要的。為此,我們通常從註釋開始寫Dockerfile。

############################################################
#DockerfiletobuildMongoDBcontainerp_w_picpaths
#BasedonUbuntu
############################################################

設定基礎映象

#Setthebasep_w_picpathtoUbuntu
FROMubuntu

定義作者

#FileAuthor/Maintainer
MAINTAINERExampleMcAuthor

設定命令與引數下載MongoDB

##################BEGININSTALLATION######################
#InstallMongoDBFollowingtheInstructionsatMongoDBDocs
#Ref:
#Addthepackageverificationkey
RUNapt-keyadv--keyserverhkp://keyserver.ubuntu.com:80--recv7F0CEB10
#AddMongoDBtotherepositorysourceslist
RUNecho'debhttp://downloads-distro.mongodb.org/repo/ubuntu-upstartdist10gen'|tee/etc/apt/sources.list.d/mongodb.list
#Updatetherepositorysourceslistoncemore
RUNapt-getupdate
#InstallMongoDBpackage(.deb)
RUNapt-getinstall-ymongodb-10gen
#Createthedefaultdatadirectory
RUNmkdir-p/data/db
#####################INSTALLATIONEND#####################

設定MongoDB埠

#Exposethedefaultport
EXPOSE27017
#Defaultporttoexecutetheentrypoint(MongoDB)
CMD["--port27017"]
#Setdefaultcontainercommand
ENTRYPOINTusr/bin/mongod

儲存Dockerfile。

構建映象

使用上述的Dockerfile,我們已經可以開始構建MongoDB映象

sudodockerbuild-tmy_mongodb.

Dockerfile 示例二:建立一個Nginx的映象

Nginx簡述

Nginx是一個高效能的 HTTP 和 反向代理 伺服器。它因為它的輕量級,易用,易於擴充套件而流行於業界。基於優良的架構設計,它能夠比之前的類似軟體處理更多的請求。它也可以用來提供靜態檔案服務,比如圖片,指令碼和CSS。

和上個例子一樣,我們還是從基礎映象開始,運用FROM命令和MAINTAINER命令

############################################################
#DockerfiletobuildNginxInstalledContainers
#BasedonUbuntu
############################################################
#Setthebasep_w_picpathtoUbuntu
FROMubuntu
#FileAuthor/Maintainer
MAINTAINERMaintanerName

安裝Nginx

#InstallNginx
#AddapplicationrepositoryURLtothedefaultsources
RUNecho"debhttp://archive.ubuntu.com/ubuntu/raringmainuniverse">>/etc/apt/sources.list
#Updatetherepository
RUNapt-getupdate
#Installnecessarytools
RUNapt-getinstall-ynanowgetdialognet-tools
#DownloadandInstallNginx
RUNapt-getinstall-ynginx

Bootstrapping

安裝Nginx後,我們需要配置Nginx並且替換掉預設的配置檔案

#RemovethedefaultNginxconfigurationfile
RUNrm-v/etc/nginx/nginx.conf
#Copyaconfigurationfilefromthecurrentdirectory
ADDnginx.conf/etc/nginx/
#Append"daemonoff;"tothebeginningoftheconfiguration
RUNecho"daemonoff;">>/etc/nginx/nginx.conf
#Exposeports
EXPOSE80
#Setthedefaultcommandtoexecute
#whencreatinganewcontainer
CMDservicenginxstart

儲存 dockfile。

使用Dockerfile自動構建Nginx容器

因為我們命令Docker用當前目錄的Nginx的配置檔案替換預設的配置檔案,我們要保證這個新的配置檔案存在。在Dockerfile存在的目錄下,建立nginx.conf:

sudonanonginx.conf

然後用下述內容替換原有內容:

worker_processes1;
events{worker_connections1024;}
http{
sendfileon;
server{
listen80;
location/{
proxy_passhttp://httpstat.us/;
proxy_set_headerX-Real-IP$remote_addr;
}
}
}

讓我們儲存nginx.conf。之後我們就可以用Dockerfile和配置檔案來構建映象。


轉載於:https://blog.51cto.com/dengaosky/1854775