在使用 Dockerfile 構建鏡像時喊熟,Dockerfile 是一個文本文件寄猩,包含了構建鏡像所需的步驟和指令。通過定義這些指令叶洞,Docker 可以自動化地生成自定義的 Docker 鏡像。以下是構建 Docker 鏡像的基本流程和一些常用指令的解釋:
構建鏡像的步驟
- 編寫 Dockerfile:首先需要編寫一個 Dockerfile 文件禀崖,定義你想要的鏡像的構建步驟和指令衩辟。
-
運行
docker build
命令:在包含 Dockerfile 的目錄中運行docker build
命令。Docker 會按照 Dockerfile 中的指令逐步構建鏡像帆焕。 -
查看生成的鏡像:構建完成后惭婿,可以使用
docker images
查看生成的鏡像,并使用該鏡像啟動容器叶雹。
常用 Dockerfile 指令
-
FROM
- 作用: 指定構建新鏡像所基于的基礎鏡像财饥。
-
示例:
FROM ubuntu:20.04
表示使用 Ubuntu 20.04 作為基礎鏡像。
-
RUN
- 作用: 在鏡像內執(zhí)行命令并提交執(zhí)行后的結果到鏡像層折晦。
-
示例:
RUN apt-get update && apt-get install -y nginx
安裝 nginx 到鏡像中钥星。
-
COPY
- 作用: 將文件從構建上下文(Dockerfile 所在目錄)復制到鏡像中的指定路徑。
-
示例:
COPY ./app /usr/src/app
將本地的app
目錄復制到容器中的/usr/src/app
路徑下满着。
-
ADD
-
作用: 功能類似于
COPY
谦炒,但還支持自動解壓歸檔文件(如.tar
)贯莺。同時,還可以從 URL 復制文件宁改。 -
示例:
ADD https://example.com/file.tar.gz /app/
會下載文件并自動解壓到/app/
路徑下缕探。
-
作用: 功能類似于
-
CMD
-
作用: 為容器指定默認的執(zhí)行命令。每個 Dockerfile 只能有一個
CMD
指令还蹲,多個會覆蓋爹耗。 -
示例:
CMD ["nginx", "-g", "daemon off;"]
表示啟動容器時運行 nginx。 -
注意:
CMD
的命令可以被docker run
命令行中指定的命令覆蓋谜喊。
-
作用: 為容器指定默認的執(zhí)行命令。每個 Dockerfile 只能有一個
-
ENTRYPOINT
-
作用: 為容器指定一個主進程(入口點)潭兽,與
CMD
類似,但ENTRYPOINT
更加固定斗遏,命令行參數(shù)會附加到ENTRYPOINT
后山卦。 -
示例:
ENTRYPOINT ["nginx", "-g", "daemon off;"]
固定了容器啟動時運行 nginx。
-
作用: 為容器指定一個主進程(入口點)潭兽,與
-
ENV
- 作用: 設置環(huán)境變量诵次,這些變量會在容器內使用账蓉。
-
示例:
ENV LANG=C.UTF-8 LC_ALL=C.UTF-8
設置環(huán)境變量。
-
WORKDIR
- 作用: 設置容器內的工作目錄藻懒,后續(xù)指令會在該目錄下執(zhí)行剔猿。
-
示例:
WORKDIR /usr/src/app
設定/usr/src/app
為工作目錄。
-
EXPOSE
- 作用: 聲明容器暴露的端口嬉荆,但不實際打開端口归敬。用于文檔化或幫助容器運行時映射端口。
-
示例:
EXPOSE 80
聲明容器服務會運行在端口 80 上鄙早。
-
VOLUME
- 作用: 聲明容器內的某個目錄為掛載點汪茧,通常用于數(shù)據(jù)持久化。
-
示例:
VOLUME /data
指定/data
為掛載點限番。
-
LABEL
- 作用: 為鏡像添加元數(shù)據(jù)標簽舱污,方便后續(xù)管理和查詢。
-
示例:
LABEL version="1.0"
為鏡像添加版本標簽弥虐。
-
USER
- 作用: 指定容器中運行進程的用戶扩灯。
-
示例:
USER www-data
指定使用www-data
用戶運行進程。
示例 Dockerfile
# 基礎鏡像
FROM ubuntu:20.04
# 設置環(huán)境變量
ENV LANG=C.UTF-8 LC_ALL=C.UTF-8
# 設置工作目錄
WORKDIR /usr/src/app
# 復制應用程序文件
COPY ./target /usr/src/app
# 安裝依賴
RUN apt-get update && apt-get install -y python3-pip
RUN pip3 install --no-cache-dir -r requirements.txt
# 暴露端口
EXPOSE 8080
# 運行應用程序
CMD ["python3", "app.py"]
示例requirements.txt
django==3.2
requests==2.25.1
numpy==1.19.5
示例app.py
print("Hello, World!")
執(zhí)行命令:
docker build -t mypython:v1 .
image.png
image.png
這個 Dockerfile 定義了一個基于 Ubuntu 的鏡像霜瘪,安裝了 Python 依賴珠插,并在容器啟動時運行 app.py
。