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/mysqlData Volume

例子1:

  1. 创建一个无密码的mysql容器

    docker run -d -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql1 mysql
    

    正常mysql数据库是需要账户和密码的,为了方便我们不使用密码。

  2. 查看本地的 Data Volume

    [vagrant@10 ~]$ docker volume ls
    DRIVER              VOLUME NAME
    local               1f40fd662b4cf5b83abde370c659a42bf0a706ef58451baa11c4d58c1bc17083
    

    可以看到本地产生了一个 Data Volume,这就是 mysql的创建的过程中会去创建一个 Volume,也就是之前在它的Dockerfile中看到的那一段。

  3. 查看指定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/下。

  4. 再次创建一个mysql容器

    docker run -d -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql2 mysql
    
  5. 查看本地的 Data Volume

    [vagrant@10 ~]$ docker volume ls
    DRIVER              VOLUME NAME
    local               1f40fd662b4cf5b83abde370c659a42bf0a706ef58451baa11c4d58c1bc17083
    local               4a6269797a9e1f4c4fd43f80fd96a1bb9ac8174aec867947b5aee182fae0d3b8
    

    又产生了一个新的volume。

  6. 查看新产生的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是没有跟着删除的,达到了数据持久化的目的,解决了数据丢失。

  7. 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
    
  8. 验证是否数据的生成的数据同步到这个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的名字,让我们可以更好的识别它。

发布了145 篇原创文章 · 获赞 357 · 访问量 44万+

猜你喜欢

转载自blog.csdn.net/wf19930209/article/details/87381511