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

