docker run启动的容器挂掉了数据怎么办
情景描述
在某个系统中,功能性的服务使用dockerstackdeployxxx启动,某个国产数据库的服务单独使用dockerrunxxx启动,数据库服务没有将存储的位置挂载出来;
结果客户重启了服务器…再登录到服务器重启服务的时候,发现了一个问题,之前数据库里的数据可能会消失(如果再使用dockerrun启动的话)。
解决办法
尝试1
起初想的是数据肯定丢了,那就只能重新折腾一次数据了,但工作量太大了…
不过也没办法,下次再启动,把存储挂载到硬盘就好了,Orz
不过和同事交流了之后,发现了一个更为简单(但也不是永久的办法),见尝试2
尝试2
同事提到,可以使用dockerstartcontainer_name再次将容器启动,这样的话数据还在。后面尝试了一下,果然数据还在……虽然也只是个临时的解决办法
后面想了一下,docker启动的镜像,如果不将数据映射出来的话,会存储在默认的volume;即使用dockerrestartxxx重启容器,那变动的数据也还是在的;也就是说在这个地方,服务器重启了,容器挂掉了(使用dockerps查看,其容器状态是Exited),但其实之前的数据还会在默认的volume下,只有删除掉容器的时候,变动的数据才会丢失。
验证测试
随便打包一个镜像,启动容器,创建一个文件,再停止,再启动,查看文件是否存在
#启动容器 ➜docker_start_testdockerrun-itd--namedocker_run_test4cbf48630b46ping127.0.0.1 d6278f537113122d4ccbe00950790750215c5a09002bcbd1ef6f9e660fc9eaac ➜docker_start_testdockerps-a CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES d6278f5371134cbf48630b46"ping127.0.0.1"3secondsagoUp2secondsdocker_run_test #进容器增加文件 ➜docker_start_testdockerexec-itdocker_run_test/bin/sh sh-4.2#pwd / sh-4.2#touchtest sh-4.2#exit exit #重启容器 ➜docker_start_testdockerstopdocker_run_test docker_run_test ➜docker_start_testdockerps-a|grepdocker_run_test d6278f5371134cbf48630b46"ping127.0.0.1"AboutaminuteagoExited(137)12secondsagodocker_run_test #进去查看文件是否存在 ➜docker_start_testdockerstartdocker_run_test docker_run_test ➜docker_start_testdockerexec-tidocker_run_test/bin/sh sh-4.2#ls anaconda-post.logbindevetchomeliblib64lost+foundmediamntoptprocrootrunsbinsrvsystesttmpusrvar
可以看到,文件test依然存在;此时如果停掉容器,使用dockerrm删掉容器,再重新启动一个同名容器,可以看到,容器内不再有test文件了
#stop/rm掉容器 ➜docker_start_testdockerstopdocker_run_test docker_run_test ➜docker_start_testdockerps-a|grepdocker_run d6278f5371134cbf48630b46"ping127.0.0.1"7minutesagoExited(137)13secondsagodocker_run_test ➜docker_start_testdockerrmd6278f537113 d6278f537113 #启动新的同名容器 ➜docker_start_testdockerrun-itd--namedocker_run_test4cbf48630b46ping127.0.0.1 99a6f5df0a86e4c07abf184e322a23e4fbec89ff354691459cdac8fcd8687ba3 #进入容器验证 ➜docker_start_testdockerexec-tidocker_run_test/bin/sh sh-4.2#ls anaconda-post.logbindevetchomeliblib64lost+foundmediamntoptprocrootrunsbinsrvsystmpusrvar sh-4.2#lstest ls:cannotaccesstest:Nosuchfileordirectory
dockerrun的说明
从官网看到,start命令的作用是:
Startoneormorestoppedcontainers
emmm,挺直白,没什么可说的
PS
其实最好的办法,就是将容器的存储目录挂载出来…另外,一般来讲似乎数据库服务不应该使用容器启动
总结
以上所述是小编给大家介绍的dockerrun启动的容器挂掉了数据怎么办,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!