18-数据持久化-Data Volume
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的名字,讓我們可以更好的識別它。
總結
以上是生活随笔為你收集整理的18-数据持久化-Data Volume的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#解密出生日期【C#】
- 下一篇: 遗传算法-01背包