1. 程式人生 > >docker 基礎 之數據管理

docker 基礎 之數據管理

恢復 實時 默認目錄 16px anaconda strip mil aec 記錄

數據卷

一、將本地默認目錄掛在道docker容器內指定的目錄

#將本地的目錄掛在到docker容器內
docker run -it --name container-test -h CONTAINER -v /data centos /bin/bash 

#### -h 為docker容器的主機名 /data 為掛載到docker內的目錄 #命令執行完成後如下: [root@CONTAINER /]# ls anaconda-post.log data etc lib lost+found mnt proc run srv tmp var bin dev home lib64 media opt root sbin sys usr 進入
/data/ 目錄為空目錄 #查看一下 docker inspect container-test
其中mount這裏: Mounts
": [ { "Name": "39b8c53c1fa3b1705997d6d0dbbaec7a99b88f03edfa9d4d1f89258c101b3f46", "Source": "/var/lib/docker/volumes/39b8c53c1fa3b1705997d6d0dbbaec7a99b88f03edfa9d4d1f89258c101b3f46/_data",  #宿主機目錄 "Destination": "/data",                                                     #容器內目錄
"Driver": "local", "Mode": "", "RW": true, "Propagation": "" } ] source 鍵值為容器/data/ 目錄在宿主機下的目錄 在 /var/lib/docker/volumes/39b8c53c1fa3b1705997d6d0dbbaec7a99b88f03edfa9d4d1f89258c101b3f46/_data 目錄下創建文件,即可實時在容器/data/目錄下顯示

二、將宿主機指定的目錄掛載到容器目錄

docker run -it -v /root/yzht:/data_1 centos /bin/bash ###將宿主機/root/yzht 目錄掛載到容器的/data_1目錄下,此時 /root/yzht 下的文件會在/data_1目錄下顯示

同樣在容器的掛載目錄下添加任何文件,都會在宿主機的目錄下顯示

三、數據共享

默認情況下,docker容器掛載的目錄為可讀可寫,如果只想讓容器讀,則:

docker run -d -P --name web -v /src/webapp:/webapp:ro training/webapp python app.py  #ro為只讀

如果要授權一個容器訪問另一個容器的Volume,我們可以使用 -volumes-from 參數來執行 docker run

$ docker run -it -h NEWCONTAINER --volumes-from container-test centos /bin/bash   # container-test 為共享的容器的名稱
root@NEWCONTAINER:/# ls /data
test-file
root@NEWCONTAINER:/#

值得註意的是不管container-test是否運行,它都會起作用。只要有容器連接Volume,它就不會被刪除。


Data Volume Container 數據卷容器

如果你有一些持續更新的數據需要在容器之間共享,最好創建Data Volume Container,然後加載 它。現在就來創建一個命名的數據卷容器:

docker run -d -v /dbdata --name dbdata training/postgres echo Data-only container for postgres

#然後,你可以在其他容器中使用--volumes-from 來掛載/dbdata卷 
$ sudo docker run -d --volumes-from dbdata --name db1 training/postgres 
$ sudo docker run -d --volumes-from dbdata --name db2 training/postgres

#還可以使用多個--volumes-from 參數來從多個容器掛載多個數據卷 #也可以從其他已經掛載了容器卷的容器來掛載數據卷 
$ sudo docker run -d --name db3 --volumes-from db1 training/postgres

如果移除了掛載的容器,包括初始容器,或者後來的db1 db2,這些卷在有容器使用它的時候不 會被刪除。這可以讓我們在容器之間升級和移動數據


利用 Data Volume Container 來備份、恢復、移動數據卷

數據卷另外一個功能是使用他們來備份、恢復、移動數據。使用--volume標記來創建一個加載了卷 的新的容器,命令如下:

docker run --rm --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata

這裏我們創建了一個容器,先從dbdata容器來掛載數據卷。然後從本地主機掛載當前到容器 的/backup目錄。最後,使用tar命令來將dbdata卷備份為back.tar。當命令執行完、容器停止之後,我 們就備份了dbdata數據卷。


你可以使用這個備份來恢復這個容器。

$ sudo docker run -v /dbdata --name dbdata2 ubuntu /bin/bash

#然後使用untar解壓這個備份文件到新容器卷中。

$ sudo docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar

你可以用上述技術實現數據卷的備份、移動、恢復。

刪除Volumes


這個功能可能會更加重要,如果你已經使用 docker rm 來刪除你的容器,那可能有很多的孤立的Volume仍在占用著空間

該容器可以用 docker rm -v 來刪除且沒有其它容器連接到該Volume(以及主機目錄是也沒被指定為Volume)。註意, -v 是必不可少的。
docker run 中使用 rm 參數

# docker volume ls -f dangling=true    #找到懸空卷
# docker volume rm <volume name>      #刪除不再需要的體積。

創建自定義的容器卷

docker volume create -d flocker --opt o=size=20GB my-named-volume

掛載一個文件:
docker run --rm -it -v ~/.bash_history:/root/.bash_history ubuntu /bin/bash


備份、遷移voluem

docker run --rm --volumes-from dbstore -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata

恢復備份的容器

docker run -v /dbdata --name dbstore2 ubuntu /bin/bash

Then un-tar the backup file in the new container`s data volume.

docker run --rm --volumes-from dbstore2 -v $(pwd):/backup ubuntu bash -c "cd /dbdata && tar xvf /backup/backup.tar --strip 1"

掛載主機目錄

選擇 -v 還是 -–mount 參數Docker 新用戶應該選擇 --mount 參數,經驗豐富的 Docker 使用者對 -v 或者 --volume 已經很熟悉了,但是推薦使用 --mount 參數。

掛載一個主機目錄作為數據卷使用 --mount 標記可以指定掛載一個本地主機的目錄到容器中去

$ docker run -d -P     --name web     # -v /src/webapp:/opt/webapp \
    --mount type=bind,source=/src/webapp,target=/opt/webapp     training/webapp     python app.py

上面的命令加載主機的 /src/webapp 目錄到容器的 /opt/webapp目錄。這個功能在進行測試的時候十分方便,比如用戶可以放置一些程序到本地目錄中,來查看容器是否正常工作。本地目錄的路徑必須是絕對路徑,以前使用 -v 參數時如果本地目錄不存在 Docker 會自動為你創建一個文件夾,現在使用 --mount 參數時如果本地目錄不存在,Docker 會報錯。

Docker 掛載主機目錄的默認權限是 讀寫,用戶也可以通過增加 readonly 指定為 只讀

$ docker run -d -P     --name web     # -v /src/webapp:/opt/webapp:ro \
    --mount type=bind,source=/src/webapp,target=/opt/webapp,readonly     training/webapp     python app.py

加了 readonly 之後,就掛載為 只讀 了。如果你在容器內 /opt/webapp 目錄新建文件,會顯示如下錯誤

查看數據卷的具體信息,在主機裏使用以下命令可以查看 web 容器的信息

$ docker inspect web

掛載主機目錄 的配置信息在 "Mounts" Key 下面

"Mounts": [
    {
        "Type": "bind",
        "Source": "/src/webapp",
        "Destination": "/opt/webapp",
        "Mode": "",
        "RW": true,
        "Propagation": "rprivate"
    }
],

掛載一個本地主機文件作為數據卷--mount 標記也可以從主機掛載單個文件到容器中

$ docker run --rm -it    # -v $HOME/.bash_history:/root/.bash_history \
   --mount type=bind,source=$HOME/.bash_history,target=/root/.bash_history    ubuntu:17.10    bash

這樣就可以記錄在容器輸入過的命令了。

docker 基礎 之數據管理