欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

docker利用dockerfile構建鏡像

 更新時間:2024年10月05日 16:22:59   作者:肖哥彈架構  
dockerfile是一種用于定義和構建docker鏡像的文本文件,由一行行指令和參數組成,用于描述鏡像的構建和配置過程;由基礎映像、軟件包安裝、文件拷貝、環(huán)境變量設置等組成

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。

復制文件: 使用 COPYADD 將文件添加到鏡像中。

掛載點: 定義一個掛載點。

暴露端口: 聲明容器運行時監(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 設置容器內的當前工作目錄。

復制指令 (COPYADD)

COPY . /app

COPY 從構建上下文復制新文件或目錄到容器的文件系統。

ADDCOPY 類似,但處理歸檔文件時有額外的功能。

 運行指令 (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格式化輸出命令:"docker?inspect?--format"?學習記錄

    Docker?--format?參數提供了基于?Go模板?的日志格式化輸出輔助功能,并提供了一些內置的增強函數,這篇文章主要介紹了Docker格式化輸出命令:"docker?inspect?--format"?學習筆記,需要的朋友可以參考下
    2023-01-01
  • 使用docker部署spring boot并接入skywalking的方法

    使用docker部署spring boot并接入skywalking的方法

    這篇文章給大家介紹如何使用手動和docker的方式使用 skywalking的相關知識,感興趣的朋友跟隨小編一起看看吧
    2021-04-04
  • docker安裝nginx容器的方法

    docker安裝nginx容器的方法

    Nginx也是一款服務器,我們常用它做如:反向代理、負載均衡、動態(tài)與靜態(tài)資源的分離的工作,這篇文章主要介紹了docker安裝nginx,需要的朋友可以參考下
    2023-01-01
  • 兩種方式創(chuàng)建docker鏡像的啟動容器時區(qū)別介紹(總結篇)

    兩種方式創(chuàng)建docker鏡像的啟動容器時區(qū)別介紹(總結篇)

    這篇文章主要介紹了基于兩種創(chuàng)建docker鏡像的啟動容器時區(qū)別總結,第一種凡是用docker commit生成的鏡像啟動的時候可以加載一個啟動自己應用的腳本,第二種用Docfile文件生成的鏡像時,來啟動容器就不用再加這個腳本了,具體詳情一起通過本文學習吧
    2016-10-10
  • Docker安裝配置RabbitMQ的實現步驟

    Docker安裝配置RabbitMQ的實現步驟

    RabbitMQ是基于AMQP的一款消息管理系統。AMQP(Advanced?Message?Queuing?Protocol),是一個提供消息服務的應用層標準高級消息隊列協議,其中RabbitMQ就是基于這種協議的一種實現
    2021-11-11
  • 解決docker訪問外部https數字證書問題

    解決docker訪問外部https數字證書問題

    這篇文章主要介紹了docker訪問外部https數字證書問題,為了解決證書驗證的問題,我們需要在構建 docker 鏡像的時候將 ca-certificates 根證書裝上,需要的朋友可以參考下
    2022-09-09
  • Docker中運行nginx并掛載本地目錄到鏡像中的方法

    Docker中運行nginx并掛載本地目錄到鏡像中的方法

    這篇文章主要介紹了Docker中運行nginx并掛載本地目錄到鏡像中的方法,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • Docker實現分布式應用功能教程

    Docker實現分布式應用功能教程

    這篇文章主要介紹了Docker實現分布式應用功能,涉及docker分布式應用、負載均衡相關實現技巧與操作注意事項,需要的朋友可以參考下
    2018-06-06
  • docker鏡像拉取速度過慢的解決方案

    docker鏡像拉取速度過慢的解決方案

    這篇文章主要介紹了docker鏡像拉取速度過慢的解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 如何將Docker的構建時間減少40%(推薦)

    如何將Docker的構建時間減少40%(推薦)

    這篇文章主要介紹了如何將Docker的構建時間減少40%,本文描述了我們在優(yōu)化CI管道后獲得的一些新見解,需要的朋友可以參考下
    2023-11-11

最新評論