内容大纲
- 1. 容器镜像管理概述
- 2. Dockerfile编写
- 3. 镜像构建
- 4. 镜像仓库管理
- 5. 镜像标签管理
- 6. 镜像优化
- 7. 镜像安全
- 8. 镜像生命周期管理
- 9. 镜像扫描
- 10. 最佳实践
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 构建上下文优化
$ 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 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安装与配置
$ 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 减小镜像大小
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 镜像分析
$ 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 镜像扫描
$ 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 安全加固
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 “
# 清理所有镜像
$ 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
$ 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
