docker run啓動的容器掛掉了,數據怎麼辦

情景描述

在某個系統中,功能性的服務使用 docker stack deploy xxx 啓動,某個國產數據庫的服務單獨使用 docker run xxx 啓動,數據庫服務沒有將存儲的位置掛載出來;docker

結果客戶重啓了服務器…再登陸到服務器重啓服務的時候,發現了一個問題,以前數據庫裏的數據可能會消失(若是再使用 docker run 啓動的話)。數據庫

解決辦法

嘗試1

起初想的是數據確定丟了,那就只能從新折騰一次數據了,但工做量太大了…服務器

不過也沒辦法,下次再啓動,把存儲掛載到硬盤就行了,Orzpost

不過和同事交流了以後,發現了一個更爲簡單(但也不是永久的辦法),見嘗試2測試

嘗試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

docker run的說明

從官網看到,start命令的做用是:容器

Start one or more stopped containers

emmm,挺直白,沒什麼可說的

PS

其實最好的辦法,就是將容器的存儲目錄掛載出來…另外,通常來說彷佛數據庫服務不該該使用容器啓動

相關文章
相關標籤/搜索