鏡像的定製實際上就是定製每一層所添加的配置、文件。我們可以把每一層修改、安裝、構建、操作的命令都寫入一個腳本,這個腳本就是 Dockerfile。Dockerfile 是一個文本文件,其內包含了一條條的指令(Instruction),每一條指令構建一層,因此每一條指令的內容,就是描述該層應當如何構建。
FROM nginx
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
Dockerfile命令詳解
FROM
就是指定基礎鏡像,是必備的指令,並且必須是第一條指令。官方基礎鏡像類型:
- 服務類的鏡像:如 nginx、redis、mongo、mysql、httpd、php、tomcat 等;
- 語言應用的鏡像:如 node、openjdk、python、ruby、golang 等。
- 操作系統鏡像,如 ubuntu、debian、centos、fedora、alpine 等。
- scratch,這個鏡像是虛擬的概念,並不實際存在,它表示一個空白的鏡像。
RUN
指令是用來執行命令行命令的。shell 格式:RUN <命令>,就像直接在命令行中輸入的命令一樣。剛纔寫的 Dockerfile 中的 RUN 指令就是這種格式。
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
exec 格式:RUN ["可執行文件", "參數1", "參數2"],這更像是函數調用中的格式。
FROM debian:jessie
RUN buildDeps='gcc libc6-dev make' \
&& apt-get update \
&& apt-get install -y $buildDeps \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-3.2.5.tar.gz" \
&& mkdir -p /usr/src/redis \
&& tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \
&& make -C /usr/src/redis \
&& make -C /usr/src/redis install \
&& rm -rf /var/lib/apt/lists/* \
&& rm redis.tar.gz \
&& rm -r /usr/src/redis \
&& apt-get purge -y --auto-remove $buildDeps
注意:1)使用一個 RUN 指令,並使用 && 將各個所需命令串聯起來,簡化爲了 1 層。
2)支持 Shell 類的行尾添加 \ 的命令換行方式,以及行首 # 進行註釋的格式。良好的格式,比如換行、縮進、註釋等,會讓維護、排障更爲容易。
3)命令的最後添加清理工作的命令,刪除了爲了編譯構建所需要的軟件,清理了所有下載、展開的、apt 緩存文件,確保每一層只添加真正需要添加的東西,清理任何無關的東西。
鏡像構建
在Dockerfile
文件所在目錄執行:$ docker build -t nginx:v3 .