Dockerfile指令介紹
1、docker commit命令:由容器生成鏡像;
2、Dockerfile文件+docker build命令;
3、從本地文件系統導入:OpenVZ的模板。
1. Dockerfile主要指令簡介
Dockerfile 由一行行命令語句組成,並且支持以 # 開頭的註釋行。
一般地,Dockerfile 分為四部分:基礎鏡像信息、維護者信息、鏡像操作指令和容器啟動時執行指令
<br/>
基礎鏡像信息 FROM
維護者信息 MAINTAINER
鏡像操作指令 RUN、COPY、ADD、EXPOSE等
Dockerfile文件的第一條指令必須是FROM,其後可以是各種鏡像的操作指令,最後是CMD或ENTRYPOINT指定容器啟動時執行的命令。
下面開始對dockerfile命令開始介紹:
FROM
dockerfile裏的第一條指令,後面跟有效的鏡像名(如果該鏡像你的本地倉庫沒有則會從遠程倉庫Pull取)。後面的指令在些鏡像中執行。
FROM <image>:<tag>
FROM指定一個基礎鏡像, 一般情況下一個可用的 Dockerfile一定是 FROM 為第一個指令,至於image則可以是任何合理存在的image鏡像;如果本地沒有指定的鏡像,則會自動從 Docker 的公共庫 pull 鏡像下載
FROM 可以在一個 Dockerfile 中出現多次,以便於創建混合的images。
如果沒有指定 tag ,latest 將會被指定為要使用的基礎鏡像版本。
MAINTAINER
MAINTAINER <name> 這裏是用於指定鏡像制作者的信息
RUN
後跟要執行的linux命令,每一條RUN指令(可能會有多條linux命令)會在當前容器最上面的可讀寫層執行並且提交成一個新的鏡像層,接下來的指令會在這個新的鏡像層裏執行。
RUN <command> (the command is run in a shell – /bin/sh -c – shell form)
RUN ["executable", "param1", "param2"] (exec form)
RUN echo "Asia/Shanghai" > /etc/timezone
註意下面的情況:
不要在一條RUN指令裏單一使用apt-get update命令,這樣可能會導致以後的apt-get install 安裝出錯。
避免使用RUN apt-get upgrade 或者dist-upgrade,這樣有些重要的軟件包可能更新失敗,如果你確實想要更新某個包A,使用apt-get install install -y A 。這樣會自動更新這個軟件包。
COPY
COPY 將文件從路徑 <src> 復制添加到容器內部路徑 <dest>。
<src> 必須是想對於源文件夾的一個文件或目錄,也可以是一個遠程的url,<dest> 是目標容器中的絕對路徑。
所有的新文件和文件夾都會創建UID 和 GID 。事實上如果 <src> 是一個遠程文件URL,那麽目標文件的權限將會是600。
ADD
ADD 將文件從路徑 <src> 復制添加到容器內部路徑 <dest>。
<src> 必須是想對於源文件夾的一個文件或目錄,也可以是一個遠程的url。<dest> 是目標容器中的絕對路徑。
所有的新文件和文件夾都會創建UID 和 GID。事實上如果 <src> 是一個遠程文件URL,那麽目標文件的權限將會是600。
USER
USER 用來切換運行屬主身份的。Docker 默認是使用 root,但若不需要,建議切換使用者身分,畢竟 root 權限太大了,使用上有安全的風險。
CMD
CMD指令指定你制作出來的鏡像在啟動成容器時運行命令的默認的參數。
CMD有三種寫法:
CMD ["executable","param1","param2"] (exec form, this is the preferred form)
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
CMD command param1 param2 (shell form)
第一種是可執行文件加參數,第二種是作為ENTRYPOINT的參數,第三種是作為”/bin/sh -c”的參數。
註意點:
docker run命令如果指定了參數會把CMD裏的參數覆蓋: (這裏說明一下,如:docker run -it ubuntu /bin/bash 命令的參數是指/bin/bash 而非 -it ,-it只是docker 的參數,而不是容器的參數,以下所說參數均如此。)
這裏CMD與ENTRYPOINT的區別強烈推薦你去看 論docker CMD與ENTRYPOINT的大區別 http://www.cnblogs.com/programfish/p/4101884.html 這篇文章。看完你就懂了。
ENTRYPOINT
ENTRYPOINT字面意思指定容器的進入點。可以把你的容器制作成類似可執行文件的用法。這個指令會覆蓋它前面的CMD指令,而多個 ENTRYPOINT指令只有最後一個生效(後面覆蓋前面)。同時你也可以在在啟動container 的時候指定–entrypoint參數來覆蓋dockerfile裏的ENTRYPOINT。詳見官方文檔。
例如我用了這樣的指令制作鏡像名叫echotest:
ENTRYPOINT ["/bin/echo"]
然後之後這樣運行:
docker run -it echotest “this is a echo”
實際上是平時這樣的命令:
docker run -it echotest /bin/echo “this is a echo”
這樣你應該明白了吧。 這樣一個容器的行為就很類似一個可執行文件了。 這裏CMD與ENTRYPOINT的區別強烈推薦你去看 論docker CMD與ENTRYPOINT的大區別 http://www.cnblogs.com/programfish/p/4101884.html 這篇文章。看完你就懂了。
EXPOSE
EXPOSE指定容器對外暴露的端口號。
ENV
ENV指令可以用於為docker容器設置環境變量,例如你要確保CMD[“nginx”]能成功啟動,你應該用ENV PATH /usr/local/nginx/bin:$PATH設定環境變量。另外你可以設定另外一些變量用於RUN命令裏以便於dockerfile文件的維護:
ENV PG_MAJOR 9.3
ENV PG_VERSION 9.3.4
#設置環境變量,所有操作都是非交互式的
ENV DEBIAN_FRONTEND noninteractive
RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress && …
ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH
這樣多次出現版本號就可以通過一個變量來管理方便維護。
VOLUME
VOLUME ["path"] 創建一個可以從本地主機或其他容器掛載的掛載點,一般用來存放數據庫和需要保存的數據等。
為了能夠保存(持久化)數據以及共享容器間的數據,Docker提出了Volume的概念,Volume就是目錄或者文件,它可以繞過默認的聯合文件系統,而以正常的文件或者目錄的形式存在於宿主機上
FROM debian:wheezy
VOLUME /data(容器目錄)
docker run -v /home/adrian/data:/data debian ls /data
WORKDIR
WORKDIR 用來切換工作目錄的。Docker 默認的工作目錄是/,只有 RUN 能執行 cd 命令切換目錄,而且還只作用在當下下的 RUN,也就是說每一個 RUN 都是獨立進行的。如果想讓其他指令在指定的目錄下執行,就得靠 WORKDIR。WORKDIR 動作的目錄改變是持久的,不用每個指令前都使用一次 WORKDIR。
ONBUILD
ONBUILD 的作用就是讓指令延遲執行,延遲到下一個使用 FROM 的 Dockerfile 在建立 image 時執行,只限延遲一次。
ONBUILD 的使用情景是在建立鏡像時取得最新的源碼 (搭配 RUN) 與限定系統框架
ARG
ARG是Docker1.9 版本才新加入的指令。
ARG 定義的變量只在建立 image 時有效,建立完成後變量就失效消失
LABEL
定義一個 image 標簽 Owner,並賦值,其值為變量 Name 的值。(LABEL Owner=$Name )
ONBUILD
配置當所創建的鏡像作為其它新創建鏡像的基礎鏡像時,所執行的操作指令。
例如,Dockerfile 使用如下的內容創建了鏡像 image-A:
[...]
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
[...]
如果基於 image-A 創建新的鏡像時,新的 Dockerfile 中使用 FROM image-A 指定基礎鏡像時,會自動執行 ONBUILD 指令內容,等價於在後面添加了兩條指令。
2. 構建鏡像
寫好Dockerfile文件後就可以在該目錄下運行docker build . 命令了(可以用 -t 參數指定tag)。
docker build -t centos:base .
緩存
--no-cache=true ###禁止緩存
Docker在首先檢查每一條指令的時候會去cache裏搜 查是否有執行過這條指令並且可以復用的鏡像,如果沒有再去構造一個新的鏡像。這是默認的情況,如果你指定不要這個過程可以在docker build裏用如下參數
3. 案例:構建tomcat鏡像
###1、構建鏡像可以運行tomcat的鏡像環境
###2、啟動容器運行tomcat程序
#################################
#1、指定基礎鏡像centos7
FROM openshift/base-centos7
MAINTAINER wuyan
#2、通過yum方式安裝jdk1.8
RUN yum install java -y
#3、將本地tomcat程序添加到容器中
RUN mkdir -p /ghca/
ADD apache-tomcat-7.0.75 /ghca/apache-tomcat-7.0.75
RUN chmod -R 775 /ghca
ADD start_tomcat.sh /ghca/start_tomcat.sh
RUN chmod 775 /ghca/start_tomcat.sh
#4、配置tomcat環境變量
ENV CATALINA_HOME /ghca/apache-tomcat-7.0.75
ENV PATH $PATH:$CATALINA_HOME/bin
#5、容器端口配置
EXPOSE 8090
#6、啟動tomcat
CMD /ghca/start_tomcat.sh && tail -f /ghca/apache-tomcat-7.0.75/logs/catalina.out
<<完畢>>
Dockerfile指令介紹