Dockerfile命令介紹及實例
基礎(chǔ)鏡像可以用于創(chuàng)建Docker容器。鏡像可以非?;A(chǔ),僅僅包含操作系統(tǒng);也可以非常豐富,包含靈巧的應用棧,隨時可以發(fā)布。當你在使用 Docker構(gòu)建鏡像的時候,每一個命令都會在前一個命令的基礎(chǔ)上形成一個新層。這些基礎(chǔ)鏡像可以用于創(chuàng)建新的容器。本篇文章將手把手教您如何從基礎(chǔ)鏡像,一步一步,一層一層的從Dockerfile構(gòu)建容器的過程。
Docker簡介
Docker項目提供了構(gòu)建在Linux內(nèi)核功能之上,協(xié)同在一起的的高級工具。其目標是幫助開發(fā)和運維人員更容易地跨系統(tǒng)跨主機交付應用程序和他們的依賴。Docker通過Docker容器,一個安全的,基于輕量級容器的環(huán)境,來實現(xiàn)這個目標。這些容器由鏡像創(chuàng)建,而鏡像可以通過命令行手工創(chuàng)建或 者通過Dockerfile自動創(chuàng)建。
Dockerfile
Dockerfile是由一系列命令和參數(shù)構(gòu)成的腳本,這些命令應用于基礎(chǔ)鏡像并最終創(chuàng)建一個新的鏡像。它們簡化了從頭到尾的流程并極大的簡化了部署工作。Dockerfile從FROM命令開始,緊接著跟隨者各種方法,命令和參數(shù)。其產(chǎn)出為一個新的可以用于創(chuàng)建容器的鏡像。
Dockerfile 語法
在我們深入討論Dockerfile之前,讓我們快速過一下Dockerfile的語法和它們的意義。
什么是語法?
非常簡單,在編程中,語法意味著一個調(diào)用命令,輸入?yún)?shù)去讓應用執(zhí)行程序的文法結(jié)構(gòu)。這些語法被規(guī)則或明或暗的約束。程序員遵循語法規(guī)范以和計算機 交互。如果一段程序語法不正確,計算機將無法識別。Dockerfile使用簡單的,清楚的和干凈的語法結(jié)構(gòu),極為易于使用。這些語法可以自我釋義,支持注釋。
Dockerfile 語法示例
Dockerfile語法由兩部分構(gòu)成,注釋和命令+參數(shù)
# Line blocks used for commenting
command argument argument ..
一個簡單的例子:
# Print "Hello docker!"
RUN echo "Hello docker!"
Dockerfile 命令
Dockerfile有十幾條命令可用于構(gòu)建鏡像,下文將簡略介紹這些命令。
ADD
ADD命令有兩個參數(shù),源和目標。它的基本作用是從源系統(tǒng)的文件系統(tǒng)上復制文件到目標容器的文件系統(tǒng)。如果源是一個URL,那該URL的內(nèi)容將被下載并復制到容器中。
# Usage: ADD [source directory or URL] [destination directory]
ADD /my_app_folder /my_app_folder
CMD
和RUN命令相似,CMD可以用于執(zhí)行特定的命令。和RUN不同的是,這些命令不是在鏡像構(gòu)建的過程中執(zhí)行的,而是在用鏡像構(gòu)建容器后被調(diào)用。
# Usage 1: CMD application "argument", "argument", ..
CMD "echo" "Hello docker!"
ENTRYPOINT
ENTRYPOINT 幫助你配置一個容器使之可執(zhí)行化,如果你結(jié)合CMD命令和ENTRYPOINT命令,你可以從CMD命令中移除“application”而僅僅保留參數(shù),參數(shù)將傳遞給ENTRYPOINT命令。
# Usage: ENTRYPOINT application "argument", "argument", ..
# Remember: arguments are optional. They can be provided by CMD
# or during the creation of a container.
ENTRYPOINT echo
# Usage example with CMD:
# Arguments set with CMD can be overridden during *run*
CMD "Hello docker!"
ENTRYPOINT echo
ENV
ENV命令用于設(shè)置環(huán)境變量。這些變量以”key=value”的形式存在,并可以在容器內(nèi)被腳本或者程序調(diào)用。這個機制給在容器中運行應用帶來了極大的便利。
# Usage: ENV key value
ENV SERVER_WORKS 4
#p#
EXPOSE
EXPOSE用來指定端口,使容器內(nèi)的應用可以通過端口和外界交互。
# Usage: EXPOSE [port]
EXPOSE 8080
FROM
FROM命令可能是最重要的Dockerfile命令。改命令定義了使用哪個基礎(chǔ)鏡像啟動構(gòu)建流程?;A(chǔ)鏡像可以為任意鏡 像。如果基礎(chǔ)鏡像沒有被發(fā)現(xiàn),Docker將試圖從Docker image index來查找該鏡像。FROM命令必須是Dockerfile的首個命令。
# Usage: FROM [image name]
FROM ubuntu
MAINTAINER
我建議這個命令放在Dockerfile的起始部分,雖然理論上它可以放置于Dockerfile的任意位置。這個命令用于聲明作者,并應該放在FROM的后面。
# Usage: MAINTAINER [name]
MAINTAINER authors_name
RUN
RUN命令是Dockerfile執(zhí)行命令的核心部分。它接受命令作為參數(shù)并用于創(chuàng)建鏡像。不像CMD命令,RUN命令用于創(chuàng)建鏡像(在之前commit的層之上形成新的層)。
# Usage: RUN [command]
RUN aptitude install -y riak
USER
USER命令用于設(shè)置運行容器的UID。
# Usage: USER [UID]
USER 751
VOLUME
VOLUME命令用于讓你的容器訪問宿主機上的目錄。
# Usage: VOLUME ["/dir_1", "/dir_2" ..]
VOLUME ["/my_files"]
WORKDIR
WORKDIR命令用于設(shè)置CMD指明的命令的運行目錄。
# Usage: WORKDIR /path
WORKDIR ~/
如何使用Dockerfiles
使用Dockerfiles和手工使用Docker Daemon運行命令一樣簡單。腳本運行后輸出為新的鏡像ID。
# Build an image using the Dockerfile at current location
# Example: sudo docker build -t [name] .
sudo docker build -t my_mongodb .
Dockerfile 示例一:創(chuàng)建一個MongoDB的鏡像
在這部分中,我們講一步一步創(chuàng)建一個Dockfile,這個Dockerfile可用于構(gòu)建MongoDB鏡像進而構(gòu)建MongoDB容器。
創(chuàng)建一個Dockerfile
使用nano文本編輯器,讓我們創(chuàng)建Dockerfile。
sudo nano Dockerfile
定義文件和它的目的
讓閱讀者明確Dockerfile的目的永遠是必要的。為此,我們通常從注釋開始寫Dockerfile。
############################################################
# Dockerfile to build MongoDB container images
# Based on Ubuntu
############################################################
設(shè)置基礎(chǔ)鏡像
# Set the base image to Ubuntu
FROM ubuntu
定義作者
# File Author / Maintainer
MAINTAINER Example McAuthor
設(shè)置命令與參數(shù)下載MongoDB
################## BEGIN INSTALLATION ######################
# Install MongoDB Following the Instructions at MongoDB Docs
# Ref: http://docs.mongodb.org/manual/tutorial/install-mongodb-on-ubuntu/
# Add the package verification key
RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
# Add MongoDB to the repository sources list
RUN echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | tee /etc/apt/sources.list.d/mongodb.list
# Update the repository sources list once more
RUN apt-get update
# Install MongoDB package (.deb)
RUN apt-get install -y mongodb-10gen
# Create the default data directory
RUN mkdir -p /data/db
##################### INSTALLATION END #####################
#p#
設(shè)置MongoDB端口
# Expose the default port
EXPOSE 27017
# Default port to execute the entrypoint (MongoDB)
CMD ["--port 27017"]
# Set default container command
ENTRYPOINT usr/bin/mongod
保存Dockerfile。
構(gòu)建鏡像
使用上述的Dockerfile,我們已經(jīng)可以開始構(gòu)建MongoDB鏡像
sudo docker build -t my_mongodb .
Dockerfile 示例二:創(chuàng)建一個Nginx的鏡像
Nginx簡述
Nginx是一個高性能的 HTTP 和 反向代理 服務(wù)器。它因為它的輕量級,易用,易于擴展而流行于業(yè)界。基于優(yōu)良的架構(gòu)設(shè)計,它能夠比之前的類似軟件處理更多的請求。它也可以用來提供靜態(tài)文件服務(wù),比如圖片,腳本和CSS。
和上個例子一樣,我們還是從基礎(chǔ)鏡像開始,運用FROM命令和MAINTAINER命令
############################################################
# Dockerfile to build Nginx Installed Containers
# Based on Ubuntu
############################################################
# Set the base image to Ubuntu
FROM ubuntu
# File Author / Maintainer
MAINTAINER Maintaner Name
安裝Nginx
# Install Nginx
# Add application repository URL to the default sources
RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list
# Update the repository
RUN apt-get update
# Install necessary tools
RUN apt-get install -y nano wget dialog net-tools
# Download and Install Nginx
RUN apt-get install -y nginx
Bootstrapping
安裝Nginx后,我們需要配置Nginx并且替換掉默認的配置文件
# Remove the default Nginx configuration file
RUN rm -v /etc/nginx/nginx.conf
# Copy a configuration file from the current directory
ADD nginx.conf /etc/nginx/
# Append "daemon off;" to the beginning of the configuration
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
# Expose ports
EXPOSE 80
# Set the default command to execute
# when creating a new container
CMD service nginx start
保存 dockfile。
使用Dockerfile自動構(gòu)建Nginx容器
因為我們命令Docker用當前目錄的Nginx的配置文件替換默認的配置文件,我們要保證這個新的配置文件存在。在Dockerfile存在的目錄下,創(chuàng)建nginx.conf:
sudo nano nginx.conf
然后用下述內(nèi)容替換原有內(nèi)容:
worker_processes 1;
events { worker_connections 1024; }
http {
sendfile on;
server {
listen 80;
location / {
proxy_pass http://httpstat.us/;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
讓我們保存nginx.conf。之后我們就可以用Dockerfile和配置文件來構(gòu)建鏡像。