内容大纲
- 1. 容器镜像概述
- 2. Dockerfile编写
- 3. 镜像构建
- 4. 镜像仓库管理
- 5. 镜像标签管理
- 6. 镜像优化
- 7. 镜像安全
- 8. 镜像生命周期管理
- 9. 最佳实践
- 10. 镜像管理工具
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 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镜像仓库
$ 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 减小镜像大小
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 镜像层优化
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 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 镜像扫描
$ 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 “
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
