【问题标题】:update running docker container更新正在运行的 docker 容器
【发布时间】:2015-03-02 20:40:52
【问题描述】:

我有一个正在运行的 docker 容器,其基础映像为 fedora:latest

我想保留我正在运行的应用程序的状态,但仍然更新了一些自从我第一次部署容器以来获得安全修复的软件包(即 gnutls、openssl 和朋友)。

如何在不中断服务或丢失当前状态的情况下做到这一点?

所以最理想的情况是我想在正在运行的容器上获得bash/csh/dash/sh,或者任何fleet 魔法?

【问题讨论】:

    标签: docker containers linux-containers


    【解决方案1】:

    请务必注意,您可能会在容器关闭时遇到一些问题。

    例如,假设您有一个用于在前台运行 Apache 的 Apache 容器的 Dockerfile。想象一下,您将外壳附加到您的容器(通过docker exec)并开始更新。您必须对 Apache 进行修复,并且在更新过程中,Apache 会重新启动。 Apache 关闭的那一刻,容器就会停止。您将失去应用程序的当前状态。这需要非常仔细的计划和一些运气,并且可能无法进行一些更新。

    更好的方法是使用所有适当的更新重建容器所基于的映像,然后重新运行容器。服务将(短暂)中断。但是,为了让您能够保存应用程序的状态,您需要以这样一种方式设计图像,即任何需要保留的状态信息都以持久的方式存储 - 无论是在主机文件系统中通过挂载目录或数据容器。

    简而言之,如果您在容器关闭时丢失重要信息,那么您的系统很脆弱,您迟早会遇到问题。最好重新设计它,以便将需要持久化的所有内容都保存在外部容器中。

    【讨论】:

    • 我无法将存储移动到主机。如果我以将存储转移到另一个容器的方式重构容器,这会将问题从前端升级分离到后端升级,如果我错了,请纠正我。
    • 不知道你担心失去什么样的状态,我真的不知道。我想象的是一个 Web 服务器或数据库服务器,您在容器中拥有 HTML/数据库文件,以及在容器启动后对服务器配置进行的一些更改。在这种情况下,如果您将数据文件移出容器并在映像中实现任何配置,那么更新变得像使用任何更改重新构建映像并重新运行它一样简单。有关数据管理的信息,请参阅 docs.docker.com/userguide/dockervolumes
    • 另外,我应该指出,我的建议是对您的图像和容器进行相当彻底的重组,以使它们更符合最佳实践。
    • 感谢您的意见,我的主要问题是像 gitolite 这样的应用程序,它混合数据和服务并将其相互拆分肯定会导致一些流失和额外的维护(我可以只是从另一个容器通过NFS 映射git 用户主目录,但见鬼,这很讨厌,我最终会为每个服务创建两个容器——这不是我真正想要的)。
    • 如果您正在寻找类似 github 的私有托管服务,您是否尝试过 Bitbucket?对于 5 个或更少的用户,它是免费的,即使对于私有存储库也是如此。我们在小团队的工作中广泛使用它,非常棒。
    【解决方案2】:

    如果 docker 容器有一个正在运行的 bash

    docker attach <containerIdOrName>
    

    否则在同一个容器中执行一个新程序(这里:bash

    docker exec -it <containerIdOrName> bash
    

    【讨论】:

      猜你喜欢
      • 2022-01-21
      • 1970-01-01
      • 2020-03-31
      • 2017-06-30
      • 1970-01-01
      • 2022-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多