You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Docker容器结束运行后保存状态以便后续继续使用?

如何让Docker容器保存运行时的状态修改?

嘿,这个问题戳中了很多Docker初学者的痛点!先给你明确答案:容器默认会保留运行时的所有文件系统修改,只是你之前的操作导致容器停止了,但修改并没有丢失。下面一步步帮你找回那个test.txt,再聊聊适合开发场景的长期解决方案。

找回你创建的test.txt文件

你之前退出shell后,容器其实因为PID 1进程(/bin/bash)退出而停止了,但它的文件系统修改还存在。按下面步骤操作就能看到文件:

  1. 列出所有容器(包括已停止的):
    docker ps -a
    
    找到你之前创建的那个容器的ID或名字。
  2. 重启这个容器:
    docker start <容器ID/容器名字>
    
  3. 重新进入容器的shell:
    docker exec -ti <容器ID/容器名字> /bin/bash
    
    进去后到/opt目录下,就能看到你创建的test.txt了!

为什么修改不会丢失?Docker容器的文件系统原理

Docker的镜像本身是只读的,当你创建并运行容器时,Docker会在镜像之上添加一个可写层——你在容器内做的所有文件修改(比如创建文件、安装软件)都存在这个可写层里。只要容器没有被删除,这个可写层就会一直保留,哪怕容器处于停止状态。只有当你执行docker rm <容器ID>删除容器时,这个可写层才会被清理掉。

适合开发场景的长期方案(安装软件后重启继续用)

如果你想用容器做开发环境,安装软件、测试后关闭,后续能直接重启继续工作,推荐这两种方式:

方式1:让容器后台持续运行

启动容器时,用一个不会退出的进程作为PID 1,避免你退出shell后容器停止。比如:

docker run -d --name my-dev-container test tail -f /dev/null

这里tail -f /dev/null会一直后台运行,容器就不会停止。之后你随时可以用下面的命令进入容器操作:

docker exec -ti my-dev-container /bin/bash

退出shell后,容器依然在后台运行,所有修改都会保留。需要停止容器时,执行docker stop my-dev-container,后续重启用docker start my-dev-container即可。

方式2:将容器状态固化为新镜像

如果你觉得当前容器的状态(比如安装了需要的软件)很稳定,想基于这个状态创建更多容器,可以把容器提交为新镜像:

docker commit <容器ID> my-dev-image:v1

之后用这个新镜像创建容器,就会自带你之前的所有修改:

docker run -d --name new-dev-container my-dev-image:v1 /bin/bash

总结

容器的本质不是“无法保存超出镜像的状态”,而是默认在PID 1进程退出时会停止,但文件系统的修改会被保留。只要不删除容器,随时可以重启并恢复之前的状态;如果需要长期复用状态,还可以提交为新镜像。

内容的提问来源于stack exchange,提问作者grokkaine

火山引擎 最新活动