精通 Docker:提升效率和安全性的最佳实践👮🏻
Docker最佳实践
1. 优化图像尺寸
- 使用官方镜像:首先使用可信的官方 Docker 镜像。
- 使用最小基础镜像:轻量级镜像体积
alpine更小、下载速度更快,并能减少攻击面。 - 减少层数:合并命令以减少 Dockerfile 中的层数(例如,使用 `
&&--link` 将命令链接在单个RUN语句中)。 - 清除缓存:安装后删除软件包管理器和缓存(例如,
apt-get clean对于 Ubuntu)。
2. 安全镜像和容器
- 使用多阶段构建:将构建依赖项与运行时环境分离,使生产镜像更精简。
- 以非 root 用户身份运行:避免在容器内使用 root 用户。请
USER在 Dockerfile 中指定非 root 用户。 - 保持 Docker 更新:定期更新 Docker 本身及其使用的任何镜像。
- 使用 `Use
COPYInstead ofADD:COPY` 更直接,并且不会像 ` 那样执行自动解压缩ADD,从而减少了歧义。 - 利用
.dockerignore:为了避免将不必要的文件复制到映像中,创建一个.dockerignore类似于.gitignore.
3. 优化 Dockerfile 指令
- 利用缓存的指令顺序:将不常更改的指令放在 Dockerfile 的顶部,以利用 Docker 的缓存机制。
- 使用特定版本:避免
latest在生产环境中使用标签;将图像锁定到特定版本,以确保稳定性和可重现性。
4. 使用 Docker Compose 管理多容器应用程序
- 通过使用多个容器来分离关注点:对于复杂的应用程序,将服务(例如,分离数据库、Web 服务器和应用程序层)分解到不同的容器中。
- 使用 Docker Compose 进行本地开发:它使处理复杂的多容器应用程序变得更容易,并创建一致的环境。
5. 限制资源使用
- 设置内存和 CPU 限制:使用 Docker 的资源限制来避免单个容器使用过多的资源(
--memory,--cpus)。 - 使用只读文件系统:尽可能将文件系统访问限制为只读(
--read-only)。
6. 日志记录和监控
- 集中式日志记录:配置 Docker 将日志发送到集中式日志记录服务(如 ELK Stack、Splunk 或 AWS CloudWatch)。
- 监控容器:使用 Prometheus 或 Grafana 等工具监控性能、内存和 CPU 使用情况。
7. 容器间安全通信
- 使用私有网络:避免暴露不必要的端口,并使用 Docker 网络隔离服务。
- 使用密钥管理:对于密码和密钥等敏感信息,请使用 Docker Secrets,尤其是在 swarm 模式下。
8. 优化容器健康状况和生命周期
- 设置健康检查:在 Dockerfile 中添加健康检查,以确保容器健康(
HEALTHCHECK指令)。 - 清理未使用的容器和镜像:定期清理未使用的镜像、容器、卷和网络(
docker system prune)以节省磁盘空间。
9. 使用多阶段构建
多阶段构建允许您通过将构建依赖项与运行时要求分离来创建更精简的生产镜像。
- 构建阶段:创建用于编译或构建应用程序的第一阶段。此阶段可以包含所有必要的依赖项和工具。
- 最后阶段:仅将构建阶段所需的必要文件复制到较小的基础镜像中。这样可以生成更简洁、更小的最终镜像。
- 例如:我们正在使用 Alpine 镜像来构建 Laravel。
FROM serversideup/php:8.2-cli-v2.2.1 as builder
ARG LARAVEL_ENV_ENCRYPTION_KEY
COPY ./ /var/www
WORKDIR /var/www
RUN <<EOF
composer install --ignore-platform-reqs --no-interaction --no-dev --prefer-dist --optimize-autoloader
php artisan env:decrypt --force
EOF
# ================================================ #
FROM serversideup/php:8.2-fpm-nginx-v2.2.1
ENV AUTORUN_LARAVEL_MIGRATION=true
ENV SSL_MODE=off
ENV PHP_MEMORY_LIMIT=128M
ENV PHP_MAX_EXECUTION_TIME=30
WORKDIR /var/www/html
COPY --chown=$PUID:$PGID --from=builder /var/www/ /var/www/html
RUN php artisan optimize
HEALTHCHECK CMD curl -s --fail http://localhost/health || exit 1
CMD ["su", "webuser", "-c", "php artisan schedule:work"]
EXPOSE 80
10. 使用构建工具包加速 Docker 构建
Docker BuildKit 是一个可选的镜像构建引擎,与传统流程相比,它提供了显著的改进。BuildKit 可以并行创建镜像层,从而加速整个构建过程。
虽然 BuildKit 目前已经稳定,但 Docker 默认仍未启用它。如果您想使用 BuildKit 的功能,请确保在 Docker 客户端中启用它。目前有一个提案正在积极推进,希望将 BuildKit 设置为标准构建引擎,但仍有一些未解决的问题阻碍了这一转变。
===================================
遵循这些最佳实践可以简化开发流程,提高安全性,并使 Docker 环境的扩展和维护更加容易。
如果觉得有用就点个赞吧😉
没钱? 🙅🏻♀️ 就订阅我的YouTube频道吧。
Linktree 个人主页: https://linktr.ee/DevOps_Descent
GitHub 项目:https://github.com/devopsdescent








