述
數(shù)據(jù)卷,可以繞過拷貝系統(tǒng),在多個容器之間,或者容器和宿主機(jī)之間共享目錄或者文件,數(shù)據(jù)卷繞過了拷貝系統(tǒng),可以達(dá)到本地磁盤I/O性能
示例
以之前的nginx鏡像為例,運(yùn)行一個容器,然后再運(yùn)行的時候,指定一個數(shù)據(jù)卷,用-v
參數(shù),具體命令如下:
docker run -tid --name nginx -v /usr/share/nginx/html/ -p 80:80 27a188018e18
執(zhí)行完畢之后,我們就創(chuàng)建一個數(shù)據(jù)卷并且掛載到容器的/usr/share/nginx/html/
目錄下面,該目錄其實(shí)是nginx保存html目錄,在這里掛載數(shù)據(jù)卷,一會我們只需修改本地的映射位置,就可以實(shí)現(xiàn)頁面的修改了.
使用docker inspect
命令來查看一下剛剛創(chuàng)建的容器的具體信息,找到數(shù)據(jù)卷映射目錄,如下:
docker inspect c39c3e362d27
找到下面這個部分:
從上圖中可以看到,Docker默認(rèn)將宿主機(jī)的/var/lib/docker/volumes/609df55091699750b86ee1f870e56050d4083a5159c0234360ffe9f903e41b55/_data
這個目錄作為source目錄,然后我們進(jìn)到這個目錄中,看一下文件,如下:
這個目錄下面的文件跟容器中的/usr/share/nginx/html/
目錄下的文件是一致的,這是因?yàn)閽燧d一個空數(shù)據(jù)卷到容器中的一個非空目錄中時這個目錄下的文件會被復(fù)制到數(shù)據(jù)卷中,如果掛載一個非空的數(shù)據(jù)卷
到容器中的一個目錄中,那么容器中的目錄中會顯示數(shù)據(jù)卷中的數(shù)據(jù).如果原來容器中的目錄中有數(shù)據(jù),那么
這些原始數(shù)據(jù)會被隱藏掉
然后現(xiàn)在先訪問一下nginx的首頁,內(nèi)容如下:
現(xiàn)在我們把宿主機(jī)中,剛才目錄下面的index.html修改掉,命令如下:
echo "hello volumes" > index.html
修改完成之后,再回到瀏覽器中,看一下首頁內(nèi)容,內(nèi)容已經(jīng)發(fā)生更改了,如下:
使用宿主機(jī)目錄做數(shù)據(jù)卷
上面我們使用數(shù)據(jù)卷是系統(tǒng)隨機(jī)分配的一個目錄,一般情況下,需要我們明確的指定宿主機(jī)中的一個目錄掛載到容器中,方式如下:
docker run -tid --name nginx -v /usr/docker/nginx/html:/usr/share/nginx/html/ -p 80:80 27a188018e18
這樣就是將宿主機(jī)中的/usr/docker/nginx/html
目錄掛載到容器的/usr/share/nginx/html/
目錄下.
接下來只需要修改/usr/docker/nginx/html
這個目錄下的文件,就可以在nginx中看到效果
這種用法對于開發(fā)測試非常方便,不用重新部署,重啟容器等.宿主機(jī)地址是一個絕對路徑
Dockerfile中掛載數(shù)據(jù)卷
如果我們使用了Dockerfile去構(gòu)建鏡像的話,也可以在構(gòu)建鏡像的時候聲明數(shù)據(jù)卷,例如下面這個Dockerfile:
FROM nginx
ADD https://www.baidu.com/img/bd_logo1.png /usr/share/nginx/html/
RUN echo "hello docker volume!">/usr/share/nginx/html/index.html
VOLUME /usr/share/nginx/html/
通過VOLUME
就配置了一個匿名的數(shù)據(jù)卷,由于沒有指定掛載到的宿主機(jī)目錄,因此會默認(rèn)掛載到宿主機(jī)的/var/lib/docker/volumes下的一個隨機(jī)名稱的目錄下,因此Dockerfile中使用VOLUME指令掛載目錄和docker run時通過-v參數(shù)指定掛載目錄的區(qū)別在于,run的-v可以指定掛載到宿主機(jī)的哪個目錄,而Dockerfile的VOLUME不能,其掛載目錄由docker隨機(jī)生成
數(shù)據(jù)卷的一些常用操作
查看所有數(shù)據(jù)卷
命令:
docker volume ls
查看數(shù)據(jù)卷詳情
命令:
docker volume inspect <VOLUME NAME>
刪除數(shù)據(jù)卷
單個刪除:
docker volume rm <VOLUME NAME>
批量刪除:
docker volume prune
批量刪除的時候,只能刪除掉沒有在使用中的數(shù)據(jù)卷,正在使用中的需要停止相關(guān)的容器然后再次刪除.