1. 程式人生 > >轉 dockerfile 介紹 及 編寫

轉 dockerfile 介紹 及 編寫

Docker簡介

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

Dockerfile

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

Dockerfile 語法

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

什麼是語法?

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

Dockerfile 語法示例

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

  1. # Line blocks used for commenting
  2. command argument argument ..

一個簡單的例子:

  1. # Print "Hello docker!"
  2. RUN echo "Hello docker!"

Dockerfile 命令

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

ADD

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

  1. # Usage: ADD [source directory or URL] [destination directory]
  2. ADD /my_app_folder /my_app_folder 

CMD

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

  1. # Usage 1: CMD application "argument", "argument", ..
  2. CMD "echo""Hello docker!"

ENTRYPOINT

配置容器啟動後執行的命令,並且不可被 docker run 提供的引數覆蓋。

每個 Dockerfile 中只能有一個 ENTRYPOINT,當指定多個時,只有最後一個起效。

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

  1. # Usage: ENTRYPOINT application "argument", "argument", ..
  2. # Remember: arguments are optional. They can be provided by CMD
  3. # or during the creation of a container.
  4. ENTRYPOINT echo
  5. # Usage example with CMD:
  6. # Arguments set with CMD can be overridden during *run*
  7. CMD "Hello docker!"
  8. ENTRYPOINT echo

ENV 

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

  1. # Usage: ENV key value
  2. ENV SERVER_WORKS 4

 

EXPOSE

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

  1. # Usage: EXPOSE [port]
  2. EXPOSE 8080

FROM

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

  1. # Usage: FROM [image name]
  2. FROM ubuntu 

MAINTAINER

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

  1. # Usage: MAINTAINER [name]
  2. MAINTAINER authors_name 

RUN

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

  1. # Usage: RUN [command]
  2. RUN aptitude install -y riak

USER

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

  1. # Usage: USER [UID]
  2. USER 751

VOLUME

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

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

WORKDIR

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

  1. # Usage: WORKDIR /path
  2. WORKDIR ~/

如何使用Dockerfiles

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

  1. # Build an image using the Dockerfile at current location
  2. # Example: sudo docker build -t [name] .
  3. sudo docker build -t my_mongodb . 

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

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

建立一個Dockerfile

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

  1. sudo nano Dockerfile

定義檔案和它的目的

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

  1. ############################################################
  2. # Dockerfile to build MongoDB container images
  3. # Based on Ubuntu
  4. ############################################################

設定基礎映象 

  1. # Set the base image to Ubuntu
  2. FROM ubuntu

定義作者

  1. # File Author / Maintainer
  2. MAINTAINER ExampleMcAuthor

設定命令與引數下載MongoDB

  1. ################## BEGIN INSTALLATION ######################
  2. # Install MongoDB Following the Instructions at MongoDB Docs
  3. # Ref: http://docs.mongodb.org/manual/tutorial/install-mongodb-on-ubuntu/
  4. # Add the package verification key
  5. RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
  6. # Add MongoDB to the repository sources list
  7. RUN echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen'|tee /etc/apt/sources.list.d/mongodb.list
  8. # Update the repository sources list once more
  9. RUN apt-getupdate
  10. # Install MongoDB package (.deb)
  11. RUN apt-getinstall -y mongodb-10gen
  12. # Create the default data directory
  13. RUN mkdir -/data/db
  14. ##################### INSTALLATION END #####################

 

設定MongoDB埠 

  1. # Expose the default port
  2. EXPOSE 27017
  3. # Default port to execute the entrypoint (MongoDB)
  4. CMD ["--port 27017"]
  5. # Set default container command
  6. ENTRYPOINT usr/bin/mongod

儲存Dockerfile。

構建映象

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

  1. sudo docker build -t my_mongodb .

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

Nginx簡述

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

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

  1. ############################################################
  2. # Dockerfile to build Nginx Installed Containers
  3. # Based on Ubuntu
  4. ############################################################
  5. # Set the base image to Ubuntu
  6. FROM ubuntu
  7. # File Author / Maintainer
  8. MAINTAINER MaintanerName

安裝Nginx

  1. # Install Nginx
  2. # Add application repository URL to the default sources
  3. RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe">>/etc/apt/sources.list
  4. # Update the repository
  5. RUN apt-getupdate
  6. # Install necessary tools
  7. RUN apt-getinstall -y nano wget dialog net-tools
  8. # Download and Install Nginx
  9. RUN apt-getinstall -y nginx

Bootstrapping 

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

  1. # Remove the default Nginx configuration file
  2. RUN rm -/etc/nginx/nginx.conf
  3. # Copy a configuration file from the current directory
  4. ADD nginx.conf /etc/nginx/
  5. # Append "daemon off;" to the beginning of the configuration
  6. RUN echo "daemon off;">>/etc/nginx/nginx.conf
  7. # Expose ports
  8. EXPOSE 80
  9. # Set the default command to execute
  10. # when creating a new container
  11. CMD service nginx start

儲存 dockfile。

使用Dockerfile自動構建Nginx容器

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

  1. sudo nano nginx.conf

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

  1. worker_processes 1;
  2. events {worker_connections 1024;}
  3. http {
  4.      sendfile on;
  5.      server {
  6.          listen 80;
  7.          location /{
  8.               proxy_pass http://httpstat.us/;
  9.               proxy_set_header X-Real-IP $remote_addr;
  10.          }
  11.      }
  12. }

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

Docker簡介

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

Dockerfile

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

Dockerfile 語法

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

什麼是語法?

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

Dockerfile 語法示例

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

  1. # Line blocks used for commenting
  2. command argument argument ..

一個簡單的例子:

  1. # Print "Hello docker!"
  2. RUN echo "Hello docker!"

Dockerfile 命令

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

ADD

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

  1. # Usage: ADD [source directory or URL] [destination directory]
  2. ADD /my_app_folder /my_app_folder 

CMD

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

  1. # Usage 1: CMD application "argument", "argument", ..
  2. CMD "echo""Hello docker!"

ENTRYPOINT

配置容器啟動後執行的命令,並且不可被 docker run 提供的引數覆蓋。

每個 Dockerfile 中只能有一個 ENTRYPOINT,當指定多個時,只有最後一個起效。

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

  1. # Usage: ENTRYPOINT application "argument", "argument", ..
  2. # Remember: arguments are optional. They can be provided by CMD
  3. # or during the creation of a container.
  4. ENTRYPOINT echo
  5. # Usage example with CMD:
  6. # Arguments set with CMD can be overridden during *run*
  7. CMD "Hello docker!"
  8. ENTRYPOINT echo

ENV 

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

  1. # Usage: ENV key value
  2. ENV SERVER_WORKS 4

 

EXPOSE

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

  1. # Usage: EXPOSE [port]
  2. EXPOSE 8080

FROM

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

  1. # Usage: FROM [image name]
  2. FROM ubuntu 

MAINTAINER

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

  1. # Usage: MAINTAINER [name]
  2. MAINTAINER authors_name 

RUN

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

  1. # Usage: RUN [command]
  2. RUN aptitude install -y riak

USER

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

  1. # Usage: USER [UID]
  2. USER 751

VOLUME

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

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

WORKDIR

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

  1. # Usage: WORKDIR /path
  2. WORKDIR ~/

如何使用Dockerfiles

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

  1. # Build an image using the Dockerfile at current location
  2. # Example: sudo docker build -t [name] .
  3. sudo docker build -t my_mongodb . 

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

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

建立一個Dockerfile

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

  1. sudo nano Dockerfile

定義檔案和它的目的

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

  1. ############################################################
  2. # Dockerfile to build MongoDB container images
  3. # Based on Ubuntu
  4. ############################################################

設定基礎映象 

  1. # Set the base image to Ubuntu
  2. FROM ubuntu

定義作者

  1. # File Author / Maintainer
  2. MAINTAINER ExampleMcAuthor

設定命令與引數下載MongoDB

  1. ################## BEGIN INSTALLATION ######################
  2. # Install MongoDB Following the Instructions at MongoDB Docs
  3. # Ref: http://docs.mongodb.org/manual/tutorial/install-mongodb-on-ubuntu/
  4. # Add the package verification key
  5. RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
  6. # Add MongoDB to the repository sources list
  7. RUN echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen'|tee /etc/apt/sources.list.d/mongodb.list
  8. # Update the repository sources list once more
  9. RUN apt-getupdate
  10. # Install MongoDB package (.deb)
  11. RUN apt-getinstall -y mongodb-10gen
  12. # Create the default data directory
  13. RUN mkdir -/data/db
  14. ##################### INSTALLATION END #####################

 

設定MongoDB埠 

  1. # Expose the default port
  2. EXPOSE 27017
  3. # Default port to execute the entrypoint (MongoDB)
  4. CMD ["--port 27017"]
  5. # Set default container command
  6. ENTRYPOINT usr/bin/mongod

儲存Dockerfile。

構建映象

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

  1. sudo docker build -t my_mongodb .

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

Nginx簡述

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

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

  1. ############################################################
  2. # Dockerfile to build Nginx Installed Containers
  3. # Based on Ubuntu
  4. ############################################################
  5. # Set the base image to Ubuntu
  6. FROM ubuntu
  7. # File Author / Maintainer
  8. MAINTAINER MaintanerName

安裝Nginx

  1. # Install Nginx
  2. # Add application repository URL to the default sources
  3. RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe">>/etc/apt/sources.list
  4. # Update the repository
  5. RUN apt-getupdate
  6. # Install necessary tools
  7. RUN apt-getinstall -y nano wget dialog net-tools
  8. # Download and Install Nginx
  9. RUN apt-getinstall -y nginx

Bootstrapping 

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

  1. # Remove the default Nginx configuration file
  2. RUN rm -/etc/nginx/nginx.conf
  3. # Copy a configuration file from the current directory
  4. ADD nginx.conf /etc/nginx/
  5. # Append "daemon off;" to the beginning of the configuration
  6. RUN echo "daemon off;">>/etc/nginx/nginx.conf
  7. # Expose ports
  8. EXPOSE 80
  9. # Set the default command to execute
  10. # when creating a new container
  11. CMD service nginx start

儲存 dockfile。

使用Dockerfile自動構建Nginx容器

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

  1. sudo nano nginx.conf

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

  1. worker_processes 1;
  2. events {worker_connections 1024;}
  3. http {
  4.      sendfile on;
  5.      server {
  6.          listen 80;
  7.          location /{
  8.               proxy_pass http://httpstat.us/;
  9.               proxy_set_header X-Real-IP $remote_addr;
  10.          }
  11.      }
  12. }

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