Docker 07 Docker容器化最佳实践

安全保障

使用官方镜像

在 docker hub 上,官方标记了三种可信的镜像:

  • 官方镜像(Docker Official Image):docker hub 上最安全、可靠的镜像。通常这些镜像没有或仅有极少的安全漏洞,并且经过 Docker 和项目维护者的审查,更能确保镜像的安全性和可靠性;
  • 已认证发布者镜像(Verified Publisher):由与 Docker 合作且经过认证的组织发布的高质量镜像,镜像内容的真实性经过 Docker 官方认证;
  • Docker 赞助的开源项目(Sponsored OSS):由 Docker 赞助的开源项目发布和维护。

通常这些镜像都有经过 Docker 和项目维护者的审查,同时拥有更高的社区活跃度,更能确保镜像的安全性和可靠性。

使用明确版本的镜像

如果镜像内的应用程序不强依赖于环境版本,则建议经常性地重建镜像并更新环境与依赖项,此时可以使用 —-no-cache 参数来避免使用缓存构建,确保获取到的软件和依赖项都是最新版本。

而在用来运行应用程序的镜像中,其环境和软件的版本是比较稳定的,不会轻易修改。此时建议使用明确版本 tag 的镜像,确保镜像的稳定性。避免使用 latest 镜像,因为其指向最新版本,可能引入未知风险。例如新版本的镜像可能存在漏洞或应用兼容问题。

除此之外,由于 tag 是可变的,即镜像的发布者可以更新标签以指向新的镜像。所以使用明确版本的镜像还不能完全保证镜像不会改变。此时可以通过明确镜像的摘要来完全保证镜像不变。 例如:

FROM alpine:3.19@sha256:13b7e62e8df80264dbb747995705a986aa530415763a6c58f84a3ca8af9a5bcd

定期扫描漏洞

  1. 定期使用漏洞扫描工具(例如 Trivy)定期扫描镜像中的漏洞,有一些企业会有专门的开源治理平台或工具可以扫描漏洞;
  2. 持续关注镜像软件包的漏洞公告:
    1. 镜像的漏洞:通常在 Docker Hub 上的镜像 tag 列表都会列出来具体的漏洞数;
    2. 软件包的漏洞:可从各个 Linux 发行版的官方公告查询。

最小化权限

避免使用 root 用户来运行应用程序。建议可以先使用 root 用户构建镜像后,再指定非特权用户来运行应用程序。例如:

# root 用户执行
FROM ...
# ... 构建镜像的前置步骤 ...

# 创建新用户并指定
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser

CMD ...

最小化暴露端口

在运行容器时,只暴露必要的端口,不要将所有的或没必要的端口暴露给外部。如果需要限制外部访问,可以配置受信任的 IP 或网络访问。

优化镜像体积

选择合适的基础镜像

使用尽可能精简的基础镜像可以加快基础镜像的下载速度,并减小最终镜像的大小。例如在软件包和库文件足够使用的情况下,使用 Alpine 镜像比 Ubuntu 镜像更轻量。

在容器化 SpringBoot 应用时,虽然一般都推荐 OpenJDK 镜像,但实践中仅需要 JRE 就足够了,可以选择基于 OpenJDK 但仅包含 JRE 的精简镜像,例如:eclipse-temurin。

合并RUN指令减少层数

在一个 RUN 指令中执行多个命令,并用 && 连接,减少镜像层数。例如:

# 修改前
RUN apt-get update
RUN apt-get install -y python

# 修改后
RUN apt-get update && \\
  apt-get install -y python

避免安装多余的依赖

例如,在一个数据库镜像中,一般不需要安装文本编辑器的软件包。

另外,在安装完软件后,建议清理安装软件包时产生的缓存。例如下面的命令,在安装好必要的软件后,通过 apt-get cleanrm -rf /var/lib/apt/lists/* 来清理不必要的缓存和文件。

# apt 包管理器版
RUN apt-get upd

你可能感兴趣的:(Docker持续沉淀,docker)