天天看點

docker volume mysql_docker volume的了解

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檔案。