Docker 是一種輕量級(jí)的容器化技術(shù),使得應(yīng)用程序和它們的依賴可以被打包到一個(gè)容器中,方便在不同環(huán)境中運(yùn)行。Dockerfile 是用于定義 Docker 鏡像的文本文件,其中包含了一系列的指令,這些指令描述了鏡像中應(yīng)該包含哪些內(nèi)容和如何配置。
1. 準(zhǔn)備工作
在開始編寫 Dockerfile 之前,確保你已經(jīng)在系統(tǒng)中安裝了 Docker。你可以從 Docker 官方網(wǎng)站 獲取安裝步驟,或者閱讀這里:https://blog.csdn.net/x1131230123/article/details/118032295。
2. 創(chuàng)建 Dockerfile
首先,創(chuàng)建一個(gè)空的目錄用于存放 Dockerfile 和相關(guān)文件。在該目錄下創(chuàng)建一個(gè)文本文件并命名為 Dockerfile
。
3. 編寫基本結(jié)構(gòu)
一個(gè)簡(jiǎn)單的 Dockerfile 通常包含以下基本結(jié)構(gòu):
# 使用基礎(chǔ)鏡像
FROM base_image:tag
# 維護(hù)者信息
MAINTAINER your_name
# 設(shè)置工作目錄
WORKDIR /app
# 復(fù)制本地文件到容器中
COPY ./local_files /app
# 安裝依賴
RUN apt-get update && apt-get install -y dependency_package
# 暴露端口
EXPOSE 8080
# 定義啟動(dòng)命令
CMD ["command_to_run"]
以上是一個(gè)簡(jiǎn)單的 Dockerfile,接下來(lái)我們逐步介紹每個(gè)指令的作用。
4. 指令詳解
FROM
FROM
指令用于指定基礎(chǔ)鏡像,即你的應(yīng)用程序?qū)⒃谄浠A(chǔ)上構(gòu)建。可以選擇官方鏡像,也可以選擇其他已有的鏡像。例如:
FROM ubuntu:20.04
MAINTAINER
MAINTAINER
指令用于設(shè)置維護(hù)者的信息。
MAINTAINER Your Name <your.email@example.com>
WORKDIR
WORKDIR
指令用于設(shè)置工作目錄,即在容器中執(zhí)行后續(xù)指令時(shí)的工作目錄。
WORKDIR /app
COPY
COPY
指令用于將本地文件復(fù)制到容器中??梢詮?fù)制單個(gè)文件,也可以復(fù)制整個(gè)目錄。
COPY ./local_files /app
RUN
RUN
指令用于在鏡像中執(zhí)行命令,例如安裝依賴。
RUN apt-get update && apt-get install -y dependency_package
EXPOSE
EXPOSE
指令用于聲明容器運(yùn)行時(shí)將監(jiān)聽的端口。這只是一個(gè)元數(shù)據(jù),實(shí)際運(yùn)行時(shí)需要使用 -p
選項(xiàng)映射端口。
EXPOSE 8080
CMD
CMD
指令用于定義容器啟動(dòng)時(shí)執(zhí)行的默認(rèn)命令。
CMD ["command_to_run"]
5. 實(shí)戰(zhàn)演練
接下來(lái),我們通過(guò)一個(gè)簡(jiǎn)單的 Node.js 應(yīng)用演示如何編寫 Dockerfile。
FROM node:14
WORKDIR /app
COPY package.json package-lock.json /app/
RUN npm install
COPY . /app/
EXPOSE 3000
CMD ["npm", "start"]
在上述示例中,我們使用 Node.js 的官方鏡像作為基礎(chǔ)鏡像,設(shè)置工作目錄,復(fù)制 package.json
和 package-lock.json
安裝依賴,復(fù)制所有文件到工作目錄,聲明監(jiān)聽端口為 3000,并定義啟動(dòng)命令為 npm start
。
6. 構(gòu)建鏡像和運(yùn)行容器
保存好 Dockerfile 后,可以使用以下命令構(gòu)建鏡像。在Docker中,docker build -t my-node-app .
中的小數(shù)點(diǎn)代表當(dāng)前上下文的路徑。這個(gè)路徑是構(gòu)建過(guò)程中 Docker 引擎查找 Dockerfile
和其他構(gòu)建上下文的文件的位置。
具體來(lái)說(shuō),docker build
命令會(huì)將指定的路徑(這里是小數(shù)點(diǎn) .
)作為構(gòu)建上下文。構(gòu)建上下文是構(gòu)建過(guò)程中用來(lái)查找 Dockerfile
和其他構(gòu)建文件的目錄。在這個(gè)例子中,.
表示當(dāng)前目錄,即你運(yùn)行 docker build
命令的目錄。
當(dāng)你運(yùn)行 docker build -t my-node-app .
時(shí),Docker 引擎會(huì)在當(dāng)前目錄下尋找 Dockerfile
文件,并將該目錄及其所有內(nèi)容作為構(gòu)建上下文。這樣,Dockerfile
就能夠引用當(dāng)前目錄中的文件,并將它們添加到 Docker 鏡像中。在給定目錄之外的文件是不能通過(guò)Docker指令操作的,比如想用COPY去拷貝別的目錄的文件到鏡像中。
docker build -t my-node-app .
然后,可以運(yùn)行容器:
docker run -p 3000:3000 my-node-app
現(xiàn)在,你的 Node.js 應(yīng)用將在 Docker 容器中運(yùn)行,并可以通過(guò) http://localhost:3000 訪問。
CMD 和 ENTRYPOINT 之間的區(qū)別
CMD 指令
CMD
指令用于定義容器啟動(dòng)時(shí)執(zhí)行的默認(rèn)命令。它有以下幾種形式:
-
CMD [“executable”,“param1”,“param2”] (exec 格式,推薦): 在指定的可執(zhí)行文件內(nèi)運(yùn)行參數(shù)。
CMD ["npm", "start"]
-
CMD [“param1”,“param2”] (作為 ENTRYPOINT 的默認(rèn)參數(shù)): 提供給 ENTRYPOINT 指令的默認(rèn)參數(shù)。
CMD ["npm", "start"]
-
CMD command param1 param2 (shell 格式): 在
/bin/sh -c
中執(zhí)行命令。CMD npm start
CMD
的主要作用是為容器提供默認(rèn)的執(zhí)行命令,但可以被在運(yùn)行容器時(shí)指定的命令覆蓋。
ENTRYPOINT 指令
ENTRYPOINT
指令用于配置容器啟動(dòng)時(shí)執(zhí)行的默認(rèn)可執(zhí)行文件。它有以下幾種形式:
-
ENTRYPOINT [“executable”, “param1”, “param2”] (exec 格式,推薦): 在指定的可執(zhí)行文件內(nèi)運(yùn)行參數(shù)。
ENTRYPOINT ["npm", "start"]
-
ENTRYPOINT command param1 param2 (shell 格式): 在
/bin/sh -c
中執(zhí)行命令。ENTRYPOINT npm start
使用 ENTRYPOINT
的主要目的是將容器配置為像可執(zhí)行程序一樣運(yùn)行。它的參數(shù)可以被 CMD
覆蓋,但不會(huì)被完全替代。如果給 docker run
提供了參數(shù),它們將追加到 ENTRYPOINT
的參數(shù)之后。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-821031.html
區(qū)別總結(jié)
-
CMD
提供容器默認(rèn)的執(zhí)行命令,可以被運(yùn)行容器時(shí)傳入的命令覆蓋。 -
ENTRYPOINT
配置容器啟動(dòng)時(shí)執(zhí)行的默認(rèn)可執(zhí)行文件,可以被運(yùn)行容器時(shí)傳入的命令追加到其參數(shù)之后。
綜合來(lái)說(shuō),CMD
通常用于提供應(yīng)用的默認(rèn)啟動(dòng)命令,而 ENTRYPOINT
通常用于配置容器以類似可執(zhí)行程序的方式運(yùn)行。你也可以同時(shí)使用它們,以 ENTRYPOINT
提供基礎(chǔ)執(zhí)行文件,而 CMD
提供默認(rèn)參數(shù)。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-821031.html
到了這里,關(guān)于【Docker】如何編寫Dockerfile,深入理解 Dockerfile:構(gòu)建精簡(jiǎn)且高效的容器鏡像的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!