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

it教程FG376-容器镜像管理

内容大纲

1. 容器镜像概述

容器镜像是容器的基础,它包含了运行应用所需的所有文件和依赖。容器镜像是一个只读的模板,用于创建容器实例。

容器镜像的特点包括:

  • 分层结构:镜像由多个层组成,每层都是前一层的增量修改
  • 只读性:镜像创建后不可修改,只能通过创建新层来更新
  • 可移植性:镜像可以在不同的环境中使用
  • 轻量性:镜像只包含必要的文件和依赖,比虚拟机镜像小得多

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

2. Dockerfile编写

2.1 Dockerfile基础

Dockerfile是一个文本文件,包含了构建容器镜像的指令。

2.2 Dockerfile指令

# 基础镜像
FROM ubuntu:20.04

# 维护者信息
MAINTAINER fgedu

# 环境变量
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

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

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

2.3 多阶段构建

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

# 运行阶段
FROM nginx:1.19.10
COPY –from=builder /app/build /usr/share/nginx/html
EXPOSE 80
CMD [“nginx”, “-g”, “daemon off;”]

风哥风哥提示:多阶段构建可以减小最终镜像的大小,只包含运行所需的文件。

3. 镜像构建

3.1 基本构建

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

# 查看构建过程
$ docker build -t nginx:latest –progress=plain .

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

# 构建参数
$ docker build -t nginx:latest –build-arg VERSION=1.0 .

3.2 构建缓存

# 利用缓存构建
$ docker build -t nginx:latest .

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

# 查看缓存使用情况
$ docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 5 3 1.2GB 800MB (66%)
Containers 2 1 100MB 50MB (50%)
Local Volumes 3 2 500MB 200MB (40%)
Build Cache 10 0 300MB 300MB (100%)

3.3 构建优化

# 优化构建顺序
FROM ubuntu:20.04

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

# 复制依赖文件
COPY requirements.txt .
RUN pip3 install -r requirements.txt

# 复制代码
COPY . .

# 这样当代码修改时,只需要重新构建最后几层,依赖层可以使用缓存

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

4. 镜像仓库管理

4.1 Docker Hub

# 登录Docker Hub
$ docker login

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

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

# 搜索镜像
$ docker search nginx

4.2 私有镜像仓库

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

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

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

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

# 查看私有仓库中的镜像
$ curl http://fgedudb:5000/v2/_catalog
{“repositories”:[“nginx”]}

# 查看镜像标签
$ curl http://fgedudb:5000/v2/nginx/tags/list
{“name”:”nginx”,”tags”:[“latest”]}

4.3 Harbor镜像仓库

# 安装Harbor
$ wget https://github.com/goharbor/harbor/releases/download/v2.4.0/harbor-offline-installer-v2.4.0.tgz
$ tar xvf harbor-offline-installer-v2.4.0.tgz
$ cd harbor
$ cp harbor.yml.tmpl harbor.yml
# 编辑harbor.yml配置文件
$ ./install.sh

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

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

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

学习交流加群风哥QQ113257174

5. 镜像标签管理

5.1 标签使用

# 查看镜像标签
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 1234567890ab 2 days ago 133MB
nginx 1.19.10 1234567890ab 2 days ago 133MB

# 标记镜像
$ docker tag nginx:latest nginx:1.19.10

# 删除标签
$ docker rmi nginx:1.19.10

# 批量标记
$ docker images | grep nginx | awk ‘{print $1″:latest “$1″:1.19.10”}’ | xargs -L1 docker tag

5.2 标签最佳实践

  • 使用语义化版本号作为标签,如1.0.0、1.1.0
  • 避免使用latest标签,因为它指向最新版本,可能导致不可预测的行为
  • 使用特定的标签标识环境,如dev、test、prod
  • 定期清理过期的标签和镜像

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

6. 镜像优化

6.1 减小镜像大小

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

# 最小化层数量
FROM ubuntu:20.04
RUN apt-get update && apt-get install -y \
nginx \
curl \
&& rm -rf /var/lib/apt/lists/*

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

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

# 清理不必要的文件
RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

6.2 镜像层优化

# 合并RUN指令
FROM ubuntu:20.04
RUN apt-get update && \
apt-get install -y nginx curl && \
rm -rf /var/lib/apt/lists/*

# 合理安排指令顺序
FROM ubuntu:20.04
# 先安装依赖
RUN apt-get update && apt-get install -y nginx curl && rm -rf /var/lib/apt/lists/*
# 再复制代码
COPY . /app
# 最后设置启动命令
CMD [“nginx”, “-g”, “daemon off;”]

6.3 镜像分析

# 使用docker history查看镜像层
$ docker history nginx:latest
IMAGE CREATED CREATED BY SIZE COMMENT
1234567890ab 2 days ago /bin/sh -c #(nop) CMD [“nginx” “-g” “daemon… 0B
abcdef123456 2 days ago /bin/sh -c #(nop) EXPOSE 80 0B
9876543210fe 2 days ago /bin/sh -c #(nop) STOPSIGNAL SIGQUIT 0B
6543210987fe 2 days ago /bin/sh -c #(nop) ENTRYPOINT [“/docker-entr… 0B
3210987654fe 2 days ago /bin/sh -c #(nop) COPY file:09a214a3e07c919a… 1.04kB
9876543210ab 2 days ago /bin/sh -c #(nop) COPY file:49891f246678223… 1.96kB
6543210987ab 2 days ago /bin/sh -c set -x && addgroup –system -… 62.6MB

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

author:www.itpux.com

7. 镜像安全

7.1 镜像扫描

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

# 使用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:latest
$ docker run –rm –link clair:clair -v /var/run/docker.sock:/var/run/docker.sock \
quay.io/coreos/clair-scanner:latest -c http://clair:6060 –ip $(hostname -i) nginx:latest

# 使用Docker Scout扫描镜像
$ docker scout quickview nginx:latest

7.2 安全最佳实践

  • 使用官方镜像或可信来源的镜像
  • 定期更新基础镜像
  • 扫描镜像中的漏洞
  • 最小化镜像中的组件和依赖
  • 使用非root用户运行容器
  • 签名和验证镜像

7.3 镜像签名

# 生成密钥
$ docker trust key generate fgedu

# 初始化信任
$ docker trust signer add –key fgedu.pub fgedu nginx:latest

# 签名镜像
$ docker trust sign nginx:latest

# 验证镜像
$ docker trust inspect –pretty nginx:latest

# 拉取签名镜像
$ docker pull –disable-content-trust=false nginx:latest

8. 镜像生命周期管理

8.1 镜像清理

# 查看本地镜像
$ docker images

# 删除单个镜像
$ docker rmi nginx:latest

# 删除多个镜像
$ docker rmi nginx:latest ubuntu:20.04

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

# 删除所有未标记的镜像
$ docker image prune -a

# 删除特定模式的镜像
$ docker images | grep “” | awk ‘{print $3}’ | xargs docker rmi

8.2 镜像备份与恢复

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

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

# 导出容器为镜像
$ docker commit container_id nginx:custom

# 推送镜像到仓库作为备份
$ docker push username/nginx:backup

8.3 镜像版本管理

  • 建立镜像版本控制策略
  • 使用语义化版本号
  • 定期清理过期版本
  • 保留关键版本作为备份

9. 最佳实践

9.1 Dockerfile最佳实践

  • 使用官方基础镜像
  • 最小化镜像大小
  • 使用多阶段构建
  • 合理安排指令顺序
  • 使用环境变量配置
  • 添加健康检查

9.2 镜像管理最佳实践

  • 使用私有镜像仓库
  • 实施镜像扫描
  • 建立镜像版本控制
  • 定期清理过期镜像
  • 使用镜像签名

9.3 镜像安全最佳实践

  • 使用非root用户
  • 最小化镜像内容
  • 定期更新基础镜像
  • 扫描漏洞
  • 限制容器权限

10. 镜像管理工具

10.1 Docker CLI

Docker命令行工具是最基本的镜像管理工具,提供了镜像的构建、推送、拉取、删除等功能。

10.2 Harbor

Harbor是一个企业级的容器镜像仓库,提供了镜像管理、安全扫描、访问控制等功能。

10.3 Trivy

Trivy是一个开源的容器镜像漏洞扫描工具,可以扫描镜像中的漏洞和配置问题。

10.4 Dive

Dive是一个镜像分析工具,可以查看镜像的层结构和内容,帮助优化镜像大小。

10.5 Docker Scout

Docker Scout是Docker官方提供的镜像安全分析工具,可以评估镜像的安全状态。

生产环境建议

  • 建立完善的镜像管理流程
  • 使用私有镜像仓库
  • 实施镜像扫描和安全评估
  • 定期清理过期镜像
  • 建立镜像版本控制策略
  • 培训团队掌握镜像管理技能

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

联系我们

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

微信号:itpux-com

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