通过docker镜像安装了可道云,发现一个问题,数据存储在系统分区,可能出现存储空间不够的问题.
如何在不影响数据的情况下将存储位置改到其他磁盘?
经查阅资料,有以下4种解决途径:
挂载目录-在目标磁盘建立目录,运行容器时使用-v挂载到容器
建立软连接 -将现有数据拷贝到新位置,在原来位置建立软链接指向新位置
将docker存储目录直接mount到一个单独分区
修改docker配置,将默认存储位置改到新分区
后两种都要停止docker服务才能修改,现有数据的迁移也比较复杂;第二种好处是在docker的volume命令中可以看到数据卷,但是需要停止docker容器;第一种方法好处是可以通过新建容器测试,完全不影响原容器,新容器调整好之后停止原容器即可,适合新手.
一 新建容器时挂载目录实现数据迁移
因处于尝试阶段,为避免影响原数据,我采取了创建新容器的方式实现数据迁移,基本步骤如下:
(一)拷贝现有数据到目标位置
使用docker inspect命令或宝塔面板查看,发现可道云容器运行后,数据都存放在一个自动创建的数据卷中,位置在/var/lib/docker/volumes/容器名文件夹下,数据卷内有一个_data文件夹,所有数据就存放在这里.
使用rsyns拷贝现有数据(与cp相比可实现增量备份)
rsyns -arP /var/lib/docker/volumes /srv/docker
使用宝塔查看文件位置是否正确
(二)启动新容器挂载目录
# 直接挂载目录,我采用的这种方式
docker run -v /srv/docker/volumes/数据卷名/_data:/var/www/html 镜像名
# 完整参数可拷贝如下命令:
docker run -v /srv/docker/volumes/kodbox_data_volume/_data:/var/www/html -p 2222:80 -d --restart=always kodcloud/kodbox
# 不少资料推荐新建一个数据卷容器,我也实验了一下,也可以
# 创建数据容器,我是Ubuntu系统,直接使用Ubuntu镜像即可,因为数据容器不需要运行
docker run -v /srv/docker/volumes/数据卷名/_data:/var/www/html --name 数据容器名 ubuntu
# 创建可道云容器,挂载数据容器
docker run --volumes-from 数据容器名 镜像名
使用数据容器创建一次后其他容器可共享使用,避免出错,但是会有一个处于停止状态的容器,我担心误删就直接挂载目录了(其实误删也问题不大,文件夹不会受影响)
停止原容器,测试新容器
所有文件及用户登录信息等都可以正常使用
二 什么是数据卷
docker容器创建后会创建一个读写层,容器删除后该层内变化的数据就消失了.
为了方便在宿主系统修改数据()比如配置信息等),容器间数据共享,数据持久化等需要,docker使用数据卷来管理数据.
数据卷是宿主系统内文件夹在容器内的映射.
数据卷相当于一个U盘,独立于容器存在,容器间可以共享,不会随着容器删除而删除.数据卷挂载到容器,但不属于联合文件系统
数据卷特点:
位于宿主机文件系统,可用于宿主机及容器间数据共享
不属于某个容器,不随容器删除被删除
数据卷内的文件操作新建/修改/删除即时在宿主机和容器内生效
数据卷内数据更改不包含在镜像更新中
有三种数据卷:
宿主机数据卷(推荐) 使用-v创建,将宿主机文件夹映射到容器内,在容器内也可修改宿主机上的文件.
tips:虽然可以挂载文件或文件夹,docker官方建议只挂载文件夹
具名数据卷 使用明确命令创建数据卷
匿名数据卷 部分镜像运行时会自动创建数据卷,由docker管理,位置及名字不方便使用
docker管理数据卷的方式:
使用数据卷
使用数据卷容器
三 宿主机数据卷(bind mounts)
(一)bind mounts特点:
由宿主机文件系统创建,可以位于宿主机的任意位置
不由docker管理,所有容器包括宿主机其他进程都可访问/修改
即使是宿主机中重要文件或目录,容器中也可以修改
容器使用绝对路径访问宿主机中的文件,宿主机中的文件或目录不需要事先存在,需要时会自动创建
(二)文件覆盖问题
宿主机空文件夹映射到容器内非空文件夹,容器内数据将复制到宿主机
宿主机非空文件夹映射到容器,不论容器内有无内容,都将显示宿主机内文件
tips:映射成功后,如果修改宿主机内文件,使用exec命令进入到容器查看时,会看到修改后的文件.但是如果使用宝塔查看文件功能,可能看到是容器内的原始文件.