使用 Dockerfile 建立鏡像

簡介

  Dockerfile是一個文本格式的配置文件,用戶可使用Dockerfile快速建立自定義的鏡像。
  本文首先將介紹Dockerfile典型的基本結構及其支持的衆多指令,並具體講解經過這些指令來編寫定製鏡像的Dockerfile。
  最後,會介紹使用Dockerfile建立鏡像的過程。python

基本結構

  Dockerfile由一行行命令語句組成,而且支持以#開頭的註釋行。
  通常而言,Dockerfile分爲四部分:基礎鏡像信息、維護者信息、鏡像操做指令和容器啓動時執行指令。例如:nginx

# 第一行必須指定基於的基礎鏡像
FROM ubuntu

# 維護者信息
MAINTAINER docker_user docker_user@email.com

# 鏡像的操做指令
RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list
RUN apt-get update && apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf

# 容器啓動時執行命令
CMD /usr/sbin/nginx

  其中,一開始必須指明所基於的鏡像名稱,接下來通常會說明維護者信息。
  後面則是鏡像操做指令,例如RUN指令,RUN指令將對鏡像執行跟隨的命令。每運行一條RUN指令,鏡像添加新的一層,並提交。最後是CMD指令,來指定運行容器時的操做命令。docker

指令

  指令的通常格式爲INSTRUCTION arguments,指令包括FROM、MAINTAINER、RUN等。下面分別介紹。shell

FROM

  格式爲 FROM<image> 或 FROM<image>:<tag>。
  第一條指令必須爲FROM指令。而且,若是在同一個Dockerfile中建立多個鏡像時,可使用多個FROM指令(每一個鏡像一次)。數據庫

MAINTAINER

  格式爲 MAINTAINER<name>,指定維護者信息。ubuntu

RUN

  格式爲 RUN<command> 或 RUN["executable","param1","param2"]。
  前者將在shell終端中運行命令,即 /bin/sh -c ;後者則使用exec執行。指定使用其餘終端能夠經過第二種方式實現,例如 RUN["/bin/bash","-c","echo hel1o"] 。
  每條RUN指令將在當前鏡像基礎上執行指定命令,並提交爲新的鏡像。當命令較長時可使用\來換行。ruby

CMD

  支持三種格式:bash

  1. CMD["executable","param1","param2"]使用exec執行,推薦方式。
  2. CMD command paraml param2在/bin/sh中執行,提供給須要交互的應用。
  3. CMD["param1","param2"]提供給ENTRYPOINT的默認參數。

  指定啓動容器時執行的命令,每一個Dockerfile只能有一條CMD命令。若是指定了多條命令,只有最後一條會被執行。
  若是用戶啓動容器時候指定了運行的命令,則會覆蓋掉CMD指定的命令。app

EXPOSE

  格式爲 EXPOSE <port> [<port>...] 。
  例如:
  EXPOSE 2280 8443
  告訴Docker服務端容器暴露的端口號,供互聯繫統使用。在啓動容器時須要經過-P,Docker主機會自動分配一個端口轉發到指定的端口;使用-p,則能夠具體指定哪一個本地端口映射過來。curl

ENV

  格式爲 ENV <key> <value>。指定一個環境變量,會被後續RUN指令使用,並在容器運行時保持。例如:
  ENV PG MAJOR 9.3
  ENV PG VERSION 9.3.4
  RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz I tar -xJC /usr/
src/postgress && …
  ENV PATH/usr/local/postgres-$PG_MAJOR/bin:SPATH

ADD

  格式爲ADD <src> <dest>。
  該命令將複製指定的<src>到容器中的<dest>。其中<src>能夠是Dockerfile所在目錄的一個相對路徑(文件或目錄);也能夠是一個URL;還能夠是一個tar文件(自動解壓爲目錄)。

COPY

  格式爲COPY <src> <dest>。
  複製本地主機的<src>(爲Dockerfile所在目錄的相對路徑,文件或目錄)爲容器中的<dest>。目標路徑不存在時,會自動建立。
  當使用本地目錄爲源目錄時,推薦使用COPY。

ENTRYPOINT

  有兩種格式:
  ENTRYPOINT["executable","paraml","param2"]
  ENTRYPOINT command paraml param2(shell中執行)。
  配置容器啓動後執行的命令,而且不可被 docker run提供的參數覆蓋。
  每一個Dockerfile中只能有一個ENTRYPOINT,當指定多個ENTRYPOINT時,只有最後一個生效。

VOLUME

  格式爲VOLUME["/data"]。
  建立一個能夠從本地主機或其餘容器掛載的掛載點,通常用來存放數據庫和須要保持的數據等。

USER

  格式爲USER daemon。
  指定運行容器時的用戶名或UID,後續的RUN也會使用指定用戶。
  當服務不須要管理員權限時,能夠經過該命令指定運行用戶。而且能夠在以前建立所須要的用戶,例如:RUN groupadd -r postgres && useradd -r -g postgres postgres。要臨時獲取管理員權限可使用gosu,而不推薦sudo。

WORKDIR

  格式爲WORKDIR /path/to/workdir。
  爲後續的RUN、CMD、ENTRYPOINT指令配置工做目錄。
  可使用多個WORKDIR指令,後續命令若是參數是相對路徑,則會基於以前命令指定的路徑。例如:
  WORKDIR/a
  WORKDIR b
  WORKDIR c
  RUN pwd
  則最終路徑爲/a/b/c。

ONBUILD

  格式爲 ONBUILD [INSTRUCTION]。
  配置當所建立的鏡像做爲其餘新建立鏡像的基礎鏡像時,所執行的操做指令。例如,Dockerfile使用以下的內容建立了鏡像image-A。
  [...]
  ONBUILD ADD./app/src
  ONBUILD RUN/usr/1ocal/bin/python-build--dir/app/sre
  [...]
  若是基於image-A建立新的鏡像時,新的Dockerfile中使用 FROM image-A 指定基礎鏡像時,會自動執行ONBUILD指令內容,等價於在後面添加了兩條指令。
  EROM image-A
  #Automatically run the following
  ADD./app/src
  RUN/usr/local/bin/python-build--dir/app/src
  使用ONBUILD指令的鏡像,推薦在標籤中註明,例如ruby:1.9-onbuild。

建立鏡像

  編寫完成Dockerfile以後,能夠經過docker build命令來建立鏡像。
  基本的格式爲docker build [選項]路徑,該命令將讀取指定路徑下(包括子目錄)的Dockerfile,並將該路徑下全部內容發送給Docker服務端,由服務端來建立鏡像。所以通常建議放置Dockerfile的目錄爲空目錄。
  另外,能夠經過.dockerignore文件(每一行添加一條匹配模式)來讓Docker忽略路徑下的目錄和文件。
  要指定鏡像的標籤信息,能夠經過-t選項。
  例如,指定Dockerfile所在路徑爲/tmp/docker_builder/,而且但願生成鏡像標籤爲build_repo/first_image,可使用下面的命令:

  & sudo docker build -t build_repo/first_image /tmp/docker_builder/

 

這篇文章是我學習 Docker 的記錄,內容參考自《Docker技術入門與實戰》
相關文章
相關標籤/搜索