docker学习笔记-存储位置修改

通过docker镜像安装了可道云,发现一个问题,数据存储在系统分区,可能出现存储空间不够的问题.

如何在不影响数据的情况下将存储位置改到其他磁盘?

经查阅资料,有以下4种解决途径:

  • 挂载目录-在目标磁盘建立目录,运行容器时使用-v挂载到容器

  • 建立软连接 -将现有数据拷贝到新位置,在原来位置建立软链接指向新位置

  • 将docker存储目录直接mount到一个单独分区

  • 修改docker配置,将默认存储位置改到新分区

后两种都要停止docker服务才能修改,现有数据的迁移也比较复杂;第二种好处是在docker的volume命令中可以看到数据卷,但是需要停止docker容器;第一种方法好处是可以通过新建容器测试,完全不影响原容器,新容器调整好之后停止原容器即可,适合新手.

一 新建容器时挂载目录实现数据迁移

因处于尝试阶段,为避免影响原数据,我采取了创建新容器的方式实现数据迁移,基本步骤如下:

(一)拷贝现有数据到目标位置

使用docker inspect命令或宝塔面板查看,发现可道云容器运行后,数据都存放在一个自动创建的数据卷中,位置在/var/lib/docker/volumes/容器名文件夹下,数据卷内有一个_data文件夹,所有数据就存放在这里.

  1. 使用rsyns拷贝现有数据(与cp相比可实现增量备份)

rsyns -arP /var/lib/docker/volumes /srv/docker
  1. 使用宝塔查看文件位置是否正确

(二)启动新容器挂载目录

# 直接挂载目录,我采用的这种方式
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命令进入到容器查看时,会看到修改后的文件.但是如果使用宝塔查看文件功能,可能看到是容器内的原始文件.

猜你喜欢

转载自blog.csdn.net/reverie_2007/article/details/128723797
今日推荐