内容大纲
- 1. 容器镜像管理概述
- 2. Dockerfile编写
- 3. 镜像构建
- 4. 镜像仓库管理
- 5. 镜像标签管理
- 6. 镜像优化
- 7. 镜像安全
- 8. 镜像生命周期管理
- 9. CI/CD集成
- 10. 最佳实践
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 .
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 构建上下文
node_modules/
npm-debug.log
.DS_Store
.git/
.gitignore
更多学习教程www.fgedu.net.cn
4. 镜像仓库管理
4.1 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 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
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 减小镜像大小
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 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
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 镜像扫描
$ 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用户运行
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集成
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集成
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集成
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
