自己學Docker:9.基於Dockerfile創建鏡像

最近事多,因爲箇中原因,離職了.書看到一半停了好久.上次纔剛看到docker鏡像的持久化,使用commit命令可以使容器持久化爲鏡像.使用 docker commit 來擴展一個鏡像比較簡單,但是不方便在一個團隊中分享,所以這種方式不是很推薦.那麼,docker還提供了一種更爲靈活方便的創建鏡像的方法.即使用Dockerfile文件.而且使用 Dockerfile 可以允許用戶創建自定義的鏡像.

Dockerfile基本結構

Dockerfile 由一行行命令語句組成,支持以 # 開頭的註釋.
一般來說,Dockerfile 分爲四部分:

  1. 基礎鏡像信息
  2. 維護者信息
  3. 鏡像操作指令
  4. 容器啓動時執行指令
    單說有些太抽象.看個Dockerfile文件就很容易理解了.
# Docker file for Hexo 3
FROM ubuntu:16.04

MAINTAINER MUNGO 

# use aliyun's mirror for faster download speed
RUN sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list
# add pandoc repository
RUN sed -i 's/deb mirror.lupaworld.com/ubuntu vivid main universe/g' /etc/apt/sources.list

# instal basic tool 
RUN apt-get update && \
  apt-get install -y nodejs curl git-core pandoc yui-compressor && \
  update-alternatives --install /usr/bin/node node /usr/bin/nodejs 10 && \
  curl -L https://npmjs.org/install.sh | sh && \
  apt-get clean && \
  rm -rf /var/lib/apt/lists/*

ENV HEXO_VERSION 3.0.0
# install hexo
RUN npm install -g hexo@${HEXO_VERSION}

# set base dir
RUN mkdir /hexo
# set home dir
WORKDIR /hexo
EXPOSE 4000

CMD ["/bin/bash"]

從上可得,對應上面四點分別是:

  1. 一開始必須使用FROM指明所基於的鏡像名稱.
  2. 使用MAINTAINER說明維護者信息.
  3. 鏡像操作指令–RUN ,ENV,WORKDIR,EXPOSE.最常用的是RUN指令,它將對鏡像執行跟隨的命令.每運行一條 RUN 指令,鏡像添加新的一層,並提交.
  4. 最後是 CMD 指令,來指定運行容器時的操作命令.
    關於上面的Dockerfile簡單說明下,一些指令相關的參見下面的指令介紹應該可以,RUN sed是爲了在創建鏡像時下載可以快些指定了使用阿里雲的鏡像.

指令

上面對於Dockerfile文件應該有個整體的印象.下面對於Dockerfile用的一些指令進行簡單的說明.
首先,指令的一般格式爲

INSTRUCTION arguments

先說上面用的指令,FROM,MAINTAINER,RUN,ENV,WORKDIR,EXPOSE,CMD.有一點很重要,指令必須都是大寫.

FROM

格式爲 FROM 或FROM :.
第一條指令必須爲 FROM 指令,註釋除外.並且,如果在同一個Dockerfile中創建多個鏡像時,可以使用多個 FROM 指令(每個鏡像一次).

MAINTAINER

格式爲 MAINTAINER ,指定維護者信息.

RUN

格式爲 RUN 或 RUN [“executable”, “param1”, “param2”].
前者將在 shell 終端中運行命令,即 /bin/sh -c;後者則使用 exec 執行。指定使用其它終端可以通過第二種方式實現,例如 RUN [“/bin/bash”, “-c”, “echo hello”].

WORKDIR

格式爲 WORKDIR /path/to/workdir。
爲後續的 RUN、CMD、ENTRYPOINT 指令配置工作目錄。
可以使用多個 WORKDIR 指令,後續命令如果參數是相對路徑,則會基於之前命令指定的路徑.

WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd

則最終路徑爲 /a/b/c

EXPOSE

格式爲 EXPOSE […]。
告訴 Docker 服務端容器暴露的端口號,供互聯繫統使用。在啓動容器時需要通過 -P,Docker 主機會自動分配一個端口轉發到指定的端口。

ENV

格式爲 ENV 。 指定一個環境變量,會被後續 RUN 指令使用,並在容器運行時保持.

CMD

支持三種格式:
1.CMD [“executable”,”param1”,”param2”] 使用 exec 執行,推薦方式;
2.CMD command param1 param2 在 /bin/sh 中執行,提供給需要交互的應用;
3.CMD [“param1”,”param2”] 提供給 ENTRYPOINT 的默認參數;
指定啓動容器時執行的命令,每個 Dockerfile 只能有一條 CMD 命令。如果指定了多條命令,只有最後一條會被執行.如果用戶啓動容器時候指定了運行的命令,則會覆蓋掉 CMD 指定的命令.
上面的指令是在上面的Dockerfile都有用到.還有一些指令是沒用到的.也羅列一些.

VOLUME

格式爲 VOLUME [“/data”]。
創建一個可以從本地主機或其他容器掛載的掛載點,一般用來存放數據庫和需要保持的數據等。 這個還是很常用的.

ADD

格式爲 ADD 。
該命令將複製指定的 到容器中的 。 其中 可以是Dockerfile所在目錄的一個相對路徑;也可以是一個 URL;還可以是一個 tar 文件(自動解壓爲目錄).

COPY

格式爲 COPY 。
複製本地主機的 (爲 Dockerfile 所在目錄的相對路徑)到容器中的 。
當使用本地目錄爲源目錄時,推薦使用 COPY。

ENTRYPOINT

兩種格式:
ENTRYPOINT [“executable”, “param1”, “param2”]
ENTRYPOINT command param1 param2(shell中執行)。
配置容器啓動後執行的命令,並且不可被 docker run 提供的參數覆蓋。
每個 Dockerfile 中只能有一個 ENTRYPOINT,當指定多個時,只有最後一個起效。

USER

格式爲 USER daemon。
指定運行容器時的用戶名或 UID,後續的 RUN 也會使用指定用戶。
當服務不需要管理員權限時,可以通過該命令指定運行用戶。並且可以在之前創建所需要的用戶,例如:RUN groupadd -r postgres && useradd -r -g postgres postgres。要臨時獲取管理員權限可以使用 gosu,而不推薦 sudo。

ONBUILD

格式爲 ONBUILD [INSTRUCTION]。
配置當所創建的鏡像作爲其它新創建鏡像的基礎鏡像時,所執行的操作指令。
例如,Dockerfile 使用如下的內容創建了鏡像 image-A.

創建鏡像

上面說了那麼多都是理論性的東西.下面開始嘗試如何根據Dockerfile文件創建一個鏡像.
其實很簡單,當寫好Dockerfile 之後,只需通過 docker build 命令就可以創建鏡像了.
如果用上面的Dockerfile文件,可以先建立一個hexo3文件夾,然後在裏面建立一個Dockerfile文件,將上面內容複製進去,然後使用docker build創建.

mkdir hexo3
touch Dockerfile
sudo docker build -t="mungo/hexo3"

-t選項可以指定鏡像的標籤信息.
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述
過程需要一些時間,看你在創建鏡像時需要執行那些指令,下載文件的多少.
完成以後可用通過命令查看創建的鏡像.

sudo docker images

這裏寫圖片描述
可以看到,我們基於ubuntu 16.04創建的鏡像,mungo/hexo3.這個名字是在執行docker build命令時,使用-t制定的.
然後,就可以像使用其他鏡像一樣,創建容器了.這個創建的容器裏包含一個hexo3的博客系統,這是我在創建鏡像時使用RUN在裏面安裝的.

目前對Docker的學習都是一些基本概念和基本操作。下一步,將去了解Docker網絡相關的東西。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章