php网站开发推荐书籍,教育中介公司网站建设费用,个人版的wordpress怎么加关键词,科技感背景素材18-数据持久化-Data Volume
Data Volume 使用场景。一般来讲有些容器自己会产生一些数据#xff0c;我们不想数据随着容器的销毁而销毁#xff0c;我们想保存数据#xff0c;正常一般用在数据库#xff0c;比如我们想保存数据库中的数据#xff0c;这个时候我们就会使用 …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_PASSWORDtrue --name mysql1 mysql正常mysql数据库是需要账户和密码的为了方便我们不使用密码。 查看本地的 Data Volume [vagrant10 ~]$ docker volume ls
DRIVER VOLUME NAME
local 1f40fd662b4cf5b83abde370c659a42bf0a706ef58451baa11c4d58c1bc17083可以看到本地产生了一个 Data Volume这就是 mysql的创建的过程中会去创建一个 Volume也就是之前在它的Dockerfile中看到的那一段。 查看指定volume的详细信息 [vagrant10 ~]$ 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_PASSWORDtrue --name mysql2 mysql查看本地的 Data Volume [vagrant10 ~]$ docker volume ls
DRIVER VOLUME NAME
local 1f40fd662b4cf5b83abde370c659a42bf0a706ef58451baa11c4d58c1bc17083
local 4a6269797a9e1f4c4fd43f80fd96a1bb9ac8174aec867947b5aee182fae0d3b8又产生了一个新的volume。 查看新产生的volume的详细信息 [vagrant10 ~]$ 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情况 [vagrant10 ~]$ 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查看数据卷是否全部删除 [vagrant10 ~]$ docker volume ls
DRIVER VOLUME NAME重新创建一个mysql容器 docker run -d -v mysql:/var/lib/mysql -e MYSQL_ALLOW_EMPTY_PASSWORDtrue --name mysql1 mysql查看本地的volume [vagrant10 ~]$ 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是否还在 [vagrant10 ~]$ 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_PASSWORDtrue --name mysql2 mysql进入mysql容器并查看databases docker exec -it mysql2 /bin/bashrootb0614271afc6:/# 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的名字让我们可以更好的识别它。