Docker 持久化存储, Data Volume
Posted chengege
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker 持久化存储, Data Volume相关的知识,希望对你有一定的参考价值。
docker容器, 再启动之后 我们可以对其进行 修改删除等等。
如果是一个数据库的容器, 里面的数据 不想随着这个容器的消失, 而消失。 就需要持久化数据存储。
Data Volume
这是 docker hub 上面 mysql 的Dockerfile 这里的 VOLUME 意思就是, 将产生的数据 写入到当前主机的 /var/lib/mysql 里面。
[miller@docker4 ~]$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE daocloud.io/library/mysql latest 9228ee8bac7a 11 days ago 547MB
[miller@docker4 ~]$ docker run -d --name=mysql1 -e MYSQL_ALLOW_EMPTY_PASSWORD=true daocloud.io/library/mysql e7945f20bc456038a110a9798299356c8e7912a22eceaaf4e2bd29880460ab6f
-e MYSQL_ALLOW_EMPTY_PASSWORD=true 告诉mysql 没有密码也可以用。
https://hub.docker.com/_/mysql 这里有一些参数的详解。 也可以设置密码。
[miller@docker4 ~]$ docker volume ls # 会在主机上找个地方存 数据
DRIVER VOLUME NAME
local 283f5d6584642ae6d32d5e02fd1330855b501dd891ddf38c5b40428183c652c8 # 这个是redis的
local 330b65bda64c22b0929443d9eaa2db28c3a2468f76876b706c8efdbcbf6e4919 # 这个是mysql的
[miller@docker4 docker]$ docker volume inspect 330b65bda64c22b0929443d9eaa2db28c3a2468f76876b706c8efdbcbf6e4919 [ { "CreatedAt": "2020-04-11T20:26:36+08:00", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/330b65bda64c22b0929443d9eaa2db28c3a2468f76876b706c8efdbcbf6e4919/_data", "Name": "330b65bda64c22b0929443d9eaa2db28c3a2468f76876b706c8efdbcbf6e4919", "Options": null, "Scope": "local" } ]
"Mountpoint": "/var/lib/docker/volumes/330b65bda64c22b0929443d9eaa2db28c3a2468f76876b706c8efdbcbf6e4919/_data" 这个路径就是安装docker这台主机
上的文件路径。 数据库产生的数据 都会存储到这里。 volume 是不会因为容器的删除 而消失。
由于volume的名字不友好, 可以自己定义:起别名:
[miller@docker4 ~]$ docker run -d --name=mysql1 -v mysql:/var/lib/mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=true daocloud.io/library/mysql 7b006082d7d9c1cc8f17dfaefda26afea6d2adb0c89b216eafe193fa9420c917
-v mysql:/var/lib/mysql 就这一段参数。根mysql的 Dockerfile 中 Volume [/var/lib/mysql] 一样就可以了。
[miller@docker4 ~]$ docker volume ls
DRIVER VOLUME NAME
local 330b65bda64c22b0929443d9eaa2db28c3a2468f76876b706c8efdbcbf6e4919 # redis的
local mysql # 刚刚创建的 mysql 容器的 volume
可以进到 MySQL 容器中,登录客户端。
[miller@docker4 ~]$ docker exec -it mysql1 /bin/bash
root@c057b8fbb3ad:/# mysql -u root Welcome to the MySQL monitor. Commands end with ; or g. Your MySQL connection id is 8 Server version: 8.0.19 MySQL Community Server - GPL Copyright (c) 2000, 2020, 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>
在这个数据库里面, 创建一个库 然后, 停止mysql容器, 再删除容器。
[miller@docker4 ~]$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c057b8fbb3ad daocloud.io/library/mysql "docker-entrypoint.s…" 4 minutes ago Up 4 minutes 3306/tcp, 33060/tcp mysql1 [miller@docker4 ~]$ docker rm -f mysql1 # 停止这个容器 并且删除 mysql1
[miller@docker4 ~]$ docker volume ls
DRIVER VOLUME NAME
local 330b65bda64c22b0929443d9eaa2db28c3a2468f76876b706c8efdbcbf6e4919
local mysql # volume 是还在的。 后面再创建一个 容器 然后依然使用这个 volume
# 可以看到, 再次重新创建一个 容器。 依然使用同一个 volume 的话。 还能继续使用原来的数据。 是没有丢的。
[miller@docker4 ~]$ docker run -d --name=mysql2 -v mysql:/var/lib/mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=true daocloud.io/library/mysql f9cfe55e7e6d85a6c44bc177fb324051e5735e80dbf30c5224cbfd0c7f844181
[miller@docker4 ~]$ docker exec -it mysql2 mysql -u root Welcome to the MySQL monitor. Commands end with ; or g. Your MySQL connection id is 8 Server version: 8.0.19 MySQL Community Server - GPL Copyright (c) 2000, 2020, 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 持久化存储, Data Volume的主要内容,如果未能解决你的问题,请参考以下文章