如何 stop/relaunch docker 容器而不丢失更改?

How to stop/relaunch docker container without losing the changes?

我做了以下操作并丢失了我 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 run 时,它都会根据您的图像启动一个新容器。一旦容器启动,docker 允许您使用 docker update 更改的内容非常少。因此,您应该将数据保存在需要在容器实例之间持久存在的外部卷中。例如

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

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

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

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 然后你可以用你刚刚构建的新镜像启动容器

但是如果你不想用你所做的更改创建镜像(比如你不想在镜像中放置包含密码的配置),你可以使用 volume mount

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