初識 Dockerfile
之前我們學到如何從一個容器生成映象,本節我們學習如何使用 Dockerfile 從頭自定義構建映象。
Dockerfile 是 Docker 中用於定義映象自動化構建流程的配置檔案,在 Dockerfile 中,包含了構建映象過程中需要執行的命令和其他操作。它可以明確設定 Docker 映象的製作過程,幫助我們在容器體系下能夠完成自動構建。
1. 初識 Dockerfile
我們在本地新建一個目錄,編輯一個名為 Dockerfile 的檔案,注意檔名大小寫。
mkdir -p ~/docker/nginx/
cd ~/docker/nginx
vim Dockerfile
# 構建一個基於ubuntu的docker定製映象
# 基礎映象
FROM ubuntu
# 映象作者
MAINTAINER my_name [email protected]
# 執行命令
## 換成國內的軟體源
RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
RUN sed -i 's/security.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
## 安裝nginx
RUN apt update >/dev/null 2>&1
RUN apt install nginx - y >/dev/null 2>&1
# 暴露對外埠
EXPOSE 80
將程式碼儲存下來,嘗試構建映象。 在當前 Dockerfile 檔案所在目錄執行如下命令:
docker build --network=host -t ubuntu-nginx:v1 .
--network=host
使用宿主機的網路連線代理容器的網路(在一些情況下,容器可能無法順暢地連線外網)。
-t ubuntu-nginx:v1
指定生產的映象名稱為 ubuntu-nginx ,版本號為 v1。
2. 映象構建過程
我們執行 docker build --network=host -t ubuntu-nginx:v1 .
[user@centos8 nginx]$ docker build --network=host -t ubuntu-nginx:v1 .
# 將上下文求傳送給Docker引擎
Sending build context to Docker daemon 2.56kB
# 下載依賴的映象
Step 1/7 : FROM ubuntu
latest: Pulling from library/ubuntu
d51af753c3d3: Pull complete
fc878cd0a91c: Pull complete
6154df8ff988: Pull complete
fee5db0ff82f: Pull complete
Digest: sha256:747d2dbbaaee995098c9792d99bd333c6783ce56150d1b11e333bbceed5c54d7
Status: Downloaded newer image for ubuntu:latest
# 生成映象 1d622ef86b13
---> 1d622ef86b13
Step 2/7 : MAINTAINER my_name [email protected]
# 執行容器 4eec6e3094f0,在容器內執行上面的這個命令,標記維護者資訊
---> Running in 4eec6e3094f0
# 移除臨時容器 4eec6e3094f0
Removing intermediate container 4eec6e3094f0
# 生成映象 6679d1c204e3
---> 6679d1c204e3
Step 3/7 : RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
# 執行容器84d38c20d8c4,在容器內執行上面的這個命令,更換軟體源記錄
---> Running in 84d38c20d8c4
# 移除臨時容器 84d38c20d8c4
Removing intermediate container 84d38c20d8c4
# 生成映象 83f29f7b055a
---> 83f29f7b055a
Step 4/7 : RUN sed -i 's/security.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
# 執行容器 763e4493d93f, 在容器內執行上面的這個命令,更換軟體源記錄
---> Running in 763e4493d93f
# 移除臨時容器 763e4493d93f
Removing intermediate container 763e4493d93f
# 生成映象 6297f20605d9
---> 6297f20605d9
Step 5/7 : RUN apt update >/dev/null 2>&1
# 執行容器 2665a7e5a2e9,在容器內執行上面的這個命令, 更新軟體源快取
---> Running in 2665a7e5a2e9
# 移除臨時容器 2665a7e5a2e9
Removing intermediate container 2665a7e5a2e9
# 生成映象 fdfed940ca4d
---> fdfed940ca4d
Step 6/7 : RUN apt install nginx -y >/dev/null 2>&1
# 執行 容器 722a9a544643,在容器內執行上面的這個命令, 安裝nginx
---> Running in 722a9a544643
# 移除臨時容器 722a9a544643
Removing intermediate container 722a9a544643
# 生成映象 6ee76f7df9e5
---> 6ee76f7df9e5
Step 7/7 : EXPOSE 80
# 執行容器 a12ed3216ee0,在容器內執行上面的這個命令, 暴露80埠
---> Running in a12ed3216ee0
# 移除臨時容器 a12ed3216ee0
Removing intermediate container a12ed3216ee0
# 生成最終的映象 7cf64279ba98
---> 7cf64279ba98
Successfully built 7cf64279ba98
# 將這個映象標記命名 ubuntu-nginx 版本號v1
Successfully tagged ubuntu-nginx:v1
結合之前講到的 docker commit 命令,不難理解 Dockerfile 就是將我們在檔案中書寫的構建指令,一層一層從 FROM 指定的基礎映象使用臨時容器過渡,逐層疊加起來最終生成目標映象。
使用 docker history ubuntu-nginx:v1
命令可以驗證我們的想法:
[user@centos8 nginx]$ docker history ubuntu-nginx:v1
IMAGE CREATED CREATED BY SIZE COMMENT
7cf64279ba98 21 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
6ee76f7df9e5 21 minutes ago /bin/sh -c apt install nginx -y >/dev/null 2… 59.2MB
fdfed940ca4d 21 minutes ago /bin/sh -c apt update >/dev/null 2>&1 21.4MB
6297f20605d9 21 minutes ago /bin/sh -c sed -i 's/security.ubuntu.com/mir… 2.76kB
83f29f7b055a 21 minutes ago /bin/sh -c sed -i 's/archive.ubuntu.com/mirr… 2.76kB
6679d1c204e3 21 minutes ago /bin/sh -c #(nop) MAINTAINER my_name myemai… 0B
1d622ef86b13 2 weeks ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 2 weeks ago /bin/sh -c mkdir -p /run/systemd && echo 'do… 7B
<missing> 2 weeks ago /bin/sh -c set -xe && echo '#!/bin/sh' > /… 811B
<missing> 2 weeks ago /bin/sh -c [ -z "$(apt-get indextargets)" ] 1.01MB
<missing> 2 weeks ago /bin/sh -c #(nop) ADD file:a58c8b447951f9e30… 72.8MB
3. Dockerfile 的結構
Dockerfile 主要包含四部分內容:
- 基礎映象資訊;
- 維護者資訊;
- 映象操作指令;
- 容器啟動時指令。
我們可以將 Dockerfile 理解為一個由上往下執行指令的指令碼檔案。 當我們呼叫構建命令,通過我們給出的 Dockerfile 構建映象時,Docker 按照 指令順序進行對應的操作。
4. 小結
Dockerfile 是熟練掌握 Docker 的必備技能,它的優點有很多:
-
Dockerfile 的體積小,容易進行快速遷移部署;
-
環境構建流程記錄了 Dockerfile 中,能夠直觀的看到映象構建的順序和邏輯。
下一節,我們將深入學習 Dockerfile 常用的構建指令。