Docker的持久化存储和数据共享
Container Layer
数据默认会写在Container Layer层,如果删除容器则应用数据也会随之消失,应用数据的生命周期随容器的生命周期。
Docker持久化数据的方案
- 基于本地文件系统的Volume。可以在执行Docker create或Docker run时,通过-v参数将主机的目录作为容器的数据卷。
- 基于plugin的Volume,支持第三方的存储方案,比如NAS,AWS。
数据持久化:Data Volume
- 受管理的Data Volume,由docker后台自动创建。
- 绑定挂载的Volume,具体挂载位置可以由用户指定。
不管以上哪种方式都需要在Dockerfile内指定VOLUME。
[root@localhost ~]# docker run -d --name mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql
# 查看volume
[root@localhost ~]# docker volume ls
local d4c4991c29f14a193f87460de0b847ec30f5f4d1f87b3f95349dca90b300eacf
# 查看指定volume的详细信息(挂载点)
[
{
"CreatedAt": "2019-07-11T09:35:16+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/d4c4991c29f14a193f87460de0b847ec30f5f4d1f87b3f95349dca90b300eacf/_data",
"Name": "d4c4991c29f14a193f87460de0b847ec30f5f4d1f87b3f95349dca90b300eacf",
"Options": null,
"Scope": "local"
}
]
# 删除容器volume依然存在,但是名字太长,不容易识别,查看挂载点。
[root@localhost ~]# ls /var/lib/docker/volumes/d4c4991c29f14a193f87460de0b847ec30f5f4d1f87b3f95349dca90b300eacf/_data
auto.cnf binlog.index client-cert.pem ibdata1 ibtmp1 mysql.ibd public_key.pem sys
binlog.000001 ca-key.pem client-key.pem ib_logfile0 #innodb_temp performance_schema server-cert.pem undo_001
binlog.000002 ca.pem ib_buffer_pool ib_logfile1 mysql private_key.pem server-key.pem undo_002
# 创建容器时候指定volume的名称
[root@localhost ~]# docker run -d -v mysql_volume:/var/lib/mysql --name mysql1 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql
[root@localhost ~]# docker volume ls
DRIVER VOLUME NAME
local d4c4991c29f14a193f87460de0b847ec30f5f4d1f87b3f95349dca90b300eacf
local mysql_volume
# 进入mysql1容器并创建新数据库docker,退出后,删除容器
[root@localhost ~]# docker exec -it mysql1 /bin/bash
root@33aec55f8c5f:/# mysql -u root
mysql> create database docker;
[root@localhost ~]# docker stop mysql1
[root@localhost ~]# docker rm mysql1
# 查看mysql_volume依然存在
[root@localhost ~]# docker volume ls
DRIVER VOLUME NAME
local mysql_volume
# 重新创建mysql容器时候指定mysql_volume,进入容器查看数据库发现docker依然存在。
[root@localhost ~]# docker run -d -v mysql_volume:/var/lib/mysql --name mysql1 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql
[root@localhost ~]# docker exec -it mysql1 /bin/bash
root@3e6e0352da30:/# mysql -u root
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| docker |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.01 sec)
# 查看mysql_volume具体的挂载点
[root@localhost ~]# docker volume inspect mysql_volume
[
{
"CreatedAt": "2019-07-11T09:56:34+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/mysql_volume/_data",
"Name": "mysql_volume",
"Options": null,
"Scope": "local"
}
]
数据持久化:Bind Mouting
docker run -v /centos/aaa:/docer/aaa
数据同步,方便开发者修改调试。
[root@localhost ~]# docker run -d -v /test/html:/usr/share/nginx/html -p 80:80 --name web nginx