如何使用 Dockerfile 創(chuàng)建自定義 Docker 鏡像
在這份指南中,我們將看到 Dockerfile 的簡(jiǎn)要介紹以及如何在 Linux 中使用 Dockerfile 來自動(dòng)的 創(chuàng)建自定義 Docker 鏡像 。
什么是 Dockerfile ?
Dockerfile 是附有構(gòu)建 Docker 鏡像說明的易于理解的文本文件。它囊括了用戶在創(chuàng)建鏡像時(shí)可以調(diào)用的所有命令。
我們可以使用 Dockerfile 創(chuàng)建自定義的鏡像??梢酝ㄟ^ Docker Hub 分享的自定義 Docker 鏡像。
如果你還不知道,Docker Hub 是 Docker 提供的托管存儲(chǔ)庫服務(wù),用于團(tuán)隊(duì)查找和共享容器鏡像,當(dāng)然世界上任何人也都可以訪問。
想象一下,早期如果我們想用 Nginx,我們要通過很多步驟,才能安裝和配置好 Nginx 。得益于 Docker Hub ,現(xiàn)在我們可以在幾分鐘內(nèi),下載并運(yùn)行 Nginx 的預(yù)置容器鏡像。

Nginx Docker Image In Dockerhub
運(yùn)行如下命令從 Docker Hub 上拉取 Nginx 鏡像:
# docker pull nginx
一旦我們拉取了 Docker 鏡像,可以運(yùn)行如下命令使用它:
# docker run -it -d -p 8080:8080 nginx
就這樣,十分簡(jiǎn)單!
Docker Hub 上有超過十萬個(gè)來自軟件供應(yīng)商、開源項(xiàng)目以及社區(qū)的容器鏡像。
你可以從 Docker Hub 上下載你選擇的鏡像,并且使用上面的命令開始使用它。
理解 Dockerfile 格式
Docker 可以讀取 Dockerfile 中的 指令 來自動(dòng)的創(chuàng)建鏡像。
典型的 Dockerfile 包含如下指令:
1、FROM —— 這會(huì)設(shè)置容器的基礎(chǔ)鏡像。
例如:
FROM ubuntu:22.04
這會(huì)將容器的基礎(chǔ)鏡像設(shè)置為 Ubuntu 。如果 ‘22.04’ 這個(gè)標(biāo)志沒有特別指明,則會(huì)設(shè)為最新版本(latest)。
2、LABEL —— 這是用來明確鏡像的元數(shù)據(jù)信息的鍵值對(duì)。
例如:
LABEL ENV=“DEVELOPMENT”
3、RUN —— 這會(huì)在基礎(chǔ)鏡像中執(zhí)行指令并創(chuàng)建一個(gè)新層。
例如:
RUN apt-get update
RUN apt-get install tomcat
4、CMD —— 這用來設(shè)置容器啟動(dòng)后先執(zhí)行的命令。
例如:
CMD ["java", "-jar", "app.jar"]
5、EXPOSE —— 設(shè)置用于訪問容器的端口。容器將會(huì)監(jiān)聽該端口。我們可以用來獲得輸出。
例如:
EXPOSE 8080
6、``MAINTAINER` —— 顯示創(chuàng)建鏡像作者的信息。
例如:
MAINTAINER info@ostechnix.com
7、ENV —— 用來設(shè)置環(huán)境變量的鍵值對(duì)。這些變量在鏡像創(chuàng)建的時(shí)候設(shè)置,并在容器創(chuàng)建好后可以使用。
例如:
ENV DB_NAME=”MySQL”
ENV DB_VERSION=”8.0”
8、COPY —— 用來拷貝本地文件至容器中。
例如:
COPY /target/devops.jar devops.jar
9、ADD —— 具有與拷貝相同的功能,不過更進(jìn)一步還可以提取本地的 tar 文件或者從 URL 拷貝文件。
例如:
ADD devops.tar.xz / .
ADD http://example.com/abc.git /usr/local/devops/
10、ENTRYPOINT? —— 用來設(shè)置鏡像的主要命令。與 CMD 指令功能相同。不同的是 ENTRYPOINT 中的指令不會(huì)被重寫。
例如:
ENTRYPOINT ["java", "-jar", "app.jar"]
11、VOLUME —— 該指令用來創(chuàng)建指定位置的掛載點(diǎn)。
例如:
VOLUME /app/devops
12、USER —— 將設(shè)置運(yùn)行鏡像并使用的用戶名稱以及用戶組。
例如:
USER dhruv
USER admin
13、WORKDIR —— 這會(huì)設(shè)置工作目錄。如果目錄不存在,則會(huì)創(chuàng)建。
例如:
WORKDIR /var/lib/
這是一個(gè) Dockerfile 的樣本,可以參考一下:
FROM ubuntu:latest
MAINTAINER Senthilkumar Palani "info@ostechnix.com"
RUN apt-get install -y software-properties-common python
RUN add-apt-repository ppa:chris-lea/node.js
RUN echo "deb http://us.archive.ubuntu.com/ubuntu/ jammy universe" >>
/etc/apt/sources.list
RUN apt-get update
RUN apt-get install -y nodejs
RUN mkdir /var/www
ADD app.js /var/www/app.js
CMD ["/usr/bin/node", "/var/www/app.js"]
我將向你展示創(chuàng)建一個(gè) Dockerfile 、創(chuàng)建并使用鏡像的簡(jiǎn)單例子。
創(chuàng)建一個(gè) Dockerfile
創(chuàng)建一個(gè)名為 dockerfile 的文件:
# nano dockerfile
添加下面幾行命令。我們將更新并安裝 vim? 和 curl 包:
FROM alpine
RUN apk update
RUN apk add vim
RUN apk add curl

Dockerfile For Alpine Linux
按下 CTRL+O? 和 CTRL+X 鍵保存文件并關(guān)閉。
現(xiàn)在 Dockerfile 已經(jīng)就位。讓我們繼續(xù),用該 Dockerfile 創(chuàng)建一個(gè)鏡像。
注意: 如果你在使用 Docker 桌面版?,你可以以一個(gè)普通用戶運(yùn)行 docker 命令。
使用 Dockerfile 創(chuàng)建 Docker 鏡像
只需運(yùn)行以下命令,便可以使用 Dockerfile 創(chuàng)建 Docker 鏡像:
# docker build -t alpine .
請(qǐng)注意最后有一個(gè) 點(diǎn)(.)。
輸出示例:
[+] Building 51.2s (8/8) FINISHED
=> [internal] load build definition from Dockerfile 0.1s
=> => transferring dockerfile: 104B 0.0s
=> [internal] load .dockerignore 0.1s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/alpine:latest 38.8s
=> [1/4] FROM docker.io/library/alpine@sha256:7580ece7963bfa863801466c0a 2.7s
=> => resolve docker.io/library/alpine@sha256:7580ece7963bfa863801466c0a 0.0s
=> => sha256:d7d3d98c851ff3a95dbcb70ce09d186c9aaf7e25d48 1.47kB / 1.47kB 0.0s
=> => sha256:530afca65e2ea04227630ae746e0c85b2bd1a179379 2.80MB / 2.80MB 2.4s
=> => sha256:7580ece7963bfa863801466c0a488f11c86f85d9988 1.64kB / 1.64kB 0.0s
=> => sha256:9b2a28eb47540823042a2ba401386845089bb7b62a9637d 528B / 528B 0.0s
=> => extracting sha256:530afca65e2ea04227630ae746e0c85b2bd1a179379cbf2b 0.2s
=> [2/4] RUN apk update 4.3s
=> [3/4] RUN apk add vim 3.5s
=> [4/4] RUN apk add curl 1.3s
=> exporting to image 0.4s
=> => exporting layers 0.4s
=> => writing image sha256:14231deceb6e8e6105d2e551799ff174c184e8d9be8af 0.0s
=> => naming to docker.io/library/alpine 0.0s
Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them
按照上面的命令, Docker 會(huì)通過保存在當(dāng)前工作目錄中的 Dockerfile 中的命令開始自動(dòng)的創(chuàng)建鏡像。還記得我們?cè)?Dockerfile 中保存的 apk update、apk add vim? 和 apk add curl 命令嗎?這些命令也將會(huì)自動(dòng)的執(zhí)行。
如果 Dockerfile 保存在其他目錄,你可以使用 -f 標(biāo)志來指定路徑,例如:
# docker build -f /path/to/a/Dockerfile .
創(chuàng)建好鏡像后,我們可以使用如下命令運(yùn)行它:
# docker run -it alpine
該命令會(huì)啟動(dòng)這個(gè) Alpine 容器并連接到它。
/ # uname -a
Linux 8890fec82de8 5.10.104-linuxkit #1 SMP Thu Mar 17 17:08:06 UTC 2022 x86_64 Linux
/ # cat /etc/alpine-release
3.16.1
/ #
如果你使用 Docker 桌面版,你可以通過容器Containers標(biāo)簽頁界面來查看運(yùn)行中的容器。

View Containers In Docker Desktop
這就是使用 Dockerfile 構(gòu)建自定義容器映像的方式。
我們僅僅講了基礎(chǔ)內(nèi)容。你可以用 Dockerfile 做到很多東西。建議你參考一下官方 Dockerfile 參考 ,以了解更多內(nèi)容。


























