目录

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。
[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

作者:Soulboy