餐饮网站建设规划书广告制作商
餐饮网站建设规划书,广告制作商,网站改版的方式大致为,aws wordpress在第7章学习了如何构建Docker镜像后#xff0c;本章将深入探讨镜像构建的最佳实践。这些实践不仅能让你的镜像更小、更快、更安全#xff0c;还能提升开发和部署效率。
8.1 选择合适的基础镜像
8.1.1 官方镜像 vs 社区镜像
# 优先选择官方镜像
docker pull python:3.11 …在第7章学习了如何构建Docker镜像后本章将深入探讨镜像构建的最佳实践。这些实践不仅能让你的镜像更小、更快、更安全还能提升开发和部署效率。8.1 选择合适的基础镜像8.1.1 官方镜像 vs 社区镜像# 优先选择官方镜像dockerpull python:3.11# 官方Python镜像dockerpull nginx:latest# 官方Nginx镜像dockerpull node:18# 官方Node.js镜像# 验证官方镜像dockersearch python --filteris-officialtrue选择标准优先级排序官方镜像Official Images认证镜像Verified Publisher高星标社区镜像Stars 100安全性考虑# 查看镜像的安全扫描报告# Docker Hub上查看 Security View vulnerabilities维护活跃度最近更新时间版本发布频率社区活跃度8.1.2 完整镜像 vs 精简镜像对比分析镜像类型大小适用场景优点缺点标准版~1GB开发调试工具齐全体积大Slim版~200MB生产环境体积适中少数工具缺失Alpine版~50MB微服务极小体积兼容性问题实例对比# Python镜像大小对比dockerpull python:3.11# 1.01GBdockerpull python:3.11-slim# 130MBdockerpull python:3.11-alpine# 51MB# 查看镜像大小dockerimages python# REPOSITORY TAG SIZE# python 3.11 1.01GB# python 3.11-slim 130MB# python 3.11-alpine 51MB8.1.3 Alpine Linux极致精简优点体积极小基础镜像仅5MB安全性高攻击面小启动速度快注意事项# Alpine使用musl libc可能有兼容性问题 FROM python:3.11-alpine # 需要安装编译依赖 RUN apk add --no-cache \ gcc \ musl-dev \ linux-headers # 某些包可能需要额外处理 RUN pip install --no-cache-dir numpy兼容性问题示例# Alpine中可能遇到的问题# 1. glibc依赖问题# 2. 编译依赖缺失# 3. 二进制包不兼容# 解决方案使用slim版本FROM python:3.11-slim8.1.4 选择决策流程是否需要完整工具链 ├─ 是 → 使用标准版开发/调试 └─ 否 → 是否有特殊依赖 ├─ 是 → 使用slim版生产环境 └─ 否 → 使用alpine版微服务实践建议# 开发环境使用标准版 FROM python:3.11 # 测试环境使用slim版 FROM python:3.11-slim # 生产环境根据需求选择 FROM python:3.11-alpine # 简单应用 FROM python:3.11-slim # 复杂依赖8.2 减小镜像体积8.2.1 合并RUN指令❌ 不好的做法多层FROM ubuntu:22.04 RUN apt-get update RUN apt-get install -y curl RUN apt-get install -y vim RUN apt-get install -y git RUN rm -rf /var/lib/apt/lists/* # 结果5个额外的层缓存的中间文件未清理✅ 好的做法单层FROM ubuntu:22.04 RUN apt-get update apt-get install -y \ curl \ vim \ git \ rm -rf /var/lib/apt/lists/* # 结果1个层中间文件已清理对比效果# 不好的做法LAYER1:apt-getupdate(45MB)LAYER2:installcurl(10MB)LAYER3:installvim(15MB)LAYER4:installgit(20MB)LAYER5:rm-rf(0MB, 但前面的垃圾已保存)总计90MB# 好的做法LAYER1: update install clean(35MB)总计35MB节省55MB8.2.2 清理不必要的文件FROM python:3.11-slim WORKDIR /app # 安装依赖并清理 RUN pip install --no-cache-dir \ flask2.3.0 \ gunicorn20.1.0 \ rm -rf ~/.cache/pip # 注意--no-cache-dir防止缓存减小镜像体积常见清理命令# Debian/Ubuntu系统 RUN apt-get update apt-get install -y package \ rm -rf /var/lib/apt/lists/* # Alpine系统 RUN apk add --no-cache package # Python RUN pip install --no-cache-dir package # Node.js RUN npm install --production npm cache clean --force # 清理临时文件 RUN rm -rf /tmp/* /var/tmp/*8.2.3 使用多阶段构建场景编译型应用# 构建阶段 FROM golang:1.21 AS builder WORKDIR /app COPY go.mod go.sum ./ RUN go mod download COPY . . RUN CGO_ENABLED0 GOOSlinux go build -o myapp # 运行阶段 FROM alpine:3.18 # 只复制二进制文件 COPY --frombuilder /app/myapp /usr/local/bin/myapp CMD [myapp]大小对比# 单阶段构建FROM golang:1.21...# 镜像大小1.2GB包含完整Go工具链# 多阶段构建FROM alpine:3.18 COPY --frombuilder...# 镜像大小15MB只包含二进制文件# 节省1.185GB98.75%前端应用示例# 构建阶段 FROM node:18 AS builder WORKDIR /app COPY package*.json ./ RUN npm ci --onlyproduction COPY . . RUN npm run build # 运行阶段 FROM nginx:alpine # 只复制构建产物 COPY --frombuilder /app/dist /usr/share/nginx/html EXPOSE 80 CMD [nginx, -g, daemon off;]8.2.4 选择性复制文件❌ 复制所有内容FROM python:3.11-slim WORKDIR /app # 复制所有文件包括.git、node_modules等 COPY . . RUN pip install -r requirements.txt✅ 分层复制利用缓存FROM python:3.11-slim WORKDIR /app # 先复制依赖文件 COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # 再复制源代码 COPY src/ ./src/ CMD [python, src/app.py]优化原因代码修改时 ├─ 依赖未变 → 使用缓存层快速 └─ 只重建代码层秒级 依赖修改时 └─ 重建依赖层和代码层分钟级8.2.5 移除调试工具开发镜像 vs 生产镜像# 开发镜像 FROM python:3.11 RUN apt-get update apt-get install -y \ vim \ curl \ wget \ net-tools \ tcpdump \ strace COPY . /app WORKDIR /app RUN pip install -r requirements.txt # 镜像大小1.5GB # 生产镜像 FROM python:3.11-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY src/ ./src/ USER nobody CMD [python, src/app.py] # 镜像大小250MB8.3 优化镜像层8.3.1 理解镜像层# 查看镜像层dockerhistorynginx:alpine# 输出示例# IMAGE CREATED BY SIZE# f8f4ffc8092c CMD [nginx -g daemon off;] 0B# missing STOPSIGNAL SIGQUIT 0B# missing EXPOSE map[80/tcp:{}] 0B# missing COPY nginx.conf /etc/nginx/nginx.conf 2KB# missing RUN apk add --no-cache nginx 10MB# missing FROM alpine:3.18 7MB层的特点每个Dockerfile指令创建一层层是只读的层可以被多个镜像共享删除文件不会减小前面层的大小8.3.2 层数优化原则原则1合并相关操作# ❌ 不好多个RUN指令 RUN apt-get update RUN apt-get install -y python3 RUN apt-get clean # ✅ 好合并为一个RUN RUN apt-get update \ apt-get install -y python3 \ apt-get clean原则2不要在不同层删除文件# ❌ 不好文件已在前面层保存 RUN wget https://example.com/bigfile.tar.gz RUN tar -xzf bigfile.tar.gz RUN rm bigfile.tar.gz # 这一层不会减小镜像大小 # ✅ 好在同一层中删除 RUN wget https://example.com/bigfile.tar.gz \ tar -xzf bigfile.tar.gz \ rm bigfile.tar.gz原则3合理利用缓存# 依赖变化少的放前面 FROM python:3.11-slim # 1. 系统依赖很少变化 RUN apt-get update apt-get install -y \ gcc \ rm -rf /var/lib/apt/lists/* # 2. Python依赖偶尔变化 COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # 3. 源代码经常变化 COPY . .8.3.3 实战示例优化Node.js应用优化前600MB构建慢FROM node:18 WORKDIR /app COPY . . RUN npm install RUN npm run build EXPOSE 3000 CMD [npm, start]优化后150MB构建快# 依赖阶段 FROM node:18-alpine AS deps WORKDIR /app COPY package*.json ./ RUN npm ci --onlyproduction # 构建阶段 FROM node:18-alpine AS builder WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . RUN npm run build # 运行阶段 FROM node:18-alpine AS runner WORKDIR /app # 复制依赖 COPY --fromdeps /app/node_modules ./node_modules # 复制构建产物 COPY --frombuilder /app/dist ./dist COPY package*.json ./ ENV NODE_ENVproduction EXPOSE 3000 USER node CMD [node, dist/index.js]优化效果# 构建时间对比优化前:5分30秒 优化后:2分10秒首次30秒代码改动后# 镜像大小对比优化前: 600MB 优化后: 150MB# 节省: 75%8.4 使用 .dockerignore8.4.1 .dockerignore 的作用# 查看构建上下文大小dockerbuild --no-cache.# Sending build context to Docker daemon 850.5MB# 添加.dockerignore后# Sending build context to Docker daemon 2.5MB8.4.2 基本语法# .dockerignore # 忽略Git相关 .git .gitignore .github # 忽略构建产物 node_modules dist build *.log # 忽略测试文件 **/test **/*.test.js coverage # 忽略文档 README.md docs *.md # 忽略环境配置 .env .env.local .env*.local # 忽略IDE配置 .vscode .idea *.swp *.swo # 但保留特定文件使用! !README.md8.4.3 常见项目模板Python项目# Python __pycache__ *.py[cod] *$py.class *.so .Python env/ venv/ ENV/ *.egg *.egg-info/ dist/ build/ # 测试和覆盖率 .pytest_cache .coverage htmlcov/ .tox/ # Jupyter .ipynb_checkpoints # IDE .vscode .idea # 其他 .git .gitignore README.md docker-compose.yml Dockerfile .dockerignoreNode.js项目# 依赖 node_modules npm-debug.log yarn-error.log package-lock.json yarn.lock # 构建 dist build .next out # 测试 coverage .nyc_output # 环境 .env .env.local .env*.local # IDE .vscode .idea # 其他 .git .gitignore README.md *.md Dockerfile .dockerignore docker-compose*.ymlGo项目# 二进制 *.exe *.exe~ *.dll *.so *.dylib *.test # 构建 vendor/ bin/ dist/ # 测试 *.out coverage.txt # IDE .vscode .idea # 其他 .git .gitignore README.md Makefile docker-compose.yml Dockerfile .dockerignore8.4.4 验证 .dockerignore# 方法1构建时查看上下文大小dockerbuild --no-cache.# 方法2使用docker-compose更详细docker-composebuild --no-cache --progressplain# 方法3手动打包验证tar-czf context.tar.gz.--exclude-from.dockerignorels-lh context.tar.gz8.5 安全扫描与漏洞修复8.5.1 镜像安全扫描使用Docker ScoutDocker官方工具# 启用Docker Scoutdockerscout quickview# 扫描本地镜像dockerscout cves myapp:latest# 输出示例# Target: myapp:latest# Platform: linux/amd64## Vulnerabilities: 42 C: 5 H: 12 M: 20 L: 5## Critical: 5# CVE-2023-xxxx High openssl 1.1.1n# CVE-2023-yyyy High curl 7.68.0使用Trivy开源扫描工具# 安装Trivycurl-sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh|sh-s -- -b /usr/local/bin# 扫描镜像trivy image myapp:latest# 只显示高危和严重漏洞trivy image --severity HIGH,CRITICAL myapp:latest# 导出扫描报告trivy image -f json -o report.json myapp:latest8.5.2 漏洞修复策略策略1更新基础镜像# ❌ 使用旧版本 FROM python:3.9 # ✅ 使用最新稳定版 FROM python:3.11-slim # 定期重新构建镜像 docker build --no-cache -t myapp:latest .策略2更新系统包FROM ubuntu:22.04 # 更新系统包 RUN apt-get update \ apt-get upgrade -y \ apt-get install -y --no-install-recommends \ package1 \ package2 \ rm -rf /var/lib/apt/lists/*策略3更新应用依赖FROM python:3.11-slim WORKDIR /app # 更新pip RUN pip install --upgrade pip # 使用最新安全版本 COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt8.5.3 安全最佳实践1. 使用非root用户FROM python:3.11-slim WORKDIR /app # 创建非root用户 RUN groupadd -r appuser useradd -r -g appuser appuser COPY --chownappuser:appuser . . RUN pip install --no-cache-dir -r requirements.txt # 切换到非root用户 USER appuser CMD [python, app.py]2. 最小权限原则FROM nginx:alpine # 只复制必要文件 COPY --chownnginx:nginx nginx.conf /etc/nginx/nginx.conf COPY --chownnginx:nginx html /usr/share/nginx/html # 使用只读根文件系统 # docker run --read-only -v /tmp:/tmp myapp # 移除不必要的SUID/SGID RUN find / -perm /6000 -type f -exec chmod a-s {} \; 2/dev/null || true USER nginx3. 使用HTTPS下载依赖FROM python:3.11-slim # ✅ 使用HTTPS RUN pip install --index-url https://pypi.org/simple/ package # ❌ 避免HTTP # RUN pip install --index-url http://pypi.org/simple/ package4. 验证下载的文件FROM alpine:3.18 # 下载并验证 RUN wget https://example.com/app.tar.gz \ echo expected-sha256-hash app.tar.gz | sha256sum -c - \ tar -xzf app.tar.gz \ rm app.tar.gz8.5.4 持续监控# CI/CD中集成安全扫描# .gitlab-ci.ymlsecurity_scan: stage:testscript: -dockerbuild -t$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA.- trivy image --exit-code1--severity HIGH,CRITICAL$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA# GitHub Actions# .github/workflows/scan.yml- name: Run Trivy vulnerability scanner uses: aquasecurity/trivy-actionmaster with: image-ref:myapp:latestseverity:HIGH,CRITICAL8.6 镜像签名与验证8.6.1 Docker Content Trust# 启用内容信任exportDOCKER_CONTENT_TRUST1# 推送镜像自动签名dockerpush myregistry.com/myapp:1.0# 拉取镜像自动验证dockerpull myregistry.com/myapp:1.0# 查看镜像签名dockertrust inspect --pretty myregistry.com/myapp:1.08.6.2 使用Cosign签名# 安装Cosigncurl-sL https://github.com/sigstore/cosign/releases/latest/download/cosign-linux-amd64\-o /usr/local/bin/cosignchmodx /usr/local/bin/cosign# 生成密钥对cosign generate-key-pair# 签名镜像cosign sign --key cosign.key myregistry.com/myapp:1.0# 验证镜像cosign verify --key cosign.pub myregistry.com/myapp:1.08.7 实战优化ROCm应用镜像8.7.1 优化前的镜像FROM ubuntu:22.04 # 安装ROCm RUN apt-get update apt-get install -y wget gnupg RUN wget -q -O - https://repo.radeon.com/rocm/rocm.gpg.key | apt-key add - RUN echo deb [archamd64] https://repo.radeon.com/rocm/apt/5.7/ ubuntu main /etc/apt/sources.list.d/rocm.list RUN apt-get update apt-get install -y rocm-dkms # 安装应用依赖 COPY . /app WORKDIR /app RUN pip install -r requirements.txt CMD [python, app.py] # 镜像大小8.5GB8.7.2 优化后的镜像# 基础阶段 FROM rocm/dev-ubuntu-22.04:5.7 AS base # 依赖阶段 FROM base AS deps WORKDIR /app # 只复制依赖文件 COPY requirements.txt . # 安装依赖并清理 RUN pip install --no-cache-dir -r requirements.txt \ rm -rf ~/.cache/pip # 运行阶段 FROM base AS runner WORKDIR /app # 从依赖阶段复制已安装的包 COPY --fromdeps /usr/local/lib/python3.10/site-packages /usr/local/lib/python3.10/site-packages # 复制应用代码 COPY src/ ./src/ # 创建非root用户 RUN groupadd -r rocm useradd -r -g rocm rocm \ chown -R rocm:rocm /app USER rocm ENV ROCM_PATH/opt/rocm ENV PATH$PATH:$ROCM_PATH/bin CMD [python, src/app.py] # 镜像大小3.2GB节省62%8.7.3 进一步优化建议# 使用.dockerignore # .dockerignore内容 # .git # tests # docs # *.md # .vscode # 多阶段构建示例 FROM rocm/dev-ubuntu-22.04:5.7 AS builder WORKDIR /build COPY . . RUN make build # 最小运行时镜像 FROM rocm/rocm-runtime:5.7 WORKDIR /app COPY --frombuilder /build/bin/app . USER nobody CMD [./app] # 最终镜像1.8GB节省78%8.8 镜像标签管理策略8.8.1 版本标签规范# 语义化版本dockertag myapp:latest myapp:1.0.0dockertag myapp:latest myapp:1.0dockertag myapp:latest myapp:1# Git提交标签GIT_COMMIT$(gitrev-parse --short HEAD)dockertag myapp:latest myapp:git-$GIT_COMMIT# 构建日期BUILD_DATE$(date%Y%m%d)dockertag myapp:latest myapp:$BUILD_DATE# 环境标签dockertag myapp:latest myapp:devdockertag myapp:latest myapp:stagingdockertag myapp:1.0.0 myapp:prod8.8.2 自动化标签脚本#!/bin/bash# tag-and-push.shIMAGE_NAMEmyappREGISTRYmyregistry.comVERSION$1if[-z$VERSION];thenechoUsage:$0versionexit1fi# 提取主版本和次版本MAJOR$(echo$VERSION|cut-d. -f1)MINOR$(echo$VERSION|cut-d. -f1-2)# 打标签dockertag$IMAGE_NAME:latest$REGISTRY/$IMAGE_NAME:$VERSIONdockertag$IMAGE_NAME:latest$REGISTRY/$IMAGE_NAME:$MINORdockertag$IMAGE_NAME:latest$REGISTRY/$IMAGE_NAME:$MAJORdockertag$IMAGE_NAME:latest$REGISTRY/$IMAGE_NAME:latest# 推送所有标签dockerpush$REGISTRY/$IMAGE_NAME:$VERSIONdockerpush$REGISTRY/$IMAGE_NAME:$MINORdockerpush$REGISTRY/$IMAGE_NAME:$MAJORdockerpush$REGISTRY/$IMAGE_NAME:latestechoTagged and pushed:$VERSION,$MINOR,$MAJOR, latest8.9 性能优化技巧8.9.1 利用BuildKit# 启用BuildKitexportDOCKER_BUILDKIT1# 使用BuildKit特性dockerbuild --build-argBUILDKIT_INLINE_CACHE1-t myapp:latest.# 并行构建多阶段dockerbuild --target production -t myapp:prod.Dockerfile中使用BuildKit特性# syntaxdocker/dockerfile:1.4 FROM python:3.11-slim # 使用cache mount加速依赖安装 RUN --mounttypecache,target/root/.cache/pip \ pip install -r requirements.txt # 使用secret mount处理敏感信息 RUN --mounttypesecret,idgithub_token \ git clone https://$(cat /run/secrets/github_token)github.com/user/repo.git8.9.2 并行构建# 使用--parallel构建多个平台dockerbuildx build --platform linux/amd64,linux/arm64 -t myapp:latest.# 使用--cache-from加速dockerbuild\--cache-from myapp:cache\-t myapp:latest.8.10 小结通过本章学习我们掌握了Docker镜像的最佳实践✅基础镜像选择官方 vs 社区镜像完整版 vs 精简版 vs Alpine选择决策流程✅体积优化合并RUN指令清理不必要文件多阶段构建选择性复制文件✅层优化理解镜像层机制合并相关操作合理利用缓存✅使用.dockerignore减小构建上下文常见项目模板验证方法✅安全实践漏洞扫描安全修复策略非root用户镜像签名✅实战优化ROCm应用镜像优化标签管理策略性能优化技巧关键要点实践效果优先级使用slim/alpine镜像体积减小70-90%⭐⭐⭐⭐⭐多阶段构建体积减小60-95%⭐⭐⭐⭐⭐合并RUN指令体积减小20-40%⭐⭐⭐⭐使用.dockerignore构建速度提升50%⭐⭐⭐⭐安全扫描降低安全风险⭐⭐⭐⭐⭐非root用户提升安全性⭐⭐⭐⭐下一步在第9章中我们将学习容器的生命周期管理创建和启动容器容器状态管理容器日志查看资源限制容器网络配置本章思考题为什么在同一RUN指令中删除文件可以减小镜像大小而在后续层删除无效多阶段构建适合什么场景如何判断是否需要使用Alpine镜像虽然小但为什么不是所有场景都适用如何在镜像体积和调试便利性之间取得平衡在CI/CD流程中如何自动化镜像的安全扫描和优化相关资源Docker官方最佳实践https://docs.docker.com/develop/dev-best-practices/Dockerfile最佳实践https://docs.docker.com/develop/develop-images/dockerfile_best-practices/Docker安全指南https://docs.docker.com/engine/security/Trivy安全扫描https://github.com/aquasecurity/trivy