如何停止/重新启动docker集装箱而不会丢失更改?

我做了以下,并丢失了我的Docker容器中的所有更改的数据。

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

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

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

重启之后,我看到1-3号容器发生的变化消失了,不得不重新运行导入。

下次如何正确执行此操作?

你必须做的是从你刚刚停止的容器中进行修改后的图像。 因为你的旧命令仍然使用旧图像没有新的变化(你已经在你刚才停下来的容器中进行了更改)

 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那么你可以启动容器与你刚刚build立的新形象

但是如果你不想用你所做的修改来创build镜像(比如你不想把包含密码的configuration放在镜像中),你可以使用volume mount

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

该命令将主机目录/ src / webapp安装到/ webapp的容器中。 如果path/ web应用程序已经存在于容器的映像中,那么/ src / webapp挂载会覆盖,但不会删除预先存在的内容。 一旦挂载被删除,内容可以再次访问。 这与mount命令的预期行为一致。

pipe理容器中的数据

每次你做一个docker run它会旋转一个新的容器根据你的形象。 一旦容器启动,docker允许你通过docker update改变很less的东西。 相反,您应该将数据保存在需要在容器实例之间保留的外部卷中。 例如

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

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