在某个系统中,功能性的服务使用 docker stack deploy xxx
启动,某个国产数据库的服务单独使用 docker run xxx
启动,数据库服务没有将存储的位置挂载出来;docker
结果客户重启了服务器…再登陆到服务器重启服务的时候,发现了一个问题,以前数据库里的数据可能会消失(若是再使用 docker run
启动的话)。数据库
起初想的是数据确定丢了,那就只能从新折腾一次数据了,但工做量太大了…服务器
不过也没办法,下次再启动,把存储挂载到硬盘就行了,Orzpost
不过和同事交流了以后,发现了一个更为简单(但也不是永久的办法),见尝试2测试
同事提到,可使用 docker start container_name
再次将容器启动,这样的话数据还在。后面尝试了一下,果真数据还在……虽然也只是个临时的解决办法rest
后面想了一下,docker启动的镜像,若是不将数据映射出来的话,会存储在默认的volume;即便用docker restart xxx
重启容器,那变更的数据也仍是在的;也就是说在这个地方,服务器重启了,容器挂掉了(使用docker ps
查看,其容器状态是Exited),但其实以前的数据还会在默认的volume下,只有删除掉容器的时候,变更的数据才会丢失。code
随便打包一个镜像,启动容器,建立一个文件,再中止,再启动,查看文件是否存在it
# 启动容器 ➜ docker_start_test docker run -itd --name docker_run_test 4cbf48630b46 ping 127.0.0.1 d6278f537113122d4ccbe00950790750215c5a09002bcbd1ef6f9e660fc9eaac ➜ docker_start_test docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d6278f537113 4cbf48630b46 "ping 127.0.0.1" 3 seconds ago Up 2 seconds docker_run_test # 进容器增长文件 ➜ docker_start_test docker exec -it docker_run_test /bin/sh sh-4.2# pwd / sh-4.2# touch test sh-4.2# exit exit # 重启容器 ➜ docker_start_test docker stop docker_run_test docker_run_test ➜ docker_start_test docker ps -a | grep docker_run_test d6278f537113 4cbf48630b46 "ping 127.0.0.1" About a minute ago Exited (137) 12 seconds ago docker_run_test # 进去查看文件是否存在 ➜ docker_start_test docker start docker_run_test docker_run_test ➜ docker_start_test docker exec -ti docker_run_test /bin/sh sh-4.2# ls anaconda-post.log bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys test tmp usr var
能够看到,文件 test 依然存在;此时若是停掉容器,使用docker rm
删掉容器,再从新启动一个同名容器,能够看到,容器内再也不有test文件了test
# stop / rm掉容器 ➜ docker_start_test docker stop docker_run_test docker_run_test ➜ docker_start_test docker ps -a | grep docker_run d6278f537113 4cbf48630b46 "ping 127.0.0.1" 7 minutes ago Exited (137) 13 seconds ago docker_run_test ➜ docker_start_test docker rm d6278f537113 d6278f537113 # 启动新的同名容器 ➜ docker_start_test docker run -itd --name docker_run_test 4cbf48630b46 ping 127.0.0.1 99a6f5df0a86e4c07abf184e322a23e4fbec89ff354691459cdac8fcd8687ba3 # 进入容器验证 ➜ docker_start_test docker exec -ti docker_run_test /bin/sh sh-4.2# ls anaconda-post.log bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var sh-4.2# ls test ls: cannot access test: No such file or directory
从官网看到,start命令的做用是:容器
Start one or more stopped containers
emmm,挺直白,没什么可说的
其实最好的办法,就是将容器的存储目录挂载出来…另外,通常来说彷佛数据库服务不该该使用容器启动