docker數據卷應用場景
- 在多個容器之間共享數據,多個容器可以同時以只讀或者讀寫的方式掛載統一個數據卷,從而共享數據卷中的數據
- 當宿主機不能保證一定存在某一個目錄或一些固定的文件路徑時,使用數據卷可以規避這種限制帶來的問題
- 當想把容器中的數據存儲在宿主機之外的地方時,比如遠程主機上和雲存儲上
- 當你需要把容器數據在不同宿主機之間備份、恢復或遷移時,數據卷是很好的選擇
數據覆蓋問題
- 如果掛載一個空的數據捲到容器中的一個非空目錄中,那麼這個目錄下的文件會被複制到數據卷中
- 如果掛載一個非空的數據捲到容器中的一個目錄中,那麼容器中的目錄會顯示數據卷中的數據。如果原來容器中的目錄有數據,那麼原始數據會被隱藏掉
這兩個規則都非常重要,靈活利用第一個規則可以幫助我們初始化數據卷中的內容。掌握第二個規則可以保證掛載數據卷後的數據總是你期望的結果。
創建一個數據卷,然後將其掛載
$ docker volume create my-vol
$ docker run -d -p 80:80 -name webserver \
# -v my-vol:/webapp
--mount source=my-vol, target=/webapp \
nginx:latest
使用mount掛載數據卷
除了使用--volume(-v)掛載數據卷,現在docker提供了更強大的--mount選項來管理數據卷。mount選項可以通過都好分隔的多個鍵值對一次提供多個配置項,因此mount選項可以提供比volume選項更詳細的配置:
- type: 指定掛載方式,這裏我們用到是volume, 其實還可以是bind和tmpfs
- volume-dirver 指定掛載數據卷的驅動程序,默認是local
- source 指定掛載的源,對於一個命名的數據卷,治理應該指定這個數據卷的名稱,在使用時可以寫source, 也可以簡寫爲src
- destination 指定掛載的數據在容器中的路徑。在使用時可以寫destination,也可以簡寫爲dst和target
- readonly 指定掛載的數據爲只讀
- volume-opt 可以指定多次,用來提高更多的mount相關的配置
使用 volume driver把數據存儲到其它地方
除了默認的把數據卷中的數據存儲在宿主機,docker還允許我們通過指定volume driver的方式把數據卷中的數據存儲在其它地方,比如Azru Storage 或 AWS 的S3。
簡單起見,我們接下來的demo演示如何通過演示如何通過vieux/sshfs驅動把數據卷的存儲在其它的主機上。
docker默認時不安裝vieux/sshfs插件的,我們可以通過下面的命令進行安裝
$ docker plugin install --grant-permissions vieux/sshfs
然後通過vieux/sshfs創建數據卷,並指定遠程主機的登陸用戶名,密碼和數據存放目錄
$ docker volume create --driver vieux/sshfs \
-o [email protected]:/home/nick/sshvolume \
-o password=yourpassword \
mysshvolume
注意,請確保你指定的遠程主機上的掛載點目錄是存在的(demo中是/home/nik/sshvolume), 否則在容器啓動時會報錯。
最後,在啓動容器時指定掛載這個數據卷
$ docker run -d --name sshfs \
--mount type=volume,volume-driver=vieux/sshfs, source=mysshvolume, targe=myworld \
ubuntu /bin/bash
掛載主機目錄
$ docker run -d -p 80:80 --name webserver \
--mount type=bind,src=/data/docker,dst=/usr/share/nginx/html \
nginx