目录

Life in Flow

知不知,尚矣;不知知,病矣。
不知不知,殆矣。

X

Docker的持久化存储和数据共享

Container Layer

Container
 数据默认会写在 Container Layer 层,如果删除容器则应用数据也会随之消失,应用数据的生命周期随容器的生命周期。

Docker 持久化数据的方案

  • 基于本地文件系统的 Volume。可以在执行 Docker create 或 Docker run 时,通过-v 参数将主机的目录作为容器的数据卷。
  • 基于 plugin 的 Volume,支持第三方的存储方案,比如 NAS,AWS。

数据持久化:Data Volume

Data Volume

  • 受管理的 Data Volume,由 docker 后台自动创建。
  • 绑定挂载的 Volume,具体挂载位置可以由用户指定。
     不管以上哪种方式都需要在 Dockerfile 内指定 VOLUME。
 1[root@localhost ~]# docker run -d --name mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql
 2
 3# 查看volume
 4[root@localhost ~]# docker volume ls
 5local               d4c4991c29f14a193f87460de0b847ec30f5f4d1f87b3f95349dca90b300eacf
 6
 7# 查看指定volume的详细信息(挂载点)
 8[
 9    {
10        "CreatedAt": "2019-07-11T09:35:16+08:00",
11        "Driver": "local",
12        "Labels": null,
13        "Mountpoint": "/var/lib/docker/volumes/d4c4991c29f14a193f87460de0b847ec30f5f4d1f87b3f95349dca90b300eacf/_data",
14        "Name": "d4c4991c29f14a193f87460de0b847ec30f5f4d1f87b3f95349dca90b300eacf",
15        "Options": null,
16        "Scope": "local"
17    }
18]
19
20# 删除容器volume依然存在,但是名字太长,不容易识别,查看挂载点。
21[root@localhost ~]# ls /var/lib/docker/volumes/d4c4991c29f14a193f87460de0b847ec30f5f4d1f87b3f95349dca90b300eacf/_data
22auto.cnf       binlog.index  client-cert.pem  ibdata1      ibtmp1        mysql.ibd           public_key.pem   sys
23binlog.000001  ca-key.pem    client-key.pem   ib_logfile0  #innodb_temp  performance_schema  server-cert.pem  undo_001
24binlog.000002  ca.pem        ib_buffer_pool   ib_logfile1  mysql         private_key.pem     server-key.pem   undo_002
25
26# 创建容器时候指定volume的名称
27[root@localhost ~]# docker run -d -v mysql_volume:/var/lib/mysql --name mysql1 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql
28[root@localhost ~]# docker volume ls
29DRIVER              VOLUME NAME
30local               d4c4991c29f14a193f87460de0b847ec30f5f4d1f87b3f95349dca90b300eacf
31local               mysql_volume
32
33# 进入mysql1容器并创建新数据库docker,退出后,删除容器
34[root@localhost ~]# docker exec -it mysql1 /bin/bash
35root@33aec55f8c5f:/# mysql -u root
36mysql> create database docker;
37[root@localhost ~]# docker stop mysql1
38[root@localhost ~]# docker rm mysql1
39
40#  查看mysql_volume依然存在
41[root@localhost ~]# docker volume ls
42DRIVER              VOLUME NAME
43local               mysql_volume
44
45# 重新创建mysql容器时候指定mysql_volume,进入容器查看数据库发现docker依然存在。
46[root@localhost ~]# docker run -d -v mysql_volume:/var/lib/mysql --name mysql1 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql
47[root@localhost ~]# docker exec -it mysql1 /bin/bash
48root@3e6e0352da30:/# mysql -u root 
49mysql> show databases;
50+--------------------+
51| Database           |
52+--------------------+
53| docker             |
54| information_schema |
55| mysql              |
56| performance_schema |
57| sys                |
58+--------------------+
595 rows in set (0.01 sec)
60
61
62# 查看mysql_volume具体的挂载点
63[root@localhost ~]# docker volume inspect mysql_volume
64[
65    {
66        "CreatedAt": "2019-07-11T09:56:34+08:00",
67        "Driver": "local",
68        "Labels": null,
69        "Mountpoint": "/var/lib/docker/volumes/mysql_volume/_data",
70        "Name": "mysql_volume",
71        "Options": null,
72        "Scope": "local"
73    }
74]

数据持久化:Bind Mouting

 docker run -v /centos/aaa:/docer/aaa
 数据同步,方便开发者修改调试。

1[root@localhost ~]# docker run -d -v /test/html:/usr/share/nginx/html -p 80:80 --name web nginx

作者:Soulboy