Docker簡介
Docker項目提供了構建在Linux內核功能之上,協同在一塊兒的的高級工具。其目標是幫助開發和運維人員更容易地跨系統跨主機交付應用程序和他們的依賴。Docker經過Docker容器,一個安全的,基於輕量級容器的環境,來實現這個目標。這些容器由鏡像建立,而鏡像能夠經過命令行手工建立或 者經過Dockerfile自動建立。nginx
Dockerfile
Dockerfile是由一系列命令和參數構成的腳本,這些命令應用於基礎鏡像並最終建立一個新的鏡像。它們簡化了從頭至尾的流程並極大的簡化了部署工做。Dockerfile從FROM命令開始,緊接着跟隨者各類方法,命令和參數。其產出爲一個新的能夠用於建立容器的鏡像。程序員
Dockerfile 語法
在咱們深刻討論Dockerfile以前,讓咱們快速過一下Dockerfile的語法和它們的意義。mongodb
什麼是語法?
很是簡單,在編程中,語法意味着一個調用命令,輸入參數去讓應用執行程序的文法結構。這些語法被規則或明或暗的約束。程序員遵循語法規範以和計算機 交互。若是一段程序語法不正確,計算機將沒法識別。Dockerfile使用簡單的,清楚的和乾淨的語法結構,極爲易於使用。這些語法能夠自我釋義,支持註釋。docker
Dockerfile 語法示例
Dockerfile語法由兩部分構成,註釋和命令+參數編程
# Line blocks used for commenting
command argument argument ..
一個簡單的例子:ubuntu
# Print "Hello docker!"
RUN echo "Hello docker!"
Dockerfile 命令
Dockerfile有十幾條命令可用於構建鏡像,下文將簡略介紹這些命令。安全
ADD
ADD命令有兩個參數,源和目標。它的基本做用是從源系統的文件系統上覆制文件到目標容器的文件系統。若是源是一個URL,那該URL的內容將被下載並複製到容器中。服務器
# Usage: ADD [source directory or URL] [destination directory]
ADD /my_app_folder /my_app_folder
CMD
和RUN命令類似,CMD能夠用於執行特定的命令。和RUN不一樣的是,這些命令不是在鏡像構建的過程當中執行的,而是在用鏡像構建容器後被調用。架構
# Usage 1: CMD application "argument", "argument", ..
CMD "echo""Hello docker!"
ENTRYPOINT
配置容器啓動後執行的命令,而且不可被 docker run 提供的參數覆蓋。app
每一個 Dockerfile 中只能有一個 ENTRYPOINT,當指定多個時,只有最後一個起效。
ENTRYPOINT 幫助你配置一個容器使之可執行化,若是你結合CMD命令和ENTRYPOINT命令,你能夠從CMD命令中移除「application」而僅僅保留參數,參數將傳遞給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命令用於設置環境變量。這些變量以」key=value」的形式存在,並能夠在容器內被腳本或者程序調用。這個機制給在容器中運行應用帶來了極大的便利。
# Usage: ENV key value
ENV SERVER_WORKS 4
EXPOSE
EXPOSE用來指定端口,使容器內的應用能夠經過端口和外界交互。
# Usage: EXPOSE [port]
EXPOSE 8080
FROM
FROM命令多是最重要的Dockerfile命令。改命令定義了使用哪一個基礎鏡像啓動構建流程。基礎鏡像能夠爲任意鏡 像。若是基礎鏡像沒有被發現,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執行命令的核心部分。它接受命令做爲參數並用於建立鏡像。不像CMD命令,RUN命令用於建立鏡像(在以前commit的層之上造成新的層)。
# Usage: RUN [command]
RUN aptitude install -y riak
USER
USER命令用於設置運行容器的UID。
# Usage: USER [UID]
USER 751
VOLUME
VOLUME命令用於讓你的容器訪問宿主機上的目錄。
# Usage: VOLUME ["/dir_1", "/dir_2" ..]
VOLUME ["/my_files"]
WORKDIR
WORKDIR命令用於設置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 示例一:建立一個MongoDB的鏡像
在這部分中,咱們講一步一步建立一個Dockfile,這個Dockerfile可用於構建MongoDB鏡像進而構建MongoDB容器。
建立一個Dockerfile
使用nano文本編輯器,讓咱們建立Dockerfile。
sudo nano Dockerfile
定義文件和它的目的
讓閱讀者明確Dockerfile的目的永遠是必要的。爲此,咱們一般從註釋開始寫Dockerfile。
############################################################
# Dockerfile to build MongoDB container images
# Based on Ubuntu
############################################################
設置基礎鏡像
# Set the base image to Ubuntu
FROM ubuntu
定義做者
# File Author / Maintainer
MAINTAINER ExampleMcAuthor
設置命令與參數下載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-getupdate
# Install MongoDB package (.deb)
RUN apt-getinstall -y mongodb-10gen
# Create the default data directory
RUN mkdir -p /data/db
##################### INSTALLATION END #####################
設置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。
構建鏡像
使用上述的Dockerfile,咱們已經能夠開始構建MongoDB鏡像
sudo docker build -t my_mongodb .
Dockerfile 示例二:建立一個Nginx的鏡像
Nginx簡述
Nginx是一個高性能的 HTTP 和 反向代理 服務器。它由於它的輕量級,易用,易於擴展而流行於業界。基於優良的架構設計,它可以比以前的相似軟件處理更多的請求。它也能夠用來提供靜態文件服務,好比圖片,腳本和CSS。
和上個例子同樣,咱們仍是從基礎鏡像開始,運用FROM命令和MAINTAINER命令
############################################################
# Dockerfile to build Nginx Installed Containers
# Based on Ubuntu
############################################################
# Set the base image to Ubuntu
FROM ubuntu
# File Author / Maintainer
MAINTAINER MaintanerName
安裝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-getupdate
# Install necessary tools
RUN apt-getinstall -y nano wget dialog net-tools
# Download and Install Nginx
RUN apt-getinstall -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自動構建Nginx容器
由於咱們命令Docker用當前目錄的Nginx的配置文件替換默認的配置文件,咱們要保證這個新的配置文件存在。在Dockerfile存在的目錄下,建立nginx.conf:
sudo nano nginx.conf
而後用下述內容替換原有內容:
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和配置文件來構建鏡像。