【问题标题】:How to stop/relaunch docker container without losing the changes?如何在不丢失更改的情况下停止/重新启动 docker 容器?
【发布时间】:2017-04-25 07:44:31
【问题描述】:

我执行了以下操作并丢失了 Docker 容器中所有更改的数据。

  1. docker build -t <name:tag> .
  2. docker run *-p 8080:80* --name <container_name> <name:tag>
  3. docker exec(导入并处理一些文件,启动服务器来托管它们)

然后我想在不同的端口上运行它。 docker stop & docker run 不起作用。相反,我做了

  1. docker stop
  2. docker rm <container_name>
  3. docker run(与之前相同的参数)

重启后我看到1-3的容器中发生的变化消失了,只好重新运行导入。

下次如何正确操作?

【问题讨论】:

    标签: docker docker-image


    【解决方案1】:

    您需要做的是从您在更改后刚刚停止的容器中构建映像。因为您的旧命令仍在使用没有新更改的旧图像(您已经在容器中进行了更改,而您刚刚停止而不是在图像中)

    docker commit --help
    
    Usage:  docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
    
    Create a new image from a container's changes
    

    docker commit -a me new_nginx myrepo/nginx:latest 然后您可以使用刚刚构建的新图像启动容器

    但如果您不想使用所做的更改创建映像(例如您不想在映像中放置包含密码的配置),您可以使用卷挂载

    docker run -d -P --name web -v /src/webapp:/webapp training/webapp python app.py

    此命令将主机目录 /src/webapp 挂载到位于 /webapp 的容器中。如果路径 /webapp 已经存在于容器的映像中,则 /src/webapp 挂载会覆盖但不会删除预先存在的内容。移除挂载后,即可再次访问内容。这与 mount 命令的预期行为一致。

    Manage data in containers

    【讨论】:

      【解决方案2】:

      每次您执行docker run 时,它都会根据您的图像启动一个新容器。一旦容器启动,docker 允许您使用docker update 更改的内容很少。因此,您应该将数据保存在需要在容器实例之间持久存在的外部卷中。例如

      docker run -p 8080:80 -v app-data:/data --name <container_name> <name:tag>
      

      容器中的卷名 (app-data) 和挂载点 (/data) 可以根据您自己的要求进行更改。然后当你销毁并重新启动一个新容器时,你可以在新容器中挂载相同的卷。

      【讨论】:

        猜你喜欢
        • 2016-09-28
        • 1970-01-01
        • 2016-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-10
        • 2019-11-01
        • 2023-03-21
        相关资源
        最近更新 更多