如何通过持久化将数据存储到Volume

如何通过持久化将数据存储到Volume,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

创新互联建站-专业网站定制、快速模板网站建设、高性价比同江网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式同江网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖同江地区。费用合理售后完善,十年实体公司更值得信赖。

有些时候容器会产生一些数据,而我们不希望这些数据随着容器的删除而删除。想保证数据的安全,一般用在数据库。

首先看一下container和image的区别:

如何通过持久化将数据存储到Volume

container容器是在image之上创建的,container layer可以读写数据,而image是只读的,而我们在container中谢的数据仅限于在当前container中读写,如果把container停止和删除,那么之前写的文件和数据都删除了,所以container是临时存储和保存数据的。

如果有这样的需求:如果我们创建一个MySQL数据库的container,数据都是以文件的形式存储在本地的,如果把mysql容器删除,那么数据就被删除了,这是不可取的。

docker引入了一个持久化的机制。

如何通过持久化将数据存储到Volume

默认情况下会将数据写入到Container Layer,但是我们可以通过持久化将数据存储到Volume。即使容器被删除了,那么只要Volume还在,我们数据就还在,被保存了下来。

Docker持久化数据方案:

  • 基于本地文件系统的Volume。可以在执行Docker create 或Docker run时,通过-v参数将主机的目录作为容器的数据卷。这部分功能便是基于本地文件系统的volume管理。

  • 基于plugin的volume。支持第三方的存出方案,比如NAS,aws

 Volume的类型:

  • 受管理的data volume,由docker后台自动创建。

  • 绑定挂在的Volume,具体挂在位置可以由用户指定。

准备环境

创建一个mysql的container,

iie4bu@hostdocker:~$ docker run -d --name mysql-1 -e MYSQL_ALLOW_EMPTY_PASSWORD mysql 
886583d9191dd8df6deed609f31e9e15ed854f83a85b4b47c335b04a441b55b3
iie4bu@hostdocker:~$ docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

-e MYSQL_ALLOW_EMPTY_PASSWORD表示使用空密码

查询镜像发现没有运行

查看日志:docker logs mysql-1

iie4bu@hostdocker:~$ docker logs mysql-1
error: database is uninitialized and password option is not specified 
  You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD

把这个镜像删除,重新创建。

先看一下我们本地是否有volume?

iie4bu@hostdocker:~$ docker volume ls
DRIVER              VOLUME NAME
local               01d091f0bc6a045d10d56b5892dc55ccb2c6cda6b19cbcc8ca3c7adc9b3c477b
local               0e4b3a8c4be019d86c855a773865e5472dbc0629a7b542d44fe5d132be07ee87

发现有很多,都是之前创建的。可以先删除掉:

docker volume rm 01d091f0bc6a045d10d56b5892dc55ccb2c6cda6b19cbcc8ca3c7adc9b3c477b

小技巧:

    可以删除所有的volume:

docker volume rm $(docker volume ls -q)

重新创建mysql镜像:

 iie4bu@hostdocker:~$ docker run -d --name mysql-1 -e MYSQL_ALLOW_EMPTY_PASSWORD=yes mysql 
48ea258e299a6c74f0762e2bd5ff580422160d02ab600d26aec716ca983fc90e
iie4bu@hostdocker:~$
iie4bu@hostdocker:~$ docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                 NAMES
48ea258e299a        mysql               "docker-entrypoint.s…"   37 seconds ago      Up 36 seconds       3306/tcp, 33060/tcp   mysql-1
iie4bu@hostdocker:~$

现在可以看到mysql已经运行了,查看volume:

iie4bu@hostdocker:~$ docker volume ls
DRIVER              VOLUME NAME
local               575c4038694e1abf8e883fc029813a745de6e5f412412eebec7c1a5b9c46e35d
iie4bu@hostdocker:~$

这个就是mysql的volume

查看volume详细信息:

iie4bu@hostdocker:~$ docker volume inspect 575c4038694e1abf8e883fc029813a745de6e5f412412eebec7c1a5b9c46e35d
[
    {
        "CreatedAt": "2019-07-01T14:33:51+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/575c4038694e1abf8e883fc029813a745de6e5f412412eebec7c1a5b9c46e35d/_data",
        "Name": "575c4038694e1abf8e883fc029813a745de6e5f412412eebec7c1a5b9c46e35d",
        "Options": {},
        "Scope": "local"
    }
]

发现volume的数据是在/var/lib/docker/volumes/575c4038694e1abf8e883fc029813a745de6e5f412412eebec7c1a5b9c46e35d/_data路径下。

我们再创建一个mysql:

iie4bu@hostdocker:~$ docker run -d --name mysql-2 -e MYSQL_ALLOW_EMPTY_PASSWORD=yes mysql 
200afb2c335e45bd76ad9b3b8d97f29a23972702ae2c4f82be9ebde1d619b644
iie4bu@hostdocker:~$ docker volume ls
DRIVER              VOLUME NAME
local               54bbb749bc0b45dfa1de4eff8b94620e3184ade9633ffdeaeef230dbcd20c0cc
local               575c4038694e1abf8e883fc029813a745de6e5f412412eebec7c1a5b9c46e35d

查看这个新的volume:

iie4bu@hostdocker:~$ docker volume inspect 54bbb749bc0b45dfa1de4eff8b94620e3184ade9633ffdeaeef230dbcd20c0cc
[
    {
        "CreatedAt": "2019-07-01T14:50:46+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/54bbb749bc0b45dfa1de4eff8b94620e3184ade9633ffdeaeef230dbcd20c0cc/_data",
        "Name": "54bbb749bc0b45dfa1de4eff8b94620e3184ade9633ffdeaeef230dbcd20c0cc",
        "Options": {},
        "Scope": "local"
    }
]

实验:如果将容器停止,是否volume是否还在:

先将mysql-1和mysql-2停止:

iie4bu@hostdocker:~$ docker container stop mysql-1 mysql-2
mysql-1
mysql-2

然后将mysql-1和mysql-2删除:

iie4bu@hostdocker:~$ docker container rm mysql-1 mysql-2
mysql-1
mysql-2

确认我们本地没有容器在运行:

iie4bu@hostdocker:~$ docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
iie4bu@hostdocker:~$

但是volume还在:

iie4bu@hostdocker:~$ docker volume ls
DRIVER              VOLUME NAME
local               54bbb749bc0b45dfa1de4eff8b94620e3184ade9633ffdeaeef230dbcd20c0cc
local               575c4038694e1abf8e883fc029813a745de6e5f412412eebec7c1a5b9c46e35d
iie4bu@hostdocker:~$

给volume起别名,方便以后好使用

先将上面的两个volume删除掉:

docker volume rm 54bbb749bc0b45dfa1de4eff8b94620e3184ade9633ffdeaeef230dbcd20c0cc
docker volume rm 575c4038694e1abf8e883fc029813a745de6e5f412412eebec7c1a5b9c46e35d

新建一个mysql的容器,并且制定-v选项:

docker run -d -v mysql:/var/lib/mysql --name mysql-1 -e MYSQL_ALLOW_EMPTY_PASSWORD=yes mysql
7a4ec8f6b8409c7877683d7cd7d2ce3bc85e029aab561b36aea3970a2e8ddcdb

-v 表示本地的volume是mysql,映射到容器中是/var/lib/mysql,查看volume:

docker volume ls
DRIVER              VOLUME NAME
local               mysql

进入mysql-1容器内部:

docker exec -it mysql-1 /bin/bash
root@7a4ec8f6b840:/# mysql -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.16 MySQL Community Server - GPL

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

mysql> create database docker;
Query OK, 1 row affected (0.01 sec)

添加了一个数据库,名叫docker

然后退出容器,并将mysql-1容器停止,然后删除:

docker container stop mysql-1
mysql-1
docker container rm mysql-1
mysql-1

但是我们使用docker volume ls 仍然可以看到mysql的volume

docker volume ls
DRIVER              VOLUME NAME
local               mysql

我们创建一个容器mysql-2,使用这个volume:

docker run -d -v mysql:/var/lib/mysql --name mysql-2 -e MYSQL_ALLOW_EMPTY_PASSWORD=yes mysql
fb66669da26a8ada40b276e3ae972e8597d911822ef6e4ea90fed211c46eeb1e

然后我们进入这个mysql-2容器中,并且查看数据库:

docker exec -it mysql-2 /bin/bash
root@fb66669da26a:/# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.16 MySQL Community Server - GPL

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| docker             |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.01 sec)

发现docker数据库还在,说明和之前的mysql-1的数据库是同一个数据库。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注创新互联行业资讯频道,感谢您对创新互联的支持。


新闻标题:如何通过持久化将数据存储到Volume
URL标题:http://scyanting.com/article/jdohie.html