必须做些什么才能交付 Docker 并避免积累图像?

What have to be done to deliver on Docker and avoid to accumulate images?

我使用 Docker 来执行我制作的网站。 当必须交付一个版本时,我必须构建一个新的 Docker 图像并从中启动一个新的容器。

问题是图像和容器正在积累并占用大量 space。 除了交付,我还需要停止 运行 容器并删除它和源图像。

我不需要 Docker 命令行,而是一个清单或一个过程来防止忘记任何事情。

例如: -停止运行容器 -删除停止的容器 -删除旧图像 -建立新形象 -启动新容器

我错过了什么吗? 我不习惯Docker,也许这个非常经典的用例有最佳实践?

你应该使用:

docker system df

调查 docker 使用的 space。

之后就可以使用

docker system prune -a --volumes

删除未使用的组件。在执行此操作之前,您应该自己停止容器,但这样您一定会覆盖所有内容。

适合我的本地工作流程是:

  1. 在本地进行核心开发,不用Docker。交互式调试器和实时重新加载之类的东西在 non-Docker 环境中工作得很好,没有奇怪的 hack 或 root 访问权限,安装我需要的工具通常只需要一个 brewapt-get 步骤。让我的所有 pytest/junit/rspec/jest/... 测试都通过。

  2. docker build一张新图片。

  3. docker stop && docker rm旧容器。

  4. docker run一个新容器。

  5. 当老照片的数量开始困扰我时,docker system prune

如果您使用的是 Docker Compose,则可以将中间的一组步骤替换为 docker-compose up --build

在生产环境中,顺序略有不同:

  1. 当您的 CI 系统看到一个新的提交时,在 运行 存储库的本地测试之后,它 docker build && docker push 一个新的图像。图像具有唯一标签,可以是时间戳或源代码控制提交 ID 或版本标签。

  2. 您的部署系统(可以是 CI 系统或单独的 CD 系统)告诉您正在使用的任何集群管理器(Kubernetes,一个包含 Docker Swarm 的 Compose 文件, Nomad, Ansible playbook, ...) 关于新版本标签。部署系统负责停止、启动和删除容器。

  3. 如果您的集群管理器尚未处理此问题,运行 一个 cron 作业到 docker system prune