建立Docker鏡像的方式有三種
一、docker commit命令:由容器生成鏡像;
二、Dockerfile文件+docker build命令;
三、從本地文件系統導入:OpenVZ的模板。html
Dockerfile 由一行行命令語句組成,而且支持以 # 開頭的註釋行。
通常地,Dockerfile 分爲四部分:基礎鏡像信息、維護者信息、鏡像操做指令和容器啓動時執行指令
<br/> java
基礎鏡像信息 FROM
維護者信息 MAINTAINER
鏡像操做指令 RUN、COPY、ADD、EXPOSE等
容器啓動時執行指令 CMD、ENTRYPOINTpython
Dockerfile文件的第一條指令必須是FROM,其後能夠是各類鏡像的操做指令,最後是CMD或ENTRYPOINT指定容器啓動時執行的命令。linux
下面開始對dockerfile命令開始介紹:nginx
FROM docker
dockerfile裏的第一條指令,後面跟有效的鏡像名(若是該鏡像你的本地倉庫沒有則會從遠程倉庫Pull取)。後面的指令在些鏡像中執行。
FROM <image>:<tag>shell
FROM指定一個基礎鏡像, 通常狀況下一個可用的 Dockerfile必定是 FROM 爲第一個指令,至於image則能夠是任何合理存在的image鏡像;若是本地沒有指定的鏡像,則會自動從 Docker 的公共庫 pull 鏡像下載
FROM 必定是首個非註釋指令 Dockerfile.
FROM 能夠在一個 Dockerfile 中出現屢次,以便於建立混合的images。
若是沒有指定 tag ,latest 將會被指定爲要使用的基礎鏡像版本。數據庫
MAINTAINERapache
MAINTAINER <name> 這裏是用於指定鏡像製做者的信息ubuntu
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 指令內容,等價於在後面添加了兩條指令。
寫好Dockerfile文件後就能夠在該目錄下運行docker build . 命令了(能夠用 -t 參數指定tag)。
docker build -t centos:base .
緩存
--no-cache=true ###禁止緩存
Docker在首先檢查每一條指令的時候會去cache裏搜 查是否有執行過這條指令而且能夠複用的鏡像,若是沒有再去構造一個新的鏡像。這是默認的狀況,若是你指定不要這個過程能夠在docker build裏用以下參數
###一、構建鏡像能夠運行tomcat的鏡像環境
###二、啓動容器運行tomcat程序
#################################
#一、指定基礎鏡像centos7
FROM openshift/base-centos7
MAINTAINER wuyan
#二、經過yum方式安裝jdk1.8
RUN yum install java -y
#三、將本地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
#四、配置tomcat環境變量
ENV CATALINA_HOME /ghca/apache-tomcat-7.0.75
ENV PATH $PATH:$CATALINA_HOME/bin
#五、容器端口配置
EXPOSE 8090
#六、啓動tomcat
CMD /ghca/start_tomcat.sh && tail -f /ghca/apache-tomcat-7.0.75/logs/catalina.out
<<完畢>>