volume的建立
為了能夠儲存(持久化)資料以及共享容器間的資料,Docker提出了Volume的概念.簡單來說,Volume就是目錄或者檔案,它可以繞過預設的聯合檔案系統,而以正常的檔案或者目錄的形式存在于主控端上.
我們可以通過兩種方式來初始化Volume,這兩種方式有些細小而又重要的差别.我們可以在運作時使用-v來聲明Volume:
[[email protected] volume]# docker run -it --name container-test -h CONTAINER -v /data busybox /bin/sh
/ #
/ # ls /data
上面的指令會将/data挂載到容器中,并繞過聯合檔案系統,我們可以在主機上直接操作該目錄.任何在該鏡像/data路徑的檔案的檔案都會被複制到Volume.我們可以使用docker inspect指令找到Volume在主機上的存儲位置:
$docker inspect container-test
"Mounts": [
{
"Name": "6407cbb6700a4076cdeeef60629f1748ff34310102480a3f702fd3fee9e69134",
"Source": "/var/lib/docker/volumes/6407cbb6700a4076cdeeef60629f1748ff34310102480a3f702fd3fee9e69134/_data",
"Destination": "/data",
"Driver": "local",
"Mode": "",
"RW": true
}
],
這說明Docker把在/var/lib/docker下的某個目錄挂載到了容器内的/data目錄下.讓我們從主機添加檔案都此檔案夾下:
[email protected]:~# touch /var/lib/docker/volumes/6407cbb6700a4076cdeeef60629f1748ff34310102480a3f702fd3fee9e69134/_data/test-file
進入容器
[email protected]:~# docker exec -it container-test /bin/sh
[email protected]:/# ls /data/
test-file
隻要将主機的目錄挂載到容器的目錄上,那改變就會立即生效.我們可以在Dockerfile中通過使用VOLUME指令來達到相同的目的:
FROM ubunut VOLUME /data
但是還有另一件隻有-v參數能夠做到而Dockerfile是做不到的事情就是在容器上挂載指定的主機目錄.例如:
(冒号前面是主機的目錄 : 冒号後面是docker容器的目錄)
[email protected]:~# docker run -v /data/mysql:/data/mysql busybox
該指令将挂載主機的/data/mysql目錄到容器内的/data目錄上.任何在/data/mysql目錄下的檔案都會出現在容器内.這對于在主機和容器之間共享檔案是非常有用的,例如挂載需要編譯的源代碼.為了保證可移植性,挂載主機目錄不需要從Dockerfile指定.當使用-v參數時,鏡像目錄下的任何檔案都不會被複制到Volume中.
資料共享
如果要授權一個容器通路另一個容器的Volume,我們可以使用-volumes-from參數來執行docker run
[email protected]:~# docker run -it -h NEWCONTAINER --volumes-from container-test busybox /bin/bash
[email protected]:/# ls /data/
test-file
值得注意的是,就算你這個時候把container-test停止了,它仍然會起作用.隻要有容器連接配接Volume,他就不會被删除,如果這個時候你執行:
[email protected]:~# docker rm container-test
Error response from daemon: Conflict, You cannot remove a running container. Stop the container before attempting removal or use -f
Error: failed to remove containers: [container-test]
資料容器
通常使用資料容器來持久化資料庫和資料檔案。
$ docker run --name dbdata mysql echo "data only"
建立了一個名為dbdata的資料容器,運作完echo之後就停止了。資料容器是不需要運作的,隻要建立好了就可以了。
$ docker run -d --volumes-from dbdata --name db1 mysql
啟動一個資料庫服務容器,連接配接到dbdata資料容器上。
注意:
資料容器不需運作,純粹是在浪費資源
不需為資料容器單獨使用一個小的鏡像,直接使用資料庫鏡像本身就可以了
删除Volumes
這個功能太重要了,如果你已經使用docker run來删除你的容器,那可能會有很多孤立的Volume仍在占用着空間.
Voulume可以被删除的條件:
1.該容器可以用docker rm -v來删除且沒有其他容器連接配接到該Volume(以及主機目錄是也沒被指定為Volume).注意,-v是必不可少的.
2.docker run中使用rm參數.
資料備份
如果要備份mysql資料庫,我們需要備份資料容器中的/var/lib/mysql檔案夾。
$ docker run --rm --volumes-from dbdata -v $(pwd):/backup ubuntu tar zcvf /backup/mysql.tar.gz /var/lib/mysql
此時就會在目前目錄下生成一個mysql.tar.gz檔案。