1. 首页 > IT综合教程 > 正文

IT教程FG402-容器镜像管理

内容大纲

1. 容器镜像管理概述

容器镜像是容器的基础,它包含了运行应用所需的所有文件和依赖。有效的容器镜像管理可以提高部署效率、确保安全性、减少存储占用,并简化CI/CD流程。

容器镜像管理的核心内容包括:

  • Dockerfile编写
  • 镜像构建
  • 镜像仓库管理
  • 镜像标签管理
  • 镜像优化
  • 镜像安全
  • 镜像生命周期管理

学习交流加群风哥微信: itpux-com

2. Dockerfile编写

2.1 Dockerfile基础

# 基础镜像
FROM ubuntu:20.04

# 维护者信息
MAINTAINER example@fgedu.net.cn

# 环境变量
ENV DEBIAN_FRONTEND=noninteractive

# 安装依赖
RUN apt-get update && apt-get install -y \
nginx \
curl \
&& rm -rf /var/lib/apt/lists/*

# 复制文件
COPY index.html /var/www/html/

# 暴露端口
EXPOSE 80

# 启动命令
CMD [“nginx”, “-g”, “daemon off;”]

2.2 Dockerfile最佳实践

  • 使用官方基础镜像
  • 使用特定版本的基础镜像,避免使用latest标签
  • 最小化镜像层数
  • 使用多阶段构建
  • 清理临时文件和缓存
  • 使用.dockerignore文件排除不需要的文件

2.3 多阶段构建

# 多阶段构建
FROM node:14 as builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

FROM nginx:alpine
COPY –from=builder /app/build /usr/share/nginx/html
EXPOSE 80
CMD [“nginx”, “-g”, “daemon off;”]

风哥风哥提示:多阶段构建可以显著减小最终镜像的大小,因为它只包含构建结果,而不包含构建过程中的依赖和工具。

3. 镜像构建

3.1 基本构建命令

# 构建镜像
$ docker build -t my-nginx:1.0 .

# 指定Dockerfile路径
$ docker build -t my-nginx:1.0 -f Dockerfile.prod .

# 构建时传递参数
$ docker build –build-arg APP_VERSION=1.0 -t my-nginx:1.0 .

Sending build context to Docker daemon 2.048kB
Step 1/7 : FROM ubuntu:20.04
—> 1d622ef86b13
Step 2/7 : MAINTAINER example@fgedu.net.cn
—> Running in 1234567890ab
Removing intermediate container 1234567890ab
—> 234567890abc
Step 3/7 : ENV DEBIAN_FRONTEND=noninteractive
—> Running in 34567890abcd
Removing intermediate container 34567890abcd
—> 4567890abcde
Step 4/7 : RUN apt-get update && apt-get install -y nginx curl && rm -rf /var/lib/apt/lists/*
—> Running in 567890abcdef
Get:1 http://archive.ubuntu.com/ubuntu focal InRelease [265 kB]
Get:2 http://archive.ubuntu.com/ubuntu focal-updates InRelease [114 kB]
Get:3 http://archive.ubuntu.com/ubuntu focal-backports InRelease [101 kB]
Get:4 http://security.ubuntu.com/ubuntu focal-security InRelease [114 kB]

Removing intermediate container 567890abcdef
—> 67890abcdef1
Step 5/7 : COPY index.html /var/www/html/
—> 7890abcdef12
Step 6/7 : EXPOSE 80
—> Running in 890abcdef123
Removing intermediate container 890abcdef123
—> 90abcdef1234
Step 7/7 : CMD [“nginx”, “-g”, “daemon off;”]
—> Running in 0abcdef12345
Removing intermediate container 0abcdef12345
—> 1234567890ab
Successfully built 1234567890ab
Successfully tagged my-nginx:1.0

3.2 构建缓存

# 查看构建缓存
$ docker system df

# 清理构建缓存
$ docker builder prune

# 强制重新构建(不使用缓存)
$ docker build –no-cache -t my-nginx:1.0 .

3.3 构建上下文

# .dockerignore文件示例
node_modules/
npm-debug.log
.DS_Store
.git/
.gitignore

更多学习教程www.fgedu.net.cn

4. 镜像仓库管理

4.1 Docker Hub

# 登录Docker Hub
$ docker login

# 标记镜像
$ docker tag my-nginx:1.0 username/my-nginx:1.0

# 推送镜像
$ docker push username/my-nginx:1.0

# 拉取镜像
$ docker pull username/my-nginx:1.0

4.2 私有镜像仓库

# 启动私有镜像仓库
$ docker run -d –name registry \
-p 5000:5000 \
-v /path/to/registry:/var/lib/registry \
registry:2

# 标记镜像
$ docker tag my-nginx:1.0 fgedudb:5000/my-nginx:1.0

# 推送镜像到私有仓库
$ docker push fgedudb:5000/my-nginx:1.0

# 从私有仓库拉取镜像
$ docker pull fgedudb:5000/my-nginx:1.0

4.3 云提供商镜像仓库

  • AWS ECR:Amazon Elastic Container Registry
  • Azure ACR:Azure Container Registry
  • Google GCR:Google Container Registry
  • 阿里云ACR:阿里云容器镜像服务
  • 腾讯云TCR:腾讯云容器镜像服务

4.4 镜像仓库认证

# 使用Docker配置文件存储认证信息
$ docker login registry.fgedu.net.cn

# 使用Kubernetes Secret存储认证信息
$ kubectl create secret docker-registry regcred \
–docker-server=registry.fgedu.net.cn \
–docker-username=username \
–docker-password=password \
–docker-email=email@fgedu.net.cn

# 在Pod中使用镜像仓库认证
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
– name: my-container
image: registry.fgedu.net.cn/my-nginx:1.0
imagePullSecrets:
– name: regcred

author:www.itpux.com

5. 镜像标签管理

5.1 标签命名规范

  • 版本号:如1.0, 1.0.1
  • 环境:如dev, test, prod
  • 提交哈希:如abc123
  • 日期:如20260403

5.2 标签操作

# 标记镜像
$ docker tag my-nginx:1.0 my-nginx:latest

# 查看镜像标签
$ docker images my-nginx

# 删除镜像标签
$ docker rmi my-nginx:latest

REPOSITORY TAG IMAGE ID CREATED SIZE
my-nginx 1.0 1234567890ab 1 hour ago 132MB
my-nginx latest 1234567890ab 1 hour ago 132MB

5.3 标签最佳实践

  • 避免使用latest标签部署生产环境
  • 使用语义化版本号
  • 为每个构建添加唯一标签(如提交哈希)
  • 定期清理过时的标签

更多学习教程公众号风哥教程itpux_com

6. 镜像优化

6.1 减小镜像大小

# 使用 Alpine 基础镜像
FROM alpine:3.14

# 合并RUN命令
RUN apk add –no-cache nginx && \
rm -rf /var/cache/apk/*

# 使用多阶段构建
FROM golang:1.16 as builder
WORKDIR /app
COPY . .
RUN go build -o app .

FROM alpine:3.14
COPY –from=builder /app/app /app/
CMD [“/app/app”]

6.2 分层优化

  • 将不变的层放在前面
  • 将频繁变化的层放在后面
  • 使用 COPY 代替 ADD(除了需要自动解压的情况)
  • 使用 –chown 选项设置文件权限

6.3 镜像大小分析

# 使用 docker history 查看镜像层
$ docker history my-nginx:1.0

# 使用 dive 分析镜像
$ docker run –rm -it \
-v /var/run/docker.sock:/var/run/docker.sock \
wagoodman/dive:latest my-nginx:1.0

IMAGE CREATED CREATED BY SIZE COMMENT
1234567890ab 1 hour ago /bin/sh -c #(nop) CMD [“nginx” “-g” “daemon… 0B
90abcdef1234 1 hour ago /bin/sh -c #(nop) EXPOSE 80 0B
7890abcdef12 1 hour ago /bin/sh -c #(nop) COPY file:1234567890abcdef… 123B
67890abcdef1 1 hour ago /bin/sh -c apt-get update && apt-get install… 131MB
4567890abcde 1 hour ago /bin/sh -c #(nop) ENV DEBIAN_FRONTEND=nonin… 0B
234567890abc 1 hour ago /bin/sh -c #(nop) MAINTAINER example@example… 0B
1d622ef86b13 2 weeks ago /bin/sh -c #(nop) CMD [“/bin/bash”] 0B
2 weeks ago /bin/sh -c #(nop) ADD file:1234567890abcdef… 72.9MB

风哥风哥提示:镜像优化可以显著减小镜像大小,提高部署速度,减少存储占用,并提高安全性。

7. 镜像安全

7.1 镜像扫描

# 使用 Trivy 扫描镜像
$ docker run –rm -v /var/run/docker.sock:/var/run/docker.sock aquasec/trivy:latest image my-nginx:1.0

# 使用 Clair 扫描镜像
$ docker run -d –name clair-db arminc/clair-db:latest
$ docker run -p 6060:6060 –link clair-db:postgres -d –name clair arminc/clair-local-scan:latest
$ docker run –rm –link clair:clair -v /var/run/docker.sock:/var/run/docker.sock arminc/clair-scanner:latest -c http://clair:6060 –ip $(hostname -i) my-nginx:1.0

7.2 安全最佳实践

  • 使用官方基础镜像
  • 定期更新基础镜像
  • 最小化镜像内容
  • 使用非root用户
  • 设置只读文件系统
  • 限制容器能力
  • 使用多阶段构建

7.3 非root用户运行

# Dockerfile 示例
FROM alpine:3.14

# 创建非root用户
RUN adduser -D -u 1000 appuser

# 切换到非root用户
USER appuser

# 设置工作目录
WORKDIR /app

# 复制文件
COPY –chown=appuser:appuser . .

# 启动命令
CMD [“./app”]

学习交流加群风哥QQ113257174

8. 镜像生命周期管理

8.1 镜像清理

# 列出所有镜像
$ docker images

# 删除未使用的镜像
$ docker image prune

# 删除所有未使用的镜像(包括悬空镜像)
$ docker image prune -a

# 删除特定镜像
$ docker rmi my-nginx:1.0

# 清理所有未使用的资源
$ docker system prune

8.2 镜像备份与恢复

# 导出镜像
$ docker save -o my-nginx.tar my-nginx:1.0

# 导入镜像
$ docker load -i my-nginx.tar

# 推送镜像到仓库(作为备份)
$ docker push username/my-nginx:1.0

8.3 镜像版本管理

  • 使用语义化版本号
  • 为每个版本创建标签
  • 定期清理过时版本
  • 保留关键版本作为备份

9. CI/CD集成

9.1 Jenkins集成

# Jenkinsfile示例
pipeline {
agent any
stages {
stage(‘Build’) {
steps {
sh ‘docker build -t my-nginx:${BUILD_NUMBER} .’
}
}
stage(‘Test’) {
steps {
sh ‘docker run –rm my-nginx:${BUILD_NUMBER} npm test’
}
}
stage(‘Scan’) {
steps {
sh ‘docker run –rm -v /var/run/docker.sock:/var/run/docker.sock aquasec/trivy:latest image my-nginx:${BUILD_NUMBER}’
}
}
stage(‘Push’) {
steps {
sh ‘docker tag my-nginx:${BUILD_NUMBER} username/my-nginx:${BUILD_NUMBER}’
sh ‘docker tag my-nginx:${BUILD_NUMBER} username/my-nginx:latest’
sh ‘docker push username/my-nginx:${BUILD_NUMBER}’
sh ‘docker push username/my-nginx:latest’
}
}
}
}

9.2 GitHub Actions集成

# .github/workflows/docker-build.yml
name: Docker Build

on:
push:
branches: [ main ]
pull_request:
branches: [ main ]

jobs:
build:
runs-on: ubuntu-latest
steps:
– uses: actions/checkout@v2
– name: Build the Docker image
run: docker build . –file Dockerfile –tag my-nginx:${{ github.sha }}
– name: Scan the Docker image
run: docker run –rm -v /var/run/docker.sock:/var/run/docker.sock aquasec/trivy:latest image my-nginx:${{ github.sha }}
– name: Push the Docker image
if: github.event_name == ‘push’ && github.ref == ‘refs/heads/main’
run: |
echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} –password-stdin
docker tag my-nginx:${{ github.sha }} username/my-nginx:${{ github.sha }}
docker tag my-nginx:${{ github.sha }} username/my-nginx:latest
docker push username/my-nginx:${{ github.sha }}
docker push username/my-nginx:latest

9.3 GitLab CI/CD集成

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

build:
stage: build
script:
– docker build -t my-nginx:${CI_COMMIT_SHORT_SHA} .

test:
stage: test
script:
– docker run –rm my-nginx:${CI_COMMIT_SHORT_SHA} npm test

scan:
stage: scan
script:
– docker run –rm -v /var/run/docker.sock:/var/run/docker.sock aquasec/trivy:latest image my-nginx:${CI_COMMIT_SHORT_SHA}

push:
stage: push
script:
– docker tag my-nginx:${CI_COMMIT_SHORT_SHA} username/my-nginx:${CI_COMMIT_SHORT_SHA}
– docker tag my-nginx:${CI_COMMIT_SHORT_SHA} username/my-nginx:latest
– echo $DOCKER_PASSWORD | docker login -u $DOCKER_USERNAME –password-stdin
– docker push username/my-nginx:${CI_COMMIT_SHORT_SHA}
– docker push username/my-nginx:latest
only:
– master

更多学习教程www.fgedu.net.cn

10. 最佳实践

10.1 镜像管理最佳实践

  • 使用多阶段构建减小镜像大小
  • 使用官方基础镜像并定期更新
  • 为镜像添加明确的标签
  • 定期扫描镜像安全漏洞
  • 使用非root用户运行容器
  • 清理未使用的镜像

10.2 镜像仓库最佳实践

  • 使用私有镜像仓库存储敏感镜像
  • 实施镜像仓库访问控制
  • 定期备份镜像仓库
  • 设置镜像仓库清理策略
  • 使用镜像签名确保镜像完整性

10.3 CI/CD集成最佳实践

  • 在CI/CD流程中添加镜像扫描
  • 为每个构建添加唯一标签
  • 实施镜像版本控制
  • 自动化镜像推送和部署
  • 设置镜像构建缓存

10.4 生产环境最佳实践

  • 避免使用latest标签
  • 使用固定版本的镜像
  • 实施镜像拉取策略
  • 监控镜像使用情况
  • 建立镜像回滚机制
生产环境风哥建议:

  • 建立镜像管理规范,包括命名、标签和版本控制
  • 实施镜像安全扫描,及时发现和修复漏洞
  • 使用CI/CD自动化镜像构建和部署
  • 定期清理未使用的镜像,减少存储占用
  • 建立镜像备份策略,确保数据安全

author:www.itpux.com

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息