天天看點

Docker學習筆記(三)-編寫自己的DockerfileDockerfile是什麼

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學習筆記(三)-編寫自己的DockerfileDockerfile是什麼

運作指令

docker run starlh/hello-dockerfile

,可以看到容器輸出:

# docker run starlh/hello-dockerfile
hello docker, it's my first dockerfile!
           

至此,一個簡單的dockerfile就誕生了,有了這個基礎我們就可以編寫或者讀懂更加複雜的dockerfile,借助這個能力我們算是在docker領域入了門哦~。