如何使用 Dockerfile 創建自定義 Docker 鏡像
在這份指南中,我們將看到 Dockerfile 的簡要介紹以及如何在 Linux 中使用 Dockerfile 來自動的 創建自定義 Docker 鏡像 。
什麼是 Dockerfile ?
Dockerfile 是附有構建 Docker 鏡像說明的易於理解的文本文件。它囊括了用戶在創建鏡像時可以調用的所有命令。
我們可以使用 Dockerfile 創建自定義的鏡像。可以通過 Docker Hub 分享的自定義 Docker 鏡像。
如果你還不知道,Docker Hub 是 Docker 提供的託管存儲庫服務,用於團隊查找和共享容器鏡像,當然世界上任何人也都可以訪問。
想像一下,早期如果我們想用 Nginx,我們要通過很多步驟,才能安裝和配置好 Nginx 。得益於 Docker Hub ,現在我們可以在幾分鐘內,下載並運行 Nginx 的預置容器鏡像。
運行如下命令從 Docker Hub 上拉取 Nginx 鏡像:
# docker pull nginx
一旦我們拉取了 Docker 鏡像,可以運行如下命令使用它:
# docker run -it -d -p 8080:8080 nginx
就這樣,十分簡單!
參考下方鏈接,了解更多使用 Docker 的方式:
Docker Hub 上有超過十萬個來自軟體供應商、開源項目以及社區的容器鏡像。
你可以從 Docker Hub 上下載你選擇的鏡像,並且使用上面的命令開始使用它。
理解 Dockerfile 格式
Docker 可以讀取 Dockerfile 中的 指令 來自動的創建鏡像。
典型的 Dockerfile 包含如下指令:
1、FROM
—— 這會設置容器的基礎鏡像。
例如:
FROM ubuntu:22.04
這會將容器的基礎鏡像設置為 Ubuntu 。如果 『22.04』 這個標誌沒有特別指明,則會設為最新版本(latest
)。
2、LABEL
—— 這是用來明確鏡像的元數據信息的鍵值對。
例如:
LABEL ENV=「DEVELOPMENT」
3、RUN
—— 這會在基礎鏡像中執行指令並創建一個新層。
例如:
RUN apt-get update
RUN apt-get install tomcat
4、CMD
—— 這用來設置容器啟動後先執行的命令。
例如:
CMD ["java", "-jar", "app.jar"]
5、EXPOSE
—— 設置用於訪問容器的埠。容器將會監聽該埠。我們可以用來獲得輸出。
例如:
EXPOSE 8080
6、`MAINTAINER
—— 顯示創建鏡像作者的信息。
例如:
MAINTAINER info@ostechnix.com
7、ENV
—— 用來設置環境變數的鍵值對。這些變數在鏡像創建的時候設置,並在容器創建好後可以使用。
例如:
ENV DB_NAME=」MySQL」
ENV DB_VERSION=」8.0」
8、COPY
—— 用來拷貝本地文件至容器中。
例如:
COPY /target/devops.jar devops.jar
9、ADD
—— 具有與拷貝相同的功能,不過更進一步還可以提取本地的 tar 文件或者從 URL 拷貝文件。
例如:
ADD devops.tar.xz / .
ADD http://example.com/abc.git /usr/local/devops/
10、ENTRYPOINT
—— 用來設置鏡像的主要命令。與 CMD 指令功能相同。不同的是 ENTRYPOINT
中的指令不會被重寫。
例如:
ENTRYPOINT ["java", "-jar", "app.jar"]
11、VOLUME
—— 該指令用來創建指定位置的掛載點。
例如:
VOLUME /app/devops
12、USER
—— 將設置運行鏡像並使用的用戶名稱以及用戶組。
例如:
USER dhruv
USER admin
13、WORKDIR
—— 這會設置工作目錄。如果目錄不存在,則會創建。
例如:
WORKDIR /var/lib/
這是一個 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"]
我將向你展示創建一個 Dockerfile 、創建並使用鏡像的簡單例子。
創建一個 Dockerfile
創建一個名為 dockerfile
的文件:
# nano dockerfile
添加下面幾行命令。我們將更新並安裝 vim
和 curl
包:
FROM alpine
RUN apk update
RUN apk add vim
RUN apk add curl
按下 CTRL+O
和 CTRL+X
鍵保存文件並關閉。
現在 Dockerfile 已經就位。讓我們繼續,用該 Dockerfile 創建一個鏡像。
注意: 如果你在使用 Docker 桌面版,你可以以一個普通用戶運行
docker
命令。
使用 Dockerfile 創建 Docker 鏡像
只需運行以下命令,便可以使用 Dockerfile 創建 Docker 鏡像:
# docker build -t alpine .
請注意最後有一個 點(.
)。
輸出示例:
[+] 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 會通過保存在當前工作目錄中的 Dockerfile 中的命令開始自動的創建鏡像。還記得我們在 Dockerfile 中保存的 apk update
、apk add vim
和 apk add curl
命令嗎?這些命令也將會自動的執行。
如果 Dockerfile 保存在其他目錄,你可以使用 -f
標誌來指定路徑,例如:
# docker build -f /path/to/a/Dockerfile .
創建好鏡像後,我們可以使用如下命令運行它:
# docker run -it alpine
該命令會啟動這個 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 桌面版,你可以通過 容器 標籤頁界面來查看運行中的容器。
這就是使用 Dockerfile 構建自定義容器映像的方式。
我們僅僅講了基礎內容。你可以用 Dockerfile 做到很多東西。建議你參考一下官方 Dockerfile 參考 ,以了解更多內容。
via: https://ostechnix.com/a-brief-introduction-to-dockerfile/
作者:sk 選題:lkxed 譯者:Donkey 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive