Dockerfile 實際上是一份文本文檔,裏面包含了用戶能夠用來操做鏡像的一些指令。經過順序執行這些指令,最後獲得一個自定義的鏡像,這有點相似於咱們的 shell 腳本。css
#獲取docker版本 docker -v | grep -Po 'Do.+?\s\K(\d|\.)+'
FROM centos LABEL maintainer="Locez <locez@locez.com>" ENV TEST="This is a test env" COPY nginx.repo /etc/yum.repos.d/nginx.repo RUN yum update -y && \ yum install -y nginx COPY nginx.conf /etc/nginx/nginx.conf COPY index.html /usr/share/nginx/html/index.html COPY index_files/ /usr/share/nginx/html/index_files/ EXPOSE 80 CMD ["/usr/sbin/nginx","-g","daemon off;"]
在上面咱們能夠看到 Dockerfile 中的一些指令,經過名稱咱們也能夠猜到這些指令大概是幹嗎的,其中有一些對文件的操做,所以咱們先來看看用於存放 Dockerfile 的這個目錄的目錄結構:html
# tree . . ├── Dockerfile ├── index_files │ ├── 145049z4og8xyjhx4xy8go.jpg │ ├── 222746e5vh38d7ey3leyps.jpg │ ├── 88x31.png │ ├── archlinux-splash.png │ ├── bdshare.css │ ├── Best-Linux-Markdown-Editors.png │ ├── core.js │ ├── docker-icon.jpg │ ├── hadoop-pic1.png │ ├── jquery_002.js │ ├── jquery.css │ ├── jquery.js │ ├── MathJax.js │ ├── pic.gif │ ├── raspberrypiraspberry-pi-logo.jpg │ ├── script.js │ ├── scrollup.png │ ├── share.js │ ├── style.css │ └── z_stat.js ├── index.html ├── nginx.conf └── nginx.repo 1 directory, 24 files
在當前目錄下執行如下命令構建鏡像:jquery
# docker build -t locez/nginx . Sending build context to Docker daemon 1.851 MB Step 1/10 : FROM centos ---> 196e0ce0c9fb Step 2/10 : LABEL maintainer "Locez <locez@locez.com>" ---> Using cache ---> 9bba3042bcdb Step 3/10 : ENV TEST "This is a test env" ---> Using cache ---> c0ffe95ea0c5 Step 4/10 : COPY nginx.repo /etc/yum.repos.d/nginx.repo ---> Using cache ---> bb6ee4c30d56 Step 5/10 : RUN yum update -y && yum install -y nginx ---> Using cache ---> 6d46b41099c3 Step 6/10 : COPY nginx.conf /etc/nginx/nginx.conf ---> Using cache ---> cfe908390aae Step 7/10 : COPY index.html /usr/share/nginx/html/index.html ---> Using cache ---> 21729476079d Step 8/10 : COPY index_files/ /usr/share/nginx/html/index_files/ ---> Using cache ---> 662f06ec7b46 Step 9/10 : EXPOSE 80 ---> Using cache ---> 30db5a889d0a Step 10/10 : CMD /usr/sbin/nginx -g daemon off; ---> Using cache ---> d29b9d4036d2 Successfully built d29b9d4036d2
而後用該鏡像啓動容器:linux
docker run -d -it --rm --name test-nginx -p 8080:80 locez/nginx e06fd991ca1b202e08cf1578f8046355fcbba10dd9a90e11d43282f3a1e36d29
用瀏覽器訪問 http://localhost:8080/ 便可看到部署的內容。nginx
Dockerfile 指令解釋docker
Dockerfile 支持 FROM、 RUN、 CMD、 LABEL、 EXPOSE、 ENV、 ADD、 COPY、 ENTRYPOINT、 VOLUME、 USER、 WORKDIR、 ARG、 ONBUILD、 SHELL 等指令,這裏只選擇經常使用的幾個進行講解,可結合上面的示例進行理解。其它的請自行查閱官方文檔。shell
FROM 指令用於指定要操做的基礎鏡像,由於在咱們構建咱們本身的鏡像的時候須要一個基礎鏡像。 語法:centos
FROM <image> [AS <name>] FROM <image>[:<tag>] [AS <name>]
其中 [AS
RUN 指令用於執行命令,而且是在新的一層上執行,並把執行後的結果提交,也就是生成新的一層。基於這個問題,咱們在使用 RUN 指令時應該儘量的把要執行的命令一次寫完,以減小最後生成的鏡像的層數。 語法:oop
RUN <command> RUN ["executable", "param1", "param2"]
CMD 指令用於給容器啓動時指定一個用於執行的命令,例如上例中的 nginx 啓動命令。 語法:
CMD ["executable","param1","param2"] CMD ["param1","param2"] ### 用於給 ENTRYPOINT 指令提供默認參數 CMD command param1 param2
LABEL 指令用於爲鏡像指定標籤,可用 docker inspect 命令查看。可用來代替被捨棄的 MAINTAINER 命令。 語法:
LABEL <key>=<value> <key>=<value> <key>=<value> ...
EXPOSE 指令用於告訴 Docker 容器監聽的特殊端口,可是此時端口尚未暴露給 host ,只有當在運行一個容器顯式用參數 -p 或者 -P 的時候纔會暴露端口。 語法:
EXPOSE <port> [<port>/<protocol>...]
ENV 指令用於設定環境變量。 語法:
ENV <key> <value> ENV <key>=<value> ...
ADD 指令用於複製新文件,目錄,遠程文件到容器中。其中
ADD <src>... <dest> ADD ["<src>",... "<dest>"]
COPY 指令與 ADD 指令很是類似,但 COPY 比較直觀且簡單,它只支持本地的文件以及目錄的複製,不像 ADD 指令能夠遠程獲取文件並解壓。 語法:
COPY <src>... <dest> COPY ["<src>",... "<dest>"]
ENTRYPOINT 指令也跟 CMD 指令類似,用於指定容器啓動時執行的命令。當使用 ENTRYPOINT 指令時,可用 CMD 命令配合,這樣在啓動容器時,能夠對 CMD 指令寫入的參數進行覆蓋。 語法:
ENTRYPOINT ["executable", "param1", "param2"]
例子:
ENTRYPOINT ["top","-b"] CMD ["-c"]
上面的 -c 參數能夠在啓動時覆蓋 docker run -it --rm --name test top -H。 若是要覆蓋 ENTRYPOINT 指令則用 --entrypoint 參數啓動容器。
VOLUME 指令用於爲容器建立一個掛載點,這個掛載點能夠用來掛載 本地文件/文件夾 也能夠用來掛載 數據卷。其中若在啓動一個新容器時沒有指定掛載目錄,則會自動建立一個數據卷,當容器被銷燬時,數據卷若是沒有被其它容器引用則會被刪除。 語法:
VOLUME ["/data1","/data2"]
USER 指令用於設置執行 RUN, CMD, ENTRYPOINT 等指令的用戶以及用戶組。默認爲 root 用戶。 語法:
USER <user>[:<group>]
WORKDIR 指令用於設置 RUN, CMD, ENTRYPOINT, COPY, ADD 等指令的工做目錄。 語法:
WORKDIR /path/to/workdir
本文從一個具體的例子出發,講述瞭如何利用 Dockerfile 構建鏡像,而後解釋了 Dockerfile 文件中的指令的語法,有關更多內容可訪問官方文檔。