一、DOCKER 容器的数据
docker 主要有两种数据存储形式, 一种是storage driver(也叫做 Graph driver), 另一种是 volume driver. stroage driver主要是存储那些无状态的数据, 写入密集型的场景应该使用 volume driver.
======================
storage driver
======================
容器运行的文件系统是镜像层和容器层组成的, 一层一层叠加, 只有最上面的那层是可写的, 其他层都是只读的. Docker通过Union FS技术支持文件的读写和新建, Docker 采用插件式的方式支持多种Union FS实现, 官方文档中一般使用stroage driver术语, 目前已经有多种实现的插件, 比如: aufs/overlay/overlay2/devicemanger等等.
======================
volume driver
======================
volume driver 经常用来实现数据持久化和文件共享功能, 具体有两种存在方式, 分别是:
1. bind mount 方式:
是将host的目录或文件直接mount到容器中, host的目录或文件既可以容器运行之前就已存在的, 也可以是在容器运行之前不存在的.
如果在docker run 命令中采用了 -v /host/dir_or_file:/container/dir_or_file的形式, 就是bind mount方式, 即指定了host的挂载点的绝对路径.
2. volume 方式:
是由 Docker 管理, 该volume最终存储到host的 /var/lib/docker/volumes 下. volume 方式还分为 named volume 和 Anonymous volume.
named volume 有两种创建方法,
(1) docker run 命令中采用了 -v one_volume_name:/container/dir_or_file , 这里的one_volume_name不是host中的绝对路径, 而是一个名称.
(2) 通过 docker volume create 创建的, 该命令支持更多的选项, 推荐使用.
匿名volume方式 是通过 docker run 命令中传入了 -v /container/dir 类型的参数.
3. bind mount 方式和volume方式的简单对比:
bind mount方式, docker容器直接访问host的目录或文件, 性能是最好的.
bind mount方式, docker容器直接访问host的目录或文件, 对于该host绝对目录可能会引入权限问题. 如果容器仅需要只读访问权限, 最好是显式设定只读方式.
对于 volume方式, 如果host中落地目录为空, docker先将容器中的对应目录复制到host下, 然后再进行挂载操作; 对于bind mount方式, 挂载之前没有复制操作.
容器要依赖host主机的一个绝对路径, 使得容器的移植性变差, docker 官方并不推荐这个方法, 而是推荐使用volume.
二、MSSQL SERVER 数据库数据的持久化
1、数据库文件存放位置
不考虑容器的移植,选用bind mount方式实现数据持久化,将主机的目录直接mount到容器中。生成容器mssql 时的参数 -v /f/sqlserver_data:/mnt/mssql/data 就完成了主机F盘
sqlserver_data目录直接映射到容器内/mnt/mssql/data目录下
2、数据库附加数据文件
将数据库文件拷贝到持久化目录下,在主机下运行SMSS,如图填写登录资料。密码参数 -e "SA_PASSWORD=<SQLOnLinux123>", 端口参数 -p 1533:1433
附加数据库,指定到持久化目录
选择数据库数据文件,系统自动识别出数据文件和日志文件,这里由于主机为WINDOWS操作系统,容器为LINUX操作系统,在文件区域斜杠要调整,否则系统找不到文件
调整斜杠后,文件路径变为:/mnt/mssql/data/test.mdf,/mnt/mssql/data/test_log.ldf ,数据库文件顺利导入数据库