Docker的持久化存储和数据共享
Container Layer
数据默认会写在 Container Layer 层,如果删除容器则应用数据也会随之消失,应用数据的生命周期随容器的生命周期。
Docker 持久化数据的方案
- 基于本地文件系统的 Volume。可以在执行 Docker create 或 Docker run 时,通过-v 参数将主机的目录作为容器的数据卷。
- 基于 plugin 的 Volume,支持第三方的存储方案,比如 NAS,AWS。
数据持久化: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