如何在Docker容器结束运行后保存状态以便后续继续使用?
嘿,这个问题戳中了很多Docker初学者的痛点!先给你明确答案:容器默认会保留运行时的所有文件系统修改,只是你之前的操作导致容器停止了,但修改并没有丢失。下面一步步帮你找回那个test.txt,再聊聊适合开发场景的长期解决方案。
找回你创建的test.txt文件
你之前退出shell后,容器其实因为PID 1进程(/bin/bash)退出而停止了,但它的文件系统修改还存在。按下面步骤操作就能看到文件:
- 列出所有容器(包括已停止的):
找到你之前创建的那个容器的ID或名字。docker ps -a - 重启这个容器:
docker start <容器ID/容器名字> - 重新进入容器的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




