docker 基礎 之數據管理
數據卷
一、將本地默認目錄掛在道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 基礎 之數據管理