服务公告

服务公告 > 综合新闻 > Docker:Docker企业级实战案例

Docker:Docker企业级实战案例

发布时间:2026-04-21 16:02

一、前言

搞过的人都知道,最烦的是镜像管理混乱、构建慢、安全漏洞一堆。本教程讲实际企业环境的Docker镜像构建优化和私有Harbor仓库的实战部署,解决CI/CD流程中的镜像管理痛点。

二、操作步骤

步骤1:多阶段构建生产级镜像

先用轻量级基础镜像减少体积,生产环境别用ubuntu:latest,那玩意600MB起步。

# 构建多阶段Dockerfile FROM golang:1.21-alpine AS builder WORKDIR /build COPY go.mod go.sum ./ RUN go mod download COPY . . RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o myapp FROM alpine:latest RUN apk --no-cache add ca-certificates tzdata WORKDIR /root/ COPY --from=builder /build/myapp . CMD ["./myapp"]

预期输出:镜像大小从1.2GB降到35MB,Build时间约3分钟

步骤2:优化构建缓存策略

别傻傻地每次都从头构建,先COPY依赖文件再COPY源码,这样依赖层会被缓存。

# Dockerfile层顺序优化 FROM node:18-alpine AS builder WORKDIR /app # 先复制依赖文件,利用构建缓存 COPY package*.json ./ RUN npm ci --only=production # 最后复制源码,源码变化才重装依赖 COPY . . RUN npm run build FROM nginx:alpine COPY --from=builder /app/dist /usr/share/nginx/html EXPOSE 80

预期输出:修改源码时构建时间从8分钟降到1分钟

步骤3:集成安全扫描到构建流程

⚠️ 安全扫描必须进CI/CD流程,别等上线前才发现漏洞。

# 安装Trivy扫描工具 docker pull aquasec/trivy:latest # 扫描镜像漏洞 docker run --rm aquasec/trivy:latest image --severity HIGH,CRITICAL --exit-code 1 myapp:latest # 扫描结果示例 2024-01-15T10:30:25.000Z INFO Vulnerability scanning is enabled 2024-01-15T10:30:28.123Z INFO Detected OS: alpine 3.19 2024-01-15T10:30:30.456Z CRITICAL 3 vulnerabilities found - CVE-2024-0001 (CRITICAL) - bash:4.1 - CVE-2024-0002 (HIGH) - libcrypto - CVE-2024-0003 (MEDIUM) - apk

预期输出:扫描发现3个漏洞,构建失败需要先修复

步骤4:部署Harbor私有镜像仓库

企业必须有私有仓库,别把所有鸡蛋放Docker Hub。

# 下载Harbor安装包 wget https://github.com/goharbor/harbor/releases/download/v2.10.0/harbor-offline-installer.tgz # 解压并配置 tar xvf harbor-offline-installer.tgz cd harbor cp harbor.yml.tmpl harbor.yml # 修改配置(生产环境必须改密码) hostname: registry.company.com harbor_admin_password: YOUR_PASSWORD database_password: YOUR_DB_PASSWORD # 执行安装 ./prepare ./install.sh --with-trivy

预期输出:安装成功,访问https://registry.company.com登录管理后台

步骤5:配置镜像推送到私有仓库

推镜像前先登录仓库,确认项目权限分配正确。

# 登录私有仓库 docker login registry.company.com Username: admin Password: Login Succeeded # 标记并推送镜像 docker tag myapp:latest registry.company.com/project/myapp:v1.0.0 docker push registry.company.com/project/myapp:v1.0.0 # 推送输出 v1.0.0: digest: sha256:abc123... size: 5243 project/myapp:v1.0.0 - pushed successfully

预期输出:镜像已推送到私有仓库,可在Harbor界面看到镜像列表

步骤6:配置Kubernetes镜像拉取策略

生产环境Pod必须用私有仓库,别再让Pod去公网拉镜像。

# 创建ImagePullSecrets kubectl create secret docker-registry harbor-secret --docker-server=registry.company.com --docker-username=admin --docker-password=YOUR_PASSWORD # 在Pod配置中引用 apiVersion: v1 kind: Pod metadata: name: myapp-pod spec: imagePullSecrets: - name: harbor-secret containers: - name: myapp image: registry.company.com/project/myapp:v1.0.0 imagePullPolicy: Always

预期输出:Pod创建成功,镜像从私有仓库正常拉取

步骤7:配置镜像构建CI/CD流水线

把镜像构建、扫描、推送全自动化,解放双手。

# Jenkinsfile片段 pipeline { agent any stages { stage('Build') { steps { sh """ docker build -t ${IMAGE_TAG} . """ } } stage('Security Scan') { steps { sh """ trivy image --exit-code 1 --severity HIGH ${IMAGE_TAG} """ } } stage('Push to Harbor') { steps { sh """ docker push ${IMAGE_TAG} docker rmi ${IMAGE_TAG} """ } } } }

预期输出:流水线执行成功,镜像已推送到Harbor并自动清理本地缓存

三、常见问题FAQ

Q1:镜像构建太慢怎么优化?

A:别傻傻地每次都从头构建。Docker层的顺序很关键,先COPY依赖文件(package.json、requirements.txt)RUN安装,再COPY源码。这样依赖层会被缓存,只有源码变化时才重新安装。还可以用BuildKit并行构建,导出DOCKER_BUILDKIT=1试试。

Q2:生产镜像太大怎么办?

A:多阶段构建是王道,Build阶段用完整工具链,Run阶段只COPY编译产物。另外,换alpine之类的轻量基础镜像,别用ubuntu:latest,那玩意600MB起步。运行时需要的最小依赖打包进去就行,不需要编译工具链。

Q3:Trivy扫描一直失败怎么解决?

A:通常是权限问题或者数据库下载超时。先运行一次手动更新:trivy image --download-db-only。如果在内网环境,提前下载好漏洞库放到共享存储上,或者配置离线扫描模式。还有就是扫描太慢的话,可以用--skip-files参数跳过不必要的文件。

Q4:Harbor推送时报错denied错误?

A:先确认项目角色分配,不是所有用户都有Push权限的。检查docker login是否成功,token过期时间配置对不对。还有个项目容易被忽略:镜像名称要和项目名对应上,格式是registry/project/image:tag,别把镜像推到根目录去了。

Q5:Pod拉取镜像失败怎么排查?

A:先kubectl describe pod看事件信息,常见原因是ImagePullBackOff。重点检查:1) ImagePullSecrets配置是否正确 2) ServiceAccount是否关联了正确的secret 3) 私有仓库证书是否添加到集群 4) 网络能否连通到私有仓库域名解析是否正常。

四、总结

核心要点:

  • 多阶段构建是企业级镜像标配,能减少80%以上体积
  • 构建缓存优化是提速关键,依赖文件和源码分开COPY
  • 安全扫描必须进CI/CD流程,别等上线前才发现漏洞
  • Harbor统一管理企业镜像生命周期,支持高可用部署
  • Kubernetes集群必须配置ImagePullSecrets拉取私有镜像

延伸阅读:

  • Docker BuildKit高级特性与Build Secrets
  • Harbor高可用集群部署方案
  • 镜像签名与Docker Content Trust实战
  • Trivy在Kubernetes中的自动扫描 admission controller

上一篇: CDN:CDN监控与分析

下一篇: Vue3:安装配置