chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Docker鏡像構(gòu)建與管理指南

馬哥Linux運(yùn)維 ? 來源:馬哥Linux運(yùn)維 ? 2025-09-02 16:37 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

Docker 鏡像構(gòu)建與管理:打造標(biāo)準(zhǔn)化、可復(fù)用的容器鏡像

開篇:你是否也在鏡像管理上栽過跟頭?

凌晨2點(diǎn),生產(chǎn)環(huán)境突然告警,新部署的容器啟動(dòng)失敗。排查后發(fā)現(xiàn):開發(fā)環(huán)境用的鏡像800MB,生產(chǎn)環(huán)境的卻有3.2GB,里面塞滿了編譯工具、測試數(shù)據(jù),甚至還有開發(fā)同學(xué)的 SSH 私鑰...

這種"鏡像肥胖癥"你遇到過嗎?或者更糟糕的:

? 同一個(gè)服務(wù),測試環(huán)境能跑,生產(chǎn)環(huán)境啟動(dòng)就報(bào)錯(cuò)

? 鏡像倉庫里堆滿了 latest、v1、v1-final、v1-final-final 這種讓人崩潰的標(biāo)簽

? 構(gòu)建一次鏡像要等 20 分鐘,因?yàn)槊看味家匦孪螺d依賴包

今天這篇文章,我會(huì)基于 5 年運(yùn)維實(shí)戰(zhàn)經(jīng)驗(yàn),教你構(gòu)建一套標(biāo)準(zhǔn)化的鏡像管理體系:從多階段構(gòu)建優(yōu)化到鏡像安全掃描,從版本管理策略到自動(dòng)化構(gòu)建流程,讓你的鏡像體積縮小 70%、構(gòu)建速度提升 5 倍,并且永遠(yuǎn)不會(huì)再出現(xiàn)"這個(gè)鏡像到底能不能用"的靈魂拷問。

一、鏡像構(gòu)建的三大核心原則(90%的人都忽略了)

1. 最小化原則:鏡像里只放"必需品"

很多人寫 Dockerfile 就像搬家,什么都往里塞。我見過最離譜的:一個(gè) Node.js 應(yīng)用鏡像,里面包含了完整的 gcc 編譯工具鏈、Python3、甚至還有 vim 和 htop。

正確做法:分清"構(gòu)建時(shí)依賴"和"運(yùn)行時(shí)依賴"

#  錯(cuò)誤示例:單階段構(gòu)建,所有東西都打包進(jìn)去
FROMnode:16
WORKDIR/app
COPY. .
RUNnpm install
RUNnpm run build
CMD["npm","start"]
# 最終鏡像大?。?.2GB
#  正確示例:多階段構(gòu)建,只保留運(yùn)行時(shí)必需
# 構(gòu)建階段
FROMnode:16-alpine AS builder
WORKDIR/app
COPYpackage*.json ./
RUNnpm ci --only=production

# 運(yùn)行階段
FROMnode:16-alpine
WORKDIR/app
COPY--from=builder /app/node_modules ./node_modules
COPY. .
CMD["node","index.js"]
# 最終鏡像大?。?80MB

關(guān)鍵命令:docker history <鏡像名>查看每層大小,找出"肥胖層"

2. 可復(fù)現(xiàn)原則:今天能構(gòu)建,明年也要能構(gòu)建

我曾經(jīng)歷過這樣的生產(chǎn)事故:6個(gè)月前的鏡像需要重新構(gòu)建(修復(fù)安全漏洞),結(jié)果構(gòu)建失敗了——因?yàn)?Dockerfile 里寫的是apt-get install nginx,沒指定版本,新版本 nginx 配置格式變了。

鐵律:所有依賴必須鎖定版本

#  危險(xiǎn)寫法
RUNapt-get update && apt-get install -y nginx
RUNpip install flask

#  安全寫法
RUNapt-get update && apt-get install -y 
  nginx=1.18.0-6ubuntu14.4 
  &&rm-rf /var/lib/apt/lists/*
 
COPYrequirements.txt .
RUNpip install --no-cache-dir -r requirements.txt
# requirements.txt 中明確版本:flask==2.3.2

3. 安全原則:不要讓鏡像成為安全漏洞的溫床

血淚教訓(xùn):2023年某次安全審計(jì),發(fā)現(xiàn)生產(chǎn)環(huán)境30%的鏡像存在高危漏洞,原因是基礎(chǔ)鏡像用的ubuntu:latest,構(gòu)建后就沒更新過。

安全加固清單:

? 使用特定版本的基礎(chǔ)鏡像:FROM alpine:3.18.4而非FROM alpine:latest

? 創(chuàng)建非 root 用戶運(yùn)行應(yīng)用

? 刪除構(gòu)建緩存和包管理器緩存

? 定期掃描鏡像漏洞

# 安全鏡像模板
FROMpython:3.11-slim-bullseye

# 創(chuàng)建非root用戶
RUNgroupadd -r appuser && useradd -r -g appuser appuser

# 安裝依賴并清理緩存
COPYrequirements.txt .
RUNpip install --no-cache-dir -r requirements.txt 
  &&rm-rf /root/.cache/pip

# 切換到非root用戶
USERappuser

COPY--chown=appuser:appuser . /app
WORKDIR/app

CMD["python","app.py"]

二、實(shí)戰(zhàn):5步打造生產(chǎn)級(jí)鏡像構(gòu)建體系

Step 1:編寫高效的 Dockerfile(附最佳實(shí)踐模板)

核心技巧:利用構(gòu)建緩存機(jī)制,把變化頻率低的放前面

# 生產(chǎn)級(jí) Dockerfile 模板(以 Java Spring Boot 為例)
# 第一階段:依賴下載(利用緩存)
FROMmaven:3.8.6-openjdk-11-slim AS deps
WORKDIR/app
COPYpom.xml .
RUNmvn dependency:go-offline -B

# 第二階段:構(gòu)建應(yīng)用
FROMmaven:3.8.6-openjdk-11-slim AS builder
WORKDIR/app
COPY--from=deps /root/.m2 /root/.m2
COPY. .
RUNmvn clean package -DskipTests

# 第三階段:運(yùn)行時(shí)鏡像
FROMopenjdk:11-jre-slim
RUNgroupadd -r spring && useradd -r -g spring spring

# 安裝監(jiān)控工具(可選)
RUNapt-get update && apt-get install -y 
  curl=7.74.0-1.3+deb11u7 
  &&rm-rf /var/lib/apt/lists/*

# 復(fù)制 jar 包
COPY--from=builder /app/target/*.jar app.jar

# 健康檢查
HEALTHCHECK--interval=30s --timeout=3s --retries=3 
  CMD curl -f http://localhost:8080/actuator/health ||exit1

USERspring
EXPOSE8080
ENTRYPOINT["java","-Xmx512m","-jar","/app.jar"]

Step 2:構(gòu)建參數(shù)化(一個(gè) Dockerfile 適配多環(huán)境)

# 使用 ARG 實(shí)現(xiàn)構(gòu)建時(shí)參數(shù)化
ARGAPP_ENV=production
ARGNODE_VERSION=16-alpine

FROMnode:${NODE_VERSION} AS builder

# 根據(jù)環(huán)境安裝不同依賴
ARGAPP_ENV
RUNif["$APP_ENV"="development"];then
    npm install; 
 else
    npm ci --only=production; 
 fi

構(gòu)建命令:

# 開發(fā)環(huán)境構(gòu)建
docker build --build-arg APP_ENV=development -t myapp:dev .

# 生產(chǎn)環(huán)境構(gòu)建
docker build --build-arg APP_ENV=production -t myapp:prod .

Step 3:自動(dòng)化鏡像掃描(提前發(fā)現(xiàn)安全隱患)

實(shí)用腳本:鏡像安全掃描自動(dòng)化

#!/bin/bash
# scan_image.sh - 鏡像安全掃描腳本

IMAGE_NAME=$1
REPORT_FILE="scan_report_$(date +%Y%m%d_%H%M%S).json"

echo" 開始掃描鏡像:$IMAGE_NAME"

# 使用 Trivy 掃描(需提前安裝:apt-get install trivy)
trivy image --severity HIGH,CRITICAL 
     --format json 
     --output$REPORT_FILE
    $IMAGE_NAME

# 解析掃描結(jié)果
CRITICAL_COUNT=$(jq'[.Results[].Vulnerabilities[]? | select(.Severity=="CRITICAL")] | length'$REPORT_FILE)
HIGH_COUNT=$(jq'[.Results[].Vulnerabilities[]? | select(.Severity=="HIGH")] | length'$REPORT_FILE)

echo" 掃描結(jié)果:"
echo" - 嚴(yán)重漏洞:$CRITICAL_COUNT個(gè)"
echo" - 高危漏洞:$HIGH_COUNT個(gè)"

# 如果存在嚴(yán)重漏洞,阻止發(fā)布
if[$CRITICAL_COUNT-gt 0 ];then
 echo" 發(fā)現(xiàn)嚴(yán)重漏洞,禁止發(fā)布!"
 exit1
fi

echo" 安全檢查通過"

Step 4:鏡像版本管理(告別 latest 地獄)

標(biāo)準(zhǔn)化標(biāo)簽規(guī)范:

# 版本標(biāo)簽格式:<主版本>.<次版本>.<修訂版本>-<構(gòu)建號(hào)>-
# 示例:v1.2.3-20231125-7a3b5c9

#!/bin/bash
# tag_image.sh - 自動(dòng)生成鏡像標(biāo)簽

# 獲取版本信息
VERSION=$(catVERSION) # 從 VERSION 文件讀取
BUILD_DATE=$(date+%Y%m%d)
GIT_COMMIT=$(git rev-parse --short HEAD)

# 生成標(biāo)簽
TAG="v${VERSION}-${BUILD_DATE}-${GIT_COMMIT}"

# 構(gòu)建并打標(biāo)簽
docker build -t myapp:${TAG}.
docker tag myapp:${TAG}myapp:latest

# 推送到倉庫
docker push myapp:${TAG}
docker push myapp:latest

echo" 鏡像已發(fā)布: myapp:${TAG}"

Step 5:構(gòu)建流水線集成(CI/CD 最佳實(shí)踐)

GitLab CI 配置示例:

# .gitlab-ci.yml
stages:
-build
-scan
-push

variables:
DOCKER_REGISTRY:"registry.company.com"
IMAGE_NAME:"$DOCKER_REGISTRY/myapp"

build:
stage:build
script:
 -dockerbuild-t$IMAGE_NAME:$CI_COMMIT_SHA.
 -dockersave$IMAGE_NAME:$CI_COMMIT_SHA>image.tar
artifacts:
 paths:
  -image.tar
 expire_in:1hour

security_scan:
stage:scan
script:
 -dockerload

三、進(jìn)階優(yōu)化:讓鏡像構(gòu)建效率翻倍

1. 使用 BuildKit 加速構(gòu)建

# 開啟 BuildKit(構(gòu)建速度提升 30-50%)
exportDOCKER_BUILDKIT=1

# 利用 BuildKit 的并行構(gòu)建特性
docker build --build-arg BUILDKIT_INLINE_CACHE=1 
      --cache-from registry.company.com/myapp:latest 
      -t myapp:new .

2. 構(gòu)建緩存優(yōu)化策略

緩存優(yōu)化腳本:

#!/bin/bash
# optimize_cache.sh - 智能緩存管理

# 清理懸空鏡像
docker image prune -f

# 清理超過7天未使用的鏡像
docker image prune -a --filter"until=168h"-f

# 保留最近5個(gè)版本的鏡像
IMAGE_NAME="myapp"
docker images --format"{{.Repository}}:{{.Tag}}"| 
 grep"^${IMAGE_NAME}:"| 
sort-V | 
head-n -5 | 
 xargs -r docker rmi

echo" 緩存優(yōu)化完成"

3. 鏡像體積極限壓縮

壓縮技巧匯總:

? 使用 Alpine 基礎(chǔ)鏡像(比 Ubuntu 小 90%)

? 合并 RUN 指令減少層數(shù)

? 使用--no-install-recommends參數(shù)

? 刪除不必要的文檔和示例

# 極限壓縮示例(Go 應(yīng)用)
FROMgolang:1.20-alpine AS builder
WORKDIR/app
COPY. .
RUNCGO_ENABLED=0 go build -ldflags="-s -w"-o app

FROMscratch # 從零開始,終極精簡
COPY--from=builder /app/app /
ENTRYPOINT["/app"]
# 最終大?。? 10MB

四、踩坑血淚史:這些錯(cuò)誤你千萬別犯

坑1:在鏡像里存儲(chǔ)敏感信息

事故回放:2022年某次代碼審計(jì),發(fā)現(xiàn)鏡像里包含數(shù)據(jù)庫密碼、AWS Access Key。雖然代碼里用環(huán)境變量,但構(gòu)建時(shí)的.env文件被 COPY 進(jìn)去了。

解決方案:

# 使用 .dockerignore 排除敏感文件
# .dockerignore 內(nèi)容:
*.env
*.pem
.git/
.aws/

坑2:濫用 sudo 和 root 權(quán)限

教訓(xùn):容器被攻破后,攻擊者直接獲得宿主機(jī) root 權(quán)限。

正確做法:

# 永遠(yuǎn)不要在生產(chǎn)環(huán)境用 root 運(yùn)行
USER1000:1000 # 使用 UID 而非用戶名,避免用戶不存在的問題

坑3:忽視時(shí)區(qū)問題

癥狀:日志時(shí)間總是差8小時(shí),定時(shí)任務(wù)執(zhí)行時(shí)間錯(cuò)亂。

修復(fù)方法:

# 設(shè)置時(shí)區(qū)
ENVTZ=Asia/Shanghai
RUNln-snf /usr/share/zoneinfo/$TZ/etc/localtime &&echo$TZ> /etc/timezone

實(shí)用工具:一鍵鏡像優(yōu)化腳本

#!/bin/bash
# docker_optimize.sh - 一鍵優(yōu)化 Docker 鏡像

set-e

IMAGE_NAME=$1
OPTIMIZED_NAME="${IMAGE_NAME}_optimized"

echo" 開始優(yōu)化鏡像:$IMAGE_NAME"

# 1. 分析原始鏡像大小
ORIGINAL_SIZE=$(docker images --format"{{.Size}}"$IMAGE_NAME)
echo"原始大小:$ORIGINAL_SIZE"

# 2. 導(dǎo)出鏡像并重新導(dǎo)入(去除歷史層)
docker save$IMAGE_NAME| docker load

# 3. 使用 docker-slim 優(yōu)化(需提前安裝)
docker-slim build --target$IMAGE_NAME--tag$OPTIMIZED_NAME
         --http-probe=false
         --continue-after=10

# 4. 對比優(yōu)化效果
NEW_SIZE=$(docker images --format"{{.Size}}"$OPTIMIZED_NAME)
echo" 優(yōu)化完成"
echo" 原始大小:$ORIGINAL_SIZE"
echo" 優(yōu)化后:$NEW_SIZE"

# 5. 運(yùn)行測試
echo" 運(yùn)行測試..."
docker run --rm$OPTIMIZED_NAMEecho"Test passed"

echo" 優(yōu)化后的鏡像:$OPTIMIZED_NAME"

總結(jié):掌握這5步,鏡像管理不再是難題

回顧今天的核心內(nèi)容:

1.三大原則:最小化、可復(fù)現(xiàn)、安全性

2.五步體系:高效 Dockerfile → 參數(shù)化構(gòu)建 → 安全掃描 → 版本管理 → CI/CD 集成

3.優(yōu)化技巧:BuildKit 加速、緩存管理、極限壓縮

掌握這套方法論,你的鏡像將實(shí)現(xiàn):體積縮小70%、構(gòu)建速度提升5倍、安全漏洞降低90%。下次再遇到"鏡像太大""構(gòu)建太慢""版本混亂"的問題,10分鐘就能搞定。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 容器
    +關(guān)注

    關(guān)注

    0

    文章

    521

    瀏覽量

    22720
  • Docker
    +關(guān)注

    關(guān)注

    0

    文章

    525

    瀏覽量

    13696

原文標(biāo)題:Docker 鏡像構(gòu)建與管理:打造標(biāo)準(zhǔn)化、可復(fù)用的容器鏡像

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    怎么構(gòu)建docker鏡像倉庫軟件

    Docker Registry】用docker registry 鏡像搭建私有測試倉庫
    發(fā)表于 08-13 11:03

    采用CentOS7的JDK Docker鏡像構(gòu)建

    基于CentOS7構(gòu)建JDK Docker鏡像
    發(fā)表于 04-02 11:25

    Docker容器管理命令(一)

    1、Docker容器管理命令的使用方法查看當(dāng)前主機(jī)本地docker鏡像:啟動(dòng)容器必須依賴鏡像,所以要獲取到
    發(fā)表于 04-20 17:55

    構(gòu)建ARM64版本nacos docker鏡像

    在適配過程中有大量合作伙伴用到nacos且采用容器化部署,dockerhub未提供官方鏡像,因此需要在鯤鵬服務(wù)器自定義構(gòu)建構(gòu)建前提:Docker已部署
    發(fā)表于 06-16 14:29

    介紹一款非常方便的java領(lǐng)域docker鏡像構(gòu)建工具

    工具.亮點(diǎn)是不需要Docker daemon,意味著即使本地沒有安裝docker也能通過jib構(gòu)建docker鏡像,并且可以
    發(fā)表于 07-19 17:41

    Docker:微容器的優(yōu)勢與構(gòu)建教程

    非必要的東西也打包進(jìn)去,所以最后構(gòu)建出來的鏡像就很龐大,直接導(dǎo)致我們的容器也變得很大。對于剛?cè)腴T的Docker新手來說,大家一開始基本都是用的Docker官方
    發(fā)表于 10-10 11:32 ?0次下載

    Docker—簡介與鏡像用法

    阿里云官方鏡像站: ??https://developer.aliyun.com/mirror/?utm_content=g_1000303593?? ? 一、容器簡介 Docker管理容器的引擎
    發(fā)表于 11-25 16:28 ?739次閱讀
    <b class='flag-5'>Docker</b>—簡介與<b class='flag-5'>鏡像</b>用法

    Docker鏡像的詳細(xì)講解

    本文是對 Docker 鏡像的詳細(xì)講解,講解了如何安裝 Docker、配置 Docker 鏡像加速以及操作
    的頭像 發(fā)表于 08-02 10:00 ?2773次閱讀

    docker 搜索鏡像,docker查看鏡像詳細(xì)信息(docker下載鏡像命令)

    Docker Hub是集中管理Docker鏡像注冊中心。通過Docker 用戶可以在注冊中心搜索、下載和使用CLI命令行工具中的
    的頭像 發(fā)表于 07-19 09:46 ?2638次閱讀

    Dockerfile定義Docker鏡像構(gòu)建過程

    了解Dockerfile Dockerfile 是一個(gè)文本文件,用于定義 Docker 鏡像構(gòu)建過程。它以指令的形式描述了如何構(gòu)建鏡像,從
    的頭像 發(fā)表于 09-30 10:22 ?3111次閱讀

    如何在Windows系統(tǒng)上設(shè)置Docker鏡像

    在使用 Docker 進(jìn)行鏡像下載和構(gòu)建時(shí),由于眾所周知的原因,國內(nèi)用戶可能會(huì)遇到下載速度慢或者無法連接的問題。為了解決這個(gè)問題,我們可以使用國內(nèi)的鏡像源來加速下載速度。本文將介紹如何
    的頭像 發(fā)表于 10-24 16:55 ?8099次閱讀

    構(gòu)建docker鏡像應(yīng)該遵循哪些原則

    構(gòu)建 Docker 鏡像時(shí),應(yīng)遵循以下原則: 單一職責(zé):每個(gè)鏡像應(yīng)只包含一個(gè)應(yīng)用或服務(wù),避免將多個(gè)應(yīng)用或服務(wù)放在同一個(gè)鏡像中。這樣可以確保
    的頭像 發(fā)表于 11-23 09:41 ?1690次閱讀

    手動(dòng)構(gòu)建Docker鏡像的方法

    不推薦使用docker commit命令,而應(yīng)該使用更靈活、更強(qiáng)大的dockerfile來構(gòu)建docker鏡像
    的頭像 發(fā)表于 08-05 15:30 ?1211次閱讀
    手動(dòng)<b class='flag-5'>構(gòu)建</b><b class='flag-5'>Docker</b><b class='flag-5'>鏡像</b>的方法

    Docker-鏡像的分層-busybox鏡像制作

    目錄 知識(shí)點(diǎn)1:鏡像的分層 示例:進(jìn)入 docker hub查看Jenkins的Dockerfile 知識(shí)點(diǎn)2:base鏡像 知識(shí)點(diǎn)3:scratch鏡像 scratch
    的頭像 發(fā)表于 01-15 10:44 ?860次閱讀
    <b class='flag-5'>Docker</b>-<b class='flag-5'>鏡像</b>的分層-busybox<b class='flag-5'>鏡像</b>制作

    基于Docker鏡像逆向生成Dockerfile

    在本文中, 我們將通過理解Docker鏡像如何存儲(chǔ)數(shù)據(jù), 以及如何使用工具查看鏡像方方面面的信息來逆向工程一個(gè)Docker鏡像; 以及如何使
    的頭像 發(fā)表于 03-10 09:45 ?1101次閱讀
    基于<b class='flag-5'>Docker</b><b class='flag-5'>鏡像</b>逆向生成Dockerfile