docker利用dockerfile構建鏡像
dockerfile是一種用于定義和構建docker鏡像的文本文件,由一行行指令和參數組成,用于描述鏡像的構建和配置過程;由基礎映像、軟件包安裝、文件拷貝、環(huán)境變量設置等組成;
基于dockerfile構建鏡像可以使用docker build命令,使用 -f 可以指定具體的dockerfile文件;
使用dockerfile構建鏡像的步驟如下:編寫dockerfile文件-->docker build構建鏡像-->docker run運行鏡像;
Dockerfile概述
Dockerfile文件需放置在一個目錄中,這個目錄中有構建鏡像的所有文件,是本次執(zhí)行的上下文路目錄(可以理解為docker根目錄),可以創(chuàng)建子目錄。
在Dockerfile文件中,"#“號開頭表示注釋,每行為"INSTRUCTION arguments”,習慣大寫表示關鍵字(但并不區(qū)分大小寫),后面小寫表示值。
每個Dockerfile的第一行(注釋行除外),必須使用"FROM"關鍵字。
當使用docker build構建鏡像時,會將我們指定的上下文目錄打包傳遞給docker引擎。這個上下文目錄中并非所有文件都會在Dockerfile中使用,傳送給docker引擎的目錄過大會影響構建速度,可以在此目錄中定義.dockerignore文件,將不使用的文件的文件名寫入到.dockerignore文件屏蔽掉,且支持通配符。
最小化鏡像的層數,Dockerfile中每一行命令就是一層,層數過多影響構建效率。
Dockerfile文件中命令從上往下逐行執(zhí)行。
DockerFile鏡像的指令和參數
Dockerfile 是一個文本文件,它包含了用于構建 Docker 鏡像的一系列指令和參數。以下是 Dockerfile 的常見結構和組成部分:
指令 | 說明 |
---|---|
FROM | 指定基礎鏡像,開始構建新鏡像 |
RUN | 執(zhí)行命令并創(chuàng)建新的鏡像層 |
CMD | 提供容器啟動時執(zhí)行的默認命令 |
ENTRYPOINT | 設置容器啟動時的入口點 |
COPY | 從構建上下文復制新文件或目錄到鏡像中 |
ADD | 類似于 COPY,但可以解壓縮歸檔文件并添加執(zhí)行權限 |
ENV | 設置環(huán)境變量 |
ARG | 定義構建時使用的變量 |
VOLUME | 定義一個掛載點,用于數據持久化或共享 |
EXPOSE | 聲明容器運行時監(jiān)聽的端口 |
WORKDIR | 設置工作目錄 |
USER | 指定運行命令的用戶 |
HEALTHCHECK | 定義容器的健康檢查命令 |
ONBUILD | 指定當所創(chuàng)建的鏡像作為其他鏡像的基礎鏡像時執(zhí)行的命令 |
STOPSIGNAL | 配置停止容器的信號 |
LABEL | 為鏡像添加元數據 |
SHELL | 指定用于執(zhí)行 RUN、CMD、ENTRYPOINT 和 SCRIPT 指令的 shell |
MAINTAINER | 指定維護者的姓名和一個可選的電子郵件地址(已廢棄) |
DockerFile鏡像案例
# 使用基礎鏡像,這是構建新鏡像的起點 FROM ubuntu:20.04 AS base # 維護者信息(使用 LABEL 替代 MAINTAINER) LABEL maintainer="Name <email>" # 設置環(huán)境變量,這會影響后續(xù)的RUN指令以及容器運行時的環(huán)境 ENV MY_ENV_VAR="my_value" ENV PATH="/usr/local/bin:${PATH}" # RUN 指令執(zhí)行命令并創(chuàng)建一個新的鏡像層,用于安裝軟件包 RUN apt-get update && apt-get install -y \ curl \ git \ vim # 工作目錄 :WORKDIR 設置工作目錄,后續(xù)的RUN、CMD、ENTRYPOINT指令都會基于這個工作目錄 WORKDIR /app # 復制當前目錄內容到容器內的 /app 目錄下,COPY 從構建上下文(通常為Dockerfile所在的目錄)復制新文件或目錄到鏡像中 COPY . /app # 添加額外的文件到鏡像中:ADD 與COPY類似,但可以處理tar壓縮文件,并且可以執(zhí)行一些特殊操作 ADD ./files/* /app/files/ # 定義一個掛載點:VOLUME 定義一個掛載點,用于數據持久化或容器間數據共享 VOLUME /var/log/myapp # EXPOSE 聲明容器運行時監(jiān)聽的端口 EXPOSE 8000 # 指定容器啟動時執(zhí)行的命令:CMD 指令提供容器啟動時執(zhí)行的默認命令,可以被docker run的參數覆蓋 CMD ["python", "/app/main.py"] # 構建階段:編譯應用,使用多階段構建來減小最終鏡像的大小 FROM base AS builder RUN apt-get update && apt-get install -y build-essential COPY --from=base /app /app RUN make /app # 生產階段:運行應用,使用基礎鏡像作為構建產物的運行環(huán)境 FROM base AS production COPY --from=builder /app/bin /app/bin CMD ["/app/bin/myapp"] # 健康檢查: HEALTHCHECK 定義容器的健康檢查命令,提高容器的可靠性 HEALTHCHECK --interval=30s --timeout=30s --retries=3 \ CMD curl -f http://localhost:8000 || exit 1 # 用戶:USER 指定運行命令的用戶和用戶組,提高安全性 USER 1000:1000 # 構建緩存:ARG 定義構建緩存的變量,可以用于構建過程中的參數傳遞 ARG BUILD_DATE LABEL org.label-schema.build-date=$BUILD_DATE # 停止信號:STOPSIGNAL 配置停止容器的信號,可以是任何POSIX停止信號或數字 STOPSIGNAL SIGTERM # 使用 SHELL 指令 :SHELL 指定用于執(zhí)行指令的shell,可以是bash、sh等 SHELL ["/bin/bash", "-c"]
解釋
基礎鏡像: 使用 ubuntu:20.04
作為基礎鏡像。
維護者信息: 使用 LABEL
替代已廢棄的 MAINTAINER
。
環(huán)境變量: 設置環(huán)境變量 MY_ENV_VAR
和更新 PATH
。
更新和安裝軟件: 使用 RUN
安裝軟件包。
工作目錄: 設置工作目錄為 /app
。
復制文件: 使用 COPY
和 ADD
將文件添加到鏡像中。
掛載點: 定義一個掛載點。
暴露端口: 聲明容器運行時監(jiān)聽的端口。
默認命令: 設置容器啟動時執(zhí)行的默認命令。
構建階段: 使用 builder
階段編譯應用。
生產階段: 使用 production
階段運行應用。
健康檢查: 定義容器的健康檢查命令。
用戶: 指定運行命令的用戶。
構建緩存: 使用 ARG
定義構建時的變量。
停止信號: 配置停止容器的信號。
SHELL: 指定用于執(zhí)行指令的 shell。
命令詳細說明
基礎鏡像指令 (FROM
)
FROM ubuntu:20.04
FROM
指令指定了基礎鏡像,這是構建新鏡像的基礎。
維護者指令 (MAINTAINER
) (可選,已廢棄,建議使用 LABEL)
LABEL maintainer="name <email>"
LABEL
用于添加元數據,替代了以前的 MAINTAINER
指令。
環(huán)境變量指令 (ENV
)
ENV PATH /usr/local/bin:$PATH
ENV
用于設置環(huán)境變量。
工作目錄指令 (WORKDIR
)
WORKDIR /app
WORKDIR
設置容器內的當前工作目錄。
復制指令 (COPY
和 ADD
)
COPY . /app
COPY
從構建上下文復制新文件或目錄到容器的文件系統。
ADD
與 COPY
類似,但處理歸檔文件時有額外的功能。
運行指令 (RUN
)
RUN apt-get update && apt-get install -y nginx
RUN
指令用于執(zhí)行命令,并將其結果(如安裝的軟件)作為新的鏡像層保存。
暴露指令 (EXPOSE
)
EXPOSE 80
EXPOSE
指令通知 Docker 守護進程容器運行時監(jiān)聽的端口。
啟動命令指令 (CMD
)
CMD ["nginx", "-g", "daemon off;"]
CMD
指令指定了容器啟動時執(zhí)行的默認命令。
健康檢查指令 (HEALTHCHECK
)
HEALTHCHECK --interval=30s --timeout=30s --retries=3 CMD curl -f http://localhost || exit 1
HEALTHCHECK
指令用于指定如何檢查容器健康狀況。
構建緩存指令 (ARG
)
ARG VERSION=latest
ARG
指令用于定義構建過程中的變量。
多階段構建 (FROM
在 Dockerfile 中多次使用)
# 第一階段: 構建階段 FROM golang:1.16 AS builder WORKDIR /app COPY go.* ./ RUN go mod download COPY . . RUN go build -o /my-go-app # 第二階段: 生產環(huán)境 FROM alpine:latest RUN apk add --no-cache ca-certificates WORKDIR /root COPY --from=builder /my-go-app . CMD ["./my-go-app"]
使用多階段構建可以減小最終鏡像的大小,將構建產物從構建階段復制到生產環(huán)境鏡像。
DockerFile實戰(zhàn)案例1:Spring Boot應用
項目結構
假設我們的Spring Boot應用結構如下:
springbootapp/ ├── src/ │ ├── main/ │ │ ├── java/com/ │ │ │ └── example/ │ │ │ ├── controller/ │ │ │ │ └── HelloController.java │ │ │ └── Application.java │ │ └── resources/ │ │ └── application.properties ├── pom.xml └── Dockerfile
HelloController.java
是Spring Boot控制器。
Application.java
是Spring Boot應用的主程序。
application.properties
包含應用配置。
pom.xml
是Maven構建配置文件。
Dockerfile
# 使用官方Java基礎鏡像,帶有Maven環(huán)境,用于構建項目 FROM maven:3.8.1-jdk-11 AS build # 設置工作目錄 WORKDIR /app # 復制項目文件到容器中 COPY src ./src COPY pom.xml . # 使用Maven構建項目 RUN mvn -f pom.xml clean package # 使用官方Java基礎鏡像,用于運行應用 FROM openjdk:11-jre-slim # 設置工作目錄 WORKDIR /app # 從構建階段復制已構建的jar文件到運行階段 COPY --from=build /app/target/*.jar ./app.jar # 暴露端口 EXPOSE 8080 # 運行Spring Boot應用 CMD ["java", "-jar", "app.jar"]
構建和運行Docker鏡像
構建鏡像:
docker build -t springbootapp .
運行容器:
docker run -p 8080:8080 springbootapp
DockerFile實戰(zhàn)案例2:Spring Boot和MyBatis多模塊項目
項目結構
多模塊Spring Boot和MyBatis應用結構如下:
multimoduleapp/ ├── pom.xml ├── Dockerfile └── app/ ├── common/ │ ├── pom.xml │ └── src/ │ ├── main/ │ └── java/ │ └── com/ │ └── example/ │ └── common/ │ └── CommonService.java ├── api/ │ ├── pom.xml │ └── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── example/ │ │ │ └── api/ │ │ │ └── ApiController.java │ │ └── resources/ │ └── application.properties └── service/ ├── pom.xml ├── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── example/ │ │ │ └── service/ │ │ │ └── BusinessService.java │ │ └── resources/ └── src/ └── main/ └── resources/ └── mapper/ └── UserMapper.xml
CommonService.java
是一個通用服務。
ApiController.java
是Spring Boot控制器。
BusinessService.java
是業(yè)務邏輯服務。
UserMapper.xml
是MyBatis映射文件。
pom.xml
是Maven構建配置文件。
Dockerfile
# 使用官方Java基礎鏡像,帶有Maven環(huán)境,用于構建項目 FROM maven:3.8.1-jdk-11 AS build # 設置工作目錄 WORKDIR /app # 復制項目文件到容器中 COPY . . # 使用Maven構建項目 RUN mvn -f pom.xml clean package # 使用官方Java基礎鏡像,用于運行應用 FROM openjdk:11-jre-slim # 設置工作目錄 WORKDIR /app # 從構建階段復制已構建的jar文件到運行階段 COPY --from=build /app/api/target/*.jar ./app.jar # 暴露端口 EXPOSE 8080 # 運行Spring Boot應用 CMD ["java", "-jar", "app.jar"]
構建和運行Docker鏡像
構建鏡像:
docker build -t multimoduleapp .
運行容器:
docker run -p 8080:8080 multimoduleapp
總結
到此這篇關于docker利用dockerfile構建鏡像的文章就介紹到這了,更多相關dockerfile構建docker鏡像內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Docker格式化輸出命令:"docker?inspect?--format"?學習記錄
Docker?--format?參數提供了基于?Go模板?的日志格式化輸出輔助功能,并提供了一些內置的增強函數,這篇文章主要介紹了Docker格式化輸出命令:"docker?inspect?--format"?學習筆記,需要的朋友可以參考下2023-01-01使用docker部署spring boot并接入skywalking的方法
這篇文章給大家介紹如何使用手動和docker的方式使用 skywalking的相關知識,感興趣的朋友跟隨小編一起看看吧2021-04-04兩種方式創(chuàng)建docker鏡像的啟動容器時區(qū)別介紹(總結篇)
這篇文章主要介紹了基于兩種創(chuàng)建docker鏡像的啟動容器時區(qū)別總結,第一種凡是用docker commit生成的鏡像啟動的時候可以加載一個啟動自己應用的腳本,第二種用Docfile文件生成的鏡像時,來啟動容器就不用再加這個腳本了,具體詳情一起通過本文學習吧2016-10-10