Docker 快速入門之 Dockerfile

在 Docker 中咱們能夠從名爲 Dockerfile 的文件中讀取指令而且自動構建鏡像。在本文中,將介紹 Dockerfile 的基本語法以及基本知識。
  • Dockerfile 是什麼

Dockerfile 實際上是一份文本文檔,裏面包含了用戶能夠用來操做鏡像的一些指令。經過順序執行這些指令,最後獲得一個自定義的鏡像,這有點相似於咱們的 shell 腳本。css

#獲取docker版本
docker -v | grep -Po 'Do.+?\s\K(\d|\.)+'
  • Dockerfile 示例
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

  1. FROM

FROM 指令用於指定要操做的基礎鏡像,由於在咱們構建咱們本身的鏡像的時候須要一個基礎鏡像。 語法:centos

FROM <image> [AS <name>]
FROM <image>[:<tag>] [AS <name>]

其中 [AS ] 爲指定一個名稱,在一個 Dockerfile 中屢次使用 FROM 時若有須要,可用 COPY --from=<name|index> 語法進行復制 瀏覽器

  1. RUN

RUN 指令用於執行命令,而且是在新的一層上執行,並把執行後的結果提交,也就是生成新的一層。基於這個問題,咱們在使用 RUN 指令時應該儘量的把要執行的命令一次寫完,以減小最後生成的鏡像的層數。 語法:oop

RUN <command>
RUN ["executable", "param1", "param2"]
  1. CMD

CMD 指令用於給容器啓動時指定一個用於執行的命令,例如上例中的 nginx 啓動命令。 語法:

CMD ["executable","param1","param2"]
CMD ["param1","param2"] ### 用於給 ENTRYPOINT 指令提供默認參數
CMD command param1 param2
  1. LABEL

LABEL 指令用於爲鏡像指定標籤,可用 docker inspect 命令查看。可用來代替被捨棄的 MAINTAINER 命令。 語法:

LABEL <key>=<value> <key>=<value> <key>=<value> ...
  1. EXPOSE

EXPOSE 指令用於告訴 Docker 容器監聽的特殊端口,可是此時端口尚未暴露給 host ,只有當在運行一個容器顯式用參數 -p 或者 -P 的時候纔會暴露端口。 語法:

EXPOSE <port> [<port>/<protocol>...]
  1. ENV

ENV 指令用於設定環境變量。 語法:

ENV <key> <value>
ENV <key>=<value> ...
  1. ADD

ADD 指令用於複製新文件,目錄,遠程文件到容器中。其中 能夠爲文件,目錄,URL,若爲可解壓文件,在複製後會解壓。 語法:

ADD <src>... <dest>
ADD ["<src>",... "<dest>"]
  1. COPY

COPY 指令與 ADD 指令很是類似,但 COPY 比較直觀且簡單,它只支持本地的文件以及目錄的複製,不像 ADD 指令能夠遠程獲取文件並解壓。 語法:

COPY <src>... <dest>
COPY ["<src>",... "<dest>"]
  1. ENTRYPOINT

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 參數啓動容器。

  1. VOLUME

VOLUME 指令用於爲容器建立一個掛載點,這個掛載點能夠用來掛載 本地文件/文件夾 也能夠用來掛載 數據卷。其中若在啓動一個新容器時沒有指定掛載目錄,則會自動建立一個數據卷,當容器被銷燬時,數據卷若是沒有被其它容器引用則會被刪除。 語法:

VOLUME ["/data1","/data2"]
  1. USER

USER 指令用於設置執行 RUN, CMD, ENTRYPOINT 等指令的用戶以及用戶組。默認爲 root 用戶。 語法:

USER <user>[:<group>]
  1. WORKDIR

WORKDIR 指令用於設置 RUN, CMD, ENTRYPOINT, COPY, ADD 等指令的工做目錄。 語法:

WORKDIR /path/to/workdir
  • 總結

本文從一個具體的例子出發,講述瞭如何利用 Dockerfile 構建鏡像,而後解釋了 Dockerfile 文件中的指令的語法,有關更多內容可訪問官方文檔。

相關文章
相關標籤/搜索