18-數據持久化-Data Volume
Data Volume 使用場景。一般來講有些容器自己會產生一些數據,我們不想數據隨著容器的銷毀而銷毀,我們想保存數據,正常一般用在數據庫,比如我們想保存數據庫中的數據,這個時候我們就會使用 Data Volume。
創建數據庫容器
我們通過創建一個 mysql 的數據庫來看看如何數據持久化。
我們先查看一下 mysql 的安裝方式,通過 docker hub 來查找。
我們點擊 5.7.25, 5.7, 5 (5.7/Dockerfile)
這一條查看它的Dockerfile。
...
VOLUME /var/lib/mysql
...
我們可以看到上面這一句,含義就是創建容器的時候就會產生一個 /var/lib/mysql
的 Data Volume。
例子1:
-
創建一個無密碼的mysql容器
docker run -d -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql1 mysql
正常mysql數據庫是需要賬戶和密碼的,為了方便我們不使用密碼。
-
查看本地的 Data Volume
[vagrant@10 ~]$ docker volume ls DRIVER VOLUME NAME local 1f40fd662b4cf5b83abde370c659a42bf0a706ef58451baa11c4d58c1bc17083
可以看到本地產生了一個 Data Volume,這就是 mysql的創建的過程中會去創建一個 Volume,也就是之前在它的Dockerfile中看到的那一段。
-
查看指定volume的詳細信息
[vagrant@10 ~]$ docker volume inspect 1f40fd662b4cf5b83abde370c659a42bf0a706ef58451baa11c4d58c1bc17083 [{"CreatedAt": "2019-02-14T01:32:54Z","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/1f40fd662b4cf5b83abde370c659a42bf0a706ef58451baa11c4d58c1bc17083/_data","Name": "1f40fd662b4cf5b83abde370c659a42bf0a706ef58451baa11c4d58c1bc17083","Options": null,"Scope": "local"} ]
我們發現這個volume是mount到本地的
/var/lib/docker/volumes/
下。 -
再次創建一個mysql容器
docker run -d -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql2 mysql
-
查看本地的 Data Volume
[vagrant@10 ~]$ docker volume ls DRIVER VOLUME NAME local 1f40fd662b4cf5b83abde370c659a42bf0a706ef58451baa11c4d58c1bc17083 local 4a6269797a9e1f4c4fd43f80fd96a1bb9ac8174aec867947b5aee182fae0d3b8
又產生了一個新的volume。
-
查看新產生的volume的詳細信息
[vagrant@10 ~]$ docker volume inspect 4a6269797a9e1f4c4fd43f80fd96a1bb9ac8174aec867947b5aee182fae0d3b8 [{"CreatedAt": "2019-02-14T01:37:02Z","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/4a6269797a9e1f4c4fd43f80fd96a1bb9ac8174aec867947b5aee182fae0d3b8/_data","Name": "4a6269797a9e1f4c4fd43f80fd96a1bb9ac8174aec867947b5aee182fae0d3b8","Options": null,"Scope": "local"} ]
如果我們刪除volume對應的mysql容器,這個volume是不會自動刪除的,我們實驗一下。
刪除mysql2
docker stop mysql2 && docker rm mysql2
查看本地volume情況
[vagrant@10 ~]$ docker volume ls DRIVER VOLUME NAME local 1f40fd662b4cf5b83abde370c659a42bf0a706ef58451baa11c4d58c1bc17083 local 4a6269797a9e1f4c4fd43f80fd96a1bb9ac8174aec867947b5aee182fae0d3b8
我們發現這個volume是沒有跟著刪除的,達到了數據持久化的目的,解決了數據丟失。
-
volume設置別名
我們可以發現volume的名字有點太長了,并且不友好。
那我們可以給volume設定一個別名,這樣更方便我們識別volume。
刪除我們之前創建的所有mysql容器和數據卷volume。
docker stop mysql1 && docker rm mysql1 docker volume rm 1f40fd
查看數據卷是否全部刪除
[vagrant@10 ~]$ docker volume ls DRIVER VOLUME NAME
重新創建一個mysql容器
docker run -d -v mysql:/var/lib/mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql1 mysql
查看本地的volume
[vagrant@10 ~]$ docker volume ls DRIVER VOLUME NAME local mysql
-
驗證是否數據的生成的數據同步到這個mysql數據卷內
進入mysql容器
docker exec -it mysql1 /bin/bash
進入mysql數據庫命令行
mysql -u root
顯示當前數據庫的databases
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.03 sec)
創建一個新的docker databases
mysql> create database docker; Query OK, 1 row affected (0.01 sec)
查看mysql當前的databases
mysql> show databases; +--------------------+ | Database | +--------------------+ | docker | | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.00 sec)
退出mysql和容器
exit exit
刪除mysql1容器
docker stop mysql1 && docker rm mysql1
查看volume是否還在
[vagrant@10 ~]$ docker volume ls DRIVER VOLUME NAME local mysql
我們發現是還在的。那我們后面再重新創建一個mysql并使用這個volume,是不是剛剛創建的docker databease還會存在呢?答案是的。
再次創建一個mysql2容器,并還是使用剛剛的mysql數據卷
docker run -d -v mysql:/var/lib/mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql2 mysql
進入mysql容器并查看databases
docker exec -it mysql2 /bin/bash
root@b0614271afc6:/# mysql -u root mysql> show databases; +--------------------+ | Database | +--------------------+ | docker | | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.01 sec)
我們發現docker database還在。
總結
在以后的工作中,如果你使用docker,那么你可能會經常使用volume,它可以幫助我們保護數據而不隨著容器的銷毀而銷毀。
docker的數據持久化也比較簡單,在容器的Dockerfile中添加 VOLUME 字段,那么容器在創建的時候會映射到docker的volume上并生成一個名字,但是這個名字很難記,是一堆字符串。那么我們可以通過 -v
參數來修改這個volume的名字,讓我們可以更好的識別它。