
Dockerfile 簡介
鏡像的定制實際上就是定制每一層所添加的配置、文件。如果我們可以把每一層修改、安裝、構(gòu)建、操作的命令都寫入一個腳本,用這個腳本來構(gòu)建、定制鏡像,那么之前提及的無法重復(fù)的問題、鏡像構(gòu)建透明性的問題、體積的問題就都會解決。這個腳本就是 Dockerfile。
Dcokerfile是一個文本文件,由一系列指令和參數(shù)構(gòu)建的腳本,每一條指令構(gòu)建一層,因此每一條指令的內(nèi)容,就是描述該層應(yīng)當(dāng)如何構(gòu)建。有了 Dockerfile,當(dāng)我們需要定制自己額外的需求時,只需在 Dockerfile 上添加或者修改指令,重新生成 image 即可,省去了敲命令的麻煩。
Dockerfile 文件格式
Dockerfile 分為四部分:基礎(chǔ)鏡像信息、維護(hù)者信息、鏡像操作指令、容器啟動執(zhí)行指令。
# This dockerfile uses the ubuntu image
# VERSION 2 - EDITION 1
# Author: docker_user
# Command format: Instruction [arguments / command] ..
# 1、第一行必須指定 基礎(chǔ)鏡像信息
FROM ubuntu
# 2、維護(hù)者信息
MAINTAINER docker_user docker_user@email.com
# 3、鏡像操作指令
RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list
RUN apt-get update && apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
# 4、容器啟動執(zhí)行指令
CMD /usr/sbin/nginx
RUN 指令:每執(zhí)行一條RUN 指令,鏡像添加新的一層,并提交
CMD 指令:來指明運行容器時的操作命令
可以使用一個 RUN 指令,并使用 && 將各個所需命令串聯(lián)起來。Dockerfile 支持 Shell 類的行尾添加 \ 的命令換行方式,以及行首 # 進(jìn)行注釋的格式。
構(gòu)建鏡像
以nginx 鏡像為例。在一個空白目錄中,建立一個文本文件,并命名為 Dockerfile
$ mkdir mynginx
$ cd mynginx
$ touch Dockerfile
Dockerfile 文件內(nèi)容為:
FROM nginx
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
在 Dockerfile 文件所在目錄執(zhí)行:(注意命令最后有一個 . 表示當(dāng)前目錄)
docker build -t nginx:v1 .
構(gòu)建完成之后,使用 docker images 命令查看所有鏡像
[root@localhost mynginx]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v1 2b06b1493d7c 24 seconds ago 109 MB
docker.io/nginx latest ae513a47849c 2 weeks ago 109 MB
docker.io/ubuntu latest 452a96d81c30 3 weeks ago 79.6 MB
docker.io/hello-world latest e38bc07ac18e 5 weeks ago 1.85 kB
使用 docker run 命令來啟動容器
docker run --name nginx_v1 -d -p 81:80 nginx:v1
這條命令表示用 nginx:v1 鏡像啟動一個容器,命名為nginx_v1,并且映射了 81 端口,這樣我們可以用瀏覽器去訪問這個 nginx 服務(wù)器

容器啟動后,需要對容器內(nèi)的文件進(jìn)行進(jìn)一步的完善,可以使用docker exec -it xx bash命令再次進(jìn)行修改
[root@localhost mynginx]# docker exec -it nginx_v1 bash
root@4277f160cd56:/# echo '<h1>Hello, admin!</h1>' > /usr/share/nginx/html/index.html
root@4277f160cd56:/# exit
修改了容器的文件,也就是改動了容器的存儲層,可以通過 docker diff 命令看到具體的改動
docker diff nginx_v1
其他docker鏡像構(gòu)建用法
docker build 還支持從 URL 構(gòu)建,比如可以直接從 Git repo 中構(gòu)建:
docker build https://github.com/twang2218/gitlab-ce-zh.git#:8.14
這行命令指定了構(gòu)建所需的 Git repo,并且指定默認(rèn)的 master 分支,構(gòu)建目錄為 /8.14/,然后 Docker 就會自己去 git clone 這個項目、切換到指定分支、并進(jìn)入到指定目錄后開始構(gòu)建。
用給定的 tar 壓縮包構(gòu)建
$ docker build http://server/context.tar.gz
參考
Dockerfile reference
Docker鏡像構(gòu)建文件Dockerfile及相關(guān)命令介紹
使用 Dockerfile 定制鏡像
深入Dockerfile(一): 語法指南