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

it教程FG389-容器镜像管理

内容大纲

1. 容器镜像管理概述

容器镜像是容器化应用的基础,包含了运行应用所需的所有文件、依赖和配置。容器镜像管理是容器化环境中的重要组成部分,涉及镜像的创建、构建、存储、分发和维护等环节。

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

  • 镜像创建:使用Dockerfile或其他工具创建镜像
  • 镜像构建:将Dockerfile构建为可运行的镜像
  • 镜像存储:在本地或远程仓库中存储镜像
  • 镜像分发:将镜像推送到远程仓库供他人使用
  • 镜像标签管理:使用标签区分不同版本的镜像
  • 镜像优化:减少镜像大小,提高构建速度
  • 镜像安全:确保镜像不包含漏洞和恶意代码
  • 镜像生命周期管理:管理镜像的创建、使用和删除

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

2. Dockerfile编写

2.1 Dockerfile基本结构

# 基础镜像
FROM ubuntu:20.04

# 维护者信息
MAINTAINER Your Name

# 环境变量
ENV DEBIAN_FRONTEND=noninteractive

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

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

# 暴露端口
EXPOSE 80

# 工作目录
WORKDIR /var/www/html

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

2.2 Dockerfile指令

  • FROM:指定基础镜像
  • MAINTAINER:指定维护者信息
  • RUN:执行命令
  • COPY:复制文件
  • ADD:复制文件(支持URL和压缩文件)
  • EXPOSE:暴露端口
  • ENV:设置环境变量
  • WORKDIR:设置工作目录
  • CMD:指定容器启动命令
  • ENTRYPOINT:指定容器入口点
  • VOLUME:挂载卷
  • USER:指定用户
  • ARG:构建参数
  • ONBUILD:触发后续构建

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 myapp:latest .

# 指定Dockerfile
$ docker build -t myapp:latest -f Dockerfile.prod .

# 指定构建上下文
$ docker build -t myapp:latest /path/to/context

# 使用构建参数
$ docker build -t myapp:latest –build-arg VERSION=1.0.0 .

# 构建缓存
$ docker build –no-cache -t myapp:latest .

# 查看构建历史
$ docker history myapp:latest

# 构建时指定标签
$ docker build -t myapp:1.0.0 -t myapp:latest .

3.2 构建优化

# 合理使用缓存
FROM ubuntu:20.04

# 先安装依赖,再复制代码
RUN apt-get update && apt-get install -y \
python3 \
python3-pip \
&& rm -rf /var/lib/apt/lists/*

# 复制requirements.txt,单独安装依赖
COPY requirements.txt .
RUN pip3 install -r requirements.txt

# 最后复制代码
COPY . .

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

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

# 使用 BuildKit
$ DOCKER_BUILDKIT=1 docker build -t myapp:latest .

# 并行构建
$ docker buildx build -t myapp:latest –platform linux/amd64,linux/arm64 .

3.3 构建上下文优化

# 创建 .dockerignore 文件
$ cat .dockerignore
node_modules/
npm-debug.log
yarn-error.log
build/
dist/
*.log
*.env

# 测试 .dockerignore
$ docker build -t myapp:latest –progress=plain .

# 减小构建上下文
$ find . -type f -not -path “*/node_modules/*” -not -path “*/build/*” | wc -l

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

4. 镜像仓库管理

4.1 Docker Hub

# 登录Docker Hub
$ docker login

# 标记镜像
$ docker tag myapp:latest username/myapp:latest

# 推送镜像
$ docker push username/myapp:latest

# 拉取镜像
$ docker pull username/myapp:latest

# 搜索镜像
$ docker search nginx

# 查看镜像详情
$ docker inspect username/myapp:latest

4.2 私有镜像仓库

# 运行私有镜像仓库
$ docker run -d -p 5000:5000 –name registry registry:2

# 标记镜像
$ docker tag myapp:latest fgedudb:5000/myapp:latest

# 推送镜像
$ docker push fgedudb:5000/myapp:latest

# 拉取镜像
$ docker pull fgedudb:5000/myapp:latest

# 查看仓库中的镜像
$ curl http://fgedudb:5000/v2/_catalog

# 查看镜像标签
$ curl http://fgedudb:5000/v2/myapp/tags/list

4.3 企业级镜像仓库

  • Harbor:VMware开源的企业级容器镜像仓库
  • Nexus:Sonatype的仓库管理解决方案
  • Artifactory:JFrog的制品管理平台
  • AWS ECR:Amazon Elastic Container Registry
  • Google GCR:Google Container Registry
  • Azure ACR:Azure Container Registry

4.4 Harbor安装与配置

# 安装Harbor
$ wget https://github.com/goharbor/harbor/releases/download/v2.3.0/harbor-online-installer-v2.3.0.tgz
$ tar xvf harbor-online-installer-v2.3.0.tgz
$ cd harbor

# 配置Harbor
$ cp harbor.yml.tmpl harbor.yml
$ vi harbor.yml
# 修改hostname、port、admin password等配置

# 安装Harbor
$ ./install.sh

# 登录Harbor
$ docker login harbor.fgedu.net.cn

# 推送镜像到Harbor
$ docker tag myapp:latest harbor.fgedu.net.cn/library/myapp:latest
$ docker push harbor.fgedu.net.cn/library/myapp:latest

# 从Harbor拉取镜像
$ docker pull harbor.fgedu.net.cn/library/myapp:latest

学习交流加群风哥QQ113257174

5. 镜像标签管理

5.1 标签命名规范

  • 版本标签:如 v1.0.0, 1.2.3
  • 分支标签:如 master, develop
  • 环境标签:如 dev, test, prod
  • 日期标签:如 20210101
  • commit标签:如 abc123
  • latest标签:表示最新版本

5.2 标签管理命令

# 列出本地镜像
$ docker images

# 标记镜像
$ docker tag myapp:latest myapp:1.0.0
$ docker tag myapp:latest myapp:stable

# 移除标签
$ docker rmi myapp:1.0.0

# 重命名镜像
$ docker tag oldname:latest newname:latest
$ docker rmi oldname:latest

# 查看镜像历史
$ docker history myapp:latest

# 查看镜像元数据
$ docker inspect myapp:latest

5.3 标签最佳实践

  • 使用语义化版本号:如 v1.0.0, v1.1.0
  • 避免使用latest标签部署生产环境
  • 为每个构建生成唯一标签:如基于commit hash或构建时间
  • 保持标签的一致性:在不同环境中使用相同的标签策略
  • 定期清理过时标签:避免标签过多导致管理混乱

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

6. 镜像优化

6.1 减小镜像大小

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

# 最小化层数
FROM alpine:3.14
RUN apk add –no-cache nginx && rm -rf /var/cache/apk/*

# 清理临时文件
FROM ubuntu:20.04
RUN apt-get update && apt-get install -y nginx && rm -rf /var/lib/apt/lists/*

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

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

# 压缩镜像
$ docker save myapp:latest | gzip > myapp.tar.gz
$ docker load < myapp.tar.gz

6.2 加速构建

# 使用构建缓存
FROM ubuntu:20.04
RUN apt-get update && apt-get install -y nginx
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .

# 使用 BuildKit
$ DOCKER_BUILDKIT=1 docker build -t myapp:latest .

# 并行构建
$ docker buildx build -t myapp:latest –platform linux/amd64,linux/arm64 .

# 使用缓存镜像
$ docker pull myapp:latest || true
$ docker build –cache-from myapp:latest -t myapp:latest .

# 优化 COPY 命令
COPY package*.json ./
RUN npm install
COPY . .

6.3 镜像分析

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

# 查看镜像大小
$ docker images –format “{{.Repository}}:{{.Tag}} {{.Size}}”

# 查看镜像层大小
$ docker history myapp:latest

# 比较镜像大小
$ docker images | grep myapp

author:www.itpux.com

7. 镜像安全

7.1 镜像安全最佳实践

# 使用官方基础镜像
FROM nginx:alpine

# 定期更新基础镜像
FROM nginx:alpine@sha256:abc123…

# 最小化镜像
FROM alpine:3.14
RUN apk add –no-cache nginx && rm -rf /var/cache/apk/*

# 以非root用户运行
FROM alpine:3.14
RUN adduser -D -u 1000 nginx
USER nginx

# 避免使用ADD
COPY index.html /var/www/html/

# 清理临时文件
RUN apt-get update && apt-get install -y nginx && rm -rf /var/lib/apt/lists/*

# 使用只读文件系统
FROM alpine:3.14
RUN apk add –no-cache nginx
VOLUME [“/var/cache/nginx”]
CMD [“nginx”, “-g”, “daemon off;”]

7.2 镜像扫描

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

# 使用 Clair 扫描镜像
$ docker run –rm -v /var/run/docker.sock:/var/run/docker.sock quay.io/coreos/clair-scanner:latest -c http://fgedudb:6060 –ip 172.17.0.1 myapp:latest

# 使用 Docker Scan
$ docker scan myapp:latest

# 扫描结果分析
# 查看高危漏洞
$ docker run –rm -v /var/run/docker.sock:/var/run/docker.sock aquasec/trivy image –severity HIGH,CRITICAL myapp:latest

# 生成扫描报告
$ docker run –rm -v /var/run/docker.sock:/var/run/docker.sock aquasec/trivy image –format json –output trivy-result.json myapp:latest

7.3 安全加固

# 配置 seccomp
FROM alpine:3.14
RUN apk add –no-cache nginx
COPY seccomp.json /etc/seccomp.json
CMD [“nginx”, “-g”, “daemon off;”]

# 配置 AppArmor
FROM alpine:3.14
RUN apk add –no-cache nginx
CMD [“nginx”, “-g”, “daemon off;”]

# 配置 SELinux
FROM alpine:3.14
RUN apk add –no-cache nginx
CMD [“nginx”, “-g”, “daemon off;”]

# 限制容器能力
FROM alpine:3.14
RUN apk add –no-cache nginx
CMD [“nginx”, “-g”, “daemon off;”]

8. 镜像生命周期管理

8.1 镜像清理

# 清理悬空镜像
$ docker image prune

# 清理所有未使用的镜像
$ docker image prune -a

# 清理特定镜像
$ docker rmi myapp:latest

# 批量清理
$ docker images | grep “” | awk ‘{print $3}’ | xargs docker rmi

# 清理所有镜像
$ docker rmi $(docker images -q)

8.2 镜像备份与恢复

# 导出镜像
$ docker save -o myapp.tar myapp:latest

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

# 导出多个镜像
$ docker save -o images.tar myapp:latest nginx:alpine

# 压缩导出
$ docker save myapp:latest | gzip > myapp.tar.gz

# 从压缩文件导入
$ gunzip -c myapp.tar.gz | docker load

8.3 镜像版本管理

# 列出镜像标签
$ docker images | grep myapp

# 保留特定版本
$ docker tag myapp:latest myapp:v1.0.0

# 删除旧版本
$ docker rmi myapp:old-version

# 批量标记
$ for i in {1..10}; do docker tag myapp:latest myapp:v1.0.$i; done

# 批量删除
$ for i in {1..10}; do docker rmi myapp:v1.0.$i; done

9. 镜像扫描

9.1 扫描工具

  • Trivy:Aqua Security的开源漏洞扫描工具
  • Clair:CoreOS的开源容器镜像漏洞扫描器
  • Docker Scan:Docker官方的镜像扫描工具
  • Anchore Engine:开源容器镜像分析平台
  • SonarQube:代码质量和安全扫描工具

9.2 集成扫描到CI/CD

# GitHub Actions 配置
$ cat .github/workflows/scan.yml
name: Security Scan

on:
push:
branches: [ master ]
pull_request:
branches: [ master ]

jobs:
scan:
runs-on: ubuntu-latest
steps:
– uses: actions/checkout@v2
– name: Build image
run: docker build -t myapp:latest .
– name: Scan image
uses: aquasecurity/trivy-action@master
with:
image-ref: ‘myapp:latest’
format: ‘table’
exit-code: ‘1’
ignore-unfixed: true
severity: ‘CRITICAL,HIGH’

# GitLab CI 配置
$ cat .gitlab-ci.yml
scan:
stage: test
script:
– docker build -t myapp:latest .
– docker run –rm -v /var/run/docker.sock:/var/run/docker.sock aquasec/trivy image –severity HIGH,CRITICAL myapp:latest
only:
– master
– merge_requests

9.3 扫描结果处理

# 查看扫描结果
$ docker run –rm -v /var/run/docker.sock:/var/run/docker.sock aquasec/trivy image myapp:latest

# 导出扫描报告
$ docker run –rm -v /var/run/docker.sock:/var/run/docker.sock aquasec/trivy image –format json –output trivy-result.json myapp:latest

# 解析扫描报告
$ jq ‘.Results[].Vulnerabilities[] | select(.Severity == “CRITICAL”)’ trivy-result.json

# 自动修复漏洞
# 更新基础镜像
FROM alpine:3.15

# 安装安全补丁
RUN apk update && apk upgrade

# 移除有漏洞的包
RUN apk del vulnerable-package && apk add secure-package

10. 最佳实践

10.1 镜像管理最佳实践

  • 使用官方基础镜像:确保镜像来源可信
  • 定期更新基础镜像:获取安全补丁
  • 使用多阶段构建:减小镜像大小
  • 最小化镜像层数:提高构建速度
  • 使用 .dockerignore:减小构建上下文
  • 以非root用户运行:提高安全性
  • 使用语义化版本号:便于版本管理
  • 定期扫描镜像:发现和修复漏洞
  • 清理未使用的镜像:节省存储空间
  • 建立镜像管理策略:规范镜像的创建、使用和删除

10.2 生产环境建议

# 生产环境镜像策略
1. 使用固定标签:避免使用latest标签
2. 签名镜像:确保镜像完整性
3. 扫描镜像:部署前进行安全扫描
4. 镜像分层:合理组织镜像层
5. 镜像缓存:使用缓存提高构建速度
6. 镜像仓库:使用企业级镜像仓库
7. 镜像备份:定期备份重要镜像
8. 镜像审计:记录镜像的创建和使用
9. 镜像版本控制:管理镜像的版本历史
10. 镜像生命周期:制定镜像的生命周期策略

# 示例生产环境Dockerfile
FROM alpine:3.15 as builder
WORKDIR /app
COPY package*.json ./
RUN npm install –production
COPY . .
RUN npm run build

FROM alpine:3.15
WORKDIR /app
RUN adduser -D -u 1000 appuser
USER appuser
COPY –from=builder /app/build /app/build
COPY –from=builder /app/node_modules /app/node_modules
EXPOSE 3000
CMD [“npm”, “start”]

10.3 镜像管理工具

  • Docker CLI:基本的镜像管理命令
  • Docker Compose:多容器应用管理
  • Docker Buildx:高级构建功能
  • Harbor:企业级镜像仓库
  • Trivy:镜像漏洞扫描
  • Dive:镜像层分析
  • Skopeo:镜像复制和检查
  • Podman:无守护进程的容器工具
  • Buildah:无Dockerfile构建镜像
  • Kaniko:在容器中构建容器镜像

生产环境建议

  • 建立镜像管理策略:规范镜像的创建、使用和删除
  • 使用企业级镜像仓库:如Harbor、Nexus等
  • 实施镜像签名:确保镜像完整性
  • 定期扫描镜像:发现和修复漏洞
  • 使用多阶段构建:减小镜像大小
  • 以非root用户运行:提高安全性
  • 使用固定标签:避免使用latest标签
  • 定期清理未使用的镜像:节省存储空间
  • 建立镜像备份策略:防止镜像丢失
  • 培训团队掌握镜像管理技能:确保正确使用和管理镜像

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

联系我们

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

微信号:itpux-com

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