Dockerfile是什麼
Dockerfile用于快速建立自定義的Docker鏡像,在上一篇部落格中我們知道常見的三種建立image的手法,一般情況我們可以通過在基礎鏡像的基礎上通過
docker commit
的方式生成新的image,但是對于這樣的image是缺乏安全性的,我們很難确定在base image基礎上鏡像建立者安裝了什麼或者鏡像包含什麼不安全的因素,是以一個安全合理的image需要從Dockerfile中建構。
Dockerfile文法
工欲善其事,必先利其器。在開始編寫Dockerfile之前,需要學習一下Dockerfile的基本文法:
FROM
Dockerfile第一條必須為FROM指令,為了安全盡量使用官方的base image,如果同一個Dockerfile建立多個鏡像時,可使用多個FROM指令:
FORM scratch #制作base image
FORM centos #使用base image
FORM centos: #使用帶版本的base image
LABEL
LABEL用于定義Metadata,包括作者資訊,版本資訊,描述資訊:
LABEL maintainer=“[email protected]”
LABEL version=“”
LABEL description=“hello docker”
RUN
RUN用于在鏡像生成過程中執行一些操作指令,每次執行run都會生辰新的一層,為了美觀複雜度RUN使用反斜杠換行,合并多條指令成一行,避免無用分層。
* RUN yum update && yum -y install vim #執行yum update并安裝vim
* RUN /bin/bash -c 'source $HOME/.bashrc;echo $HOME'
WORKDIR
設定目前的工作目錄,盡量使用WORKDIR切換工作目錄,避免使用RUN cd!盡量使用絕對目錄。
WORKDIR /test #切換到test目錄,如果沒有會自動建立test目錄
WORKDIR hello
RUN pwd #輸出目前目錄為/test/hello
ADD and COPY
添加/複制檔案到指定目錄。優先使用COPY,ADD還有解壓的作用,添加遠端檔案或目錄使用curl或者wget:
ADD hello / # 添加hello到根目錄
ADD test.tar.gz / # 添加到根目錄并解壓(COPY不會解壓)
WORKDIR /root # 切換到root目錄
ADD hello test/ # /root/test/hello
WORKDIR /root
COPY hello test
ENV
設定常量,多使用常量增加可維護性
ENV MYSQL_VERSION , #設定常量
RUN apt-get install -y mysql-server="${MYSQL_VERSION}" #使用常量
CMD and ENTRYPOINT
CMD和ENTRYPOINT用于指定在容器啟動時執行的指令,二者差別在于:
CMD:
* 設定容器啟動後預設執行的指令和參數
* 如果docker run 指定了其它指令,CMD指令會被忽略
* 如果定義了多個CMD,則隻會執行最後一個
ENTRYPOINT:
* 設定容器啟動時運作的指令
* 讓容器以應用程式或者服務的形式運作(背景程序)
* 不會被忽略,一定會執行
* 常見使用方式:寫一個腳本作為ENTRYPOINT去執行
PS:RUN是執行指令并建立新的image layer
VOLUME and EXPOSE
存儲和網絡設定,VOLUME建立一個可以從本地主機或其他容器挂載的挂載點,一般用來存放資料庫和需要保持的資料。EXPOSE 告訴Docker服務端容器暴露的端口号,供互聯系統使用。在啟動Docker時,可以通過-P,主機會自動配置設定一個端口号轉發到指定的端口,如:
容器ssh服務的22端口将被映射到主控端的23333端口
編寫自己的Dockerfile
基于上述的文法我們就可以構造安全合理清晰的image了,一個完整的Dockerfile分為四部分組成:基礎鏡像資訊、作者資訊、鏡像操作指令和容器啟動時執行指令,從最簡單的開始,我們以基礎鏡像centos為基礎,給它安裝vim編輯器:
### 基礎鏡像資訊
FROM centos
### 作者資訊
LABEL maintainer="[email protected]"
LABEL version="1.0"
LABEL description="hello docker"
### 鏡像操作指令
RUN yum update && yum -y install vim #執行yum update并安裝vim
ENV HELLO "hello docker, it's my first dockerfile!"
### 容器啟動時執行指令
CMD echo ${HELLO}
編寫完Dockerfile後我們就可以建構image了,執行:
我們指定image名字為starlh/hello-dockerfile,後面的點表示使用目前目錄下的dockerfile進行build,建構完後通過
docker images
我們可以看到目前我們所有的image:

運作指令
docker run starlh/hello-dockerfile
,可以看到容器輸出:
# docker run starlh/hello-dockerfile
hello docker, it's my first dockerfile!
至此,一個簡單的dockerfile就誕生了,有了這個基礎我們就可以編寫或者讀懂更加複雜的dockerfile,借助這個能力我們算是在docker領域入了門哦~。