APP下载

管理Docker容器的数据卷

2017-03-08

网络安全和信息化 2017年10期
关键词:宿主机镜像命令

Docker容器数据卷的功能

数据卷从本质上说,是存在于Docker宿主机的文件系统中。数据卷既可以是目录也可以是文件,Docker容器可以借助于数据卷技术,与宿主机进行数据共享。数据卷中的同一个目录和文件,可以支持多个容器进行访问,这样就实现了容器间的数据共享和交互。

数据卷在容器启动时进行初始化,如果容器使用的镜像在挂载点包含了数据,这些数据会复制到新初始化的数据卷中。数据卷可在容器间共享和重用,容器对数据卷的修改是即时进行的,所有的修改可以直接体现的数据卷中。数据卷的变化不会对镜像更新造成影响。

为容器添加数据卷的命令格式为“sodu docker run-v ~/container_data:/data-it ubuntu /bin/bash”,其中的“-v”参数可指定数据卷在本机文件系统中的目录和在容器中映射的目录名。

在Ubuntu的终端窗口中执行“docker run-it-v~/datavalume:/data ubuntu/bin/bash”命令,来创建包含数据卷的容器,其中的“~/datavalume”为本地目录,处于当前用户的Home目录下。如果该目录不存在,命令运行后会自动创建。“/data”为容器中的目录名。

该命令运行后就启动了该容器,执行“ls”命令,在返回信息中可以看到名为“data”的目录。在其中可以自由的存储数据,例如执行“touch /data/c1”,“echo"this is new dictory">/data/c1”命令,可在其中创建一个新的文件并写入数据。执行“exit”命令退出容器,执行“ls-l”命令,可看到本机上存在“datavolume”目 录,执 行“ls-l datavolume”命令,可看到在上述容器中存储的数据,这充分说明数据卷和容器是彼此独立的。

执 行“docker ps -l”命令,显示刚才创建的镜像。执行“docker inspect xxxxxxxxxxxx”命令,显示该镜像的元数据,在其中显示了上述数据卷信息,其中的“xxx”参数表示该镜像的ID。为数据卷添加访问权限的命令格式为“sudo docker run -v ~/datavolume:/data:ro -it ubuntu/bin/bash”。

还以上述例子进行说明,执 行“docker run-it-v~/datavalume:/data:ro ubuntu/bin/bash”命令,创建一个镜像,为其设置数据卷,并设置其拥有只读权限。当挂载了数据卷后,只能读取其中的数据,当试图向其中写入数据时,系统就会提示出错。

执 行“exit”命令退出容器,执行“docker inspect rqt1”命令,在返回信息中的数据卷名称后会显示“VolumesRW:{"/data":false}”信息,说明其没有写权限。除了使用“run”命令,在创建容器时添加数据卷外,还可以使用Dockerfile指令创建包含数据卷的镜像,并利用该镜像创建容器。例如,执行“vim Dockerfile”命令,在其中添加“From ubuntu:14.04”,“VOLUME [/datavolume1,/datavolume1]”,“CMD/bin/bash”行,其中使用了“Volume”指令创建了两个数据卷。

和上述命令不同,在Dockfile中创建的数据卷是无法映射到已经存在的本地文件目录中的。在镜像构建时指定的数据卷,会在容器创建时,创建指定名称的数据卷。

运行不同镜像的不同容器,所创建的数据卷也是不同的。执行“docker build-t dormancypress/xxx.”命令,构建该镜像,其中的“xxx”为镜像名称。执行“docker run--name rqt3-it dormancypress/rqt”命令,运行名称为“rqt3”容器。

执 行“ls” 命 令,在新建的容器中自动挂载 了“datavolume1” 和“datavolume2”两个目录。执行“exit”命令退出容器,执 行“docker inspect rqt3”命令,在返回信息中的“Volumes”栏中显示上述两个数据卷,与其对应的本地路径是Docker自动创建的。如果执行“docker run--name rqt4-it dormancypress/rqt”等命令,创建新的容器,对其进行检测的话,会发现上述数据卷的路径是迥然不同的。因此,按照这种方法创建的数据卷是无法在不同容器间共享的。

创建Docker数据卷容器

为了解决该问题,可以使用数据卷容器(Data Container)来实现共享。数据卷容器指的是用命名的容器挂载数据卷,其他的容器通过挂载该容器实现数据共享,这样的容器就是数据卷容器。在Docker主机中,数据卷容器挂载了一个本地目录,其他容器通过连接该数据卷容器,来实现数据的共享。挂载数据卷容器的语法规则是“docker run--volume-from [CONTAINER NAME]”。例如,执行“docker run --name rqt4 -it dormancypress/rqt”命令,创建名为“rqt4”的容器。

进入其中的“datavolume1”目录,在其中存储名为“test.c”的文件。执行“exit”命令退出,执 行“docker run--name rqt5 --volumes-from rqt4 ubuntu /bin/bash”命令,创建名为“rqt5”的容器,用来挂载上述“rqt4”容器。在该容器中执行“ls”命令,可以看到已经挂载了在“rqt4”中加载的“datavolume1”和“datavolume2”数据卷。执行“ls /datavolume1”命令,可以显示在其中存储的文件。同理,在其中可以存储更多的文件。

当退出该容器,执行“docker run--name rqt6-volumes-from rqt4 ubuntu/bin/bash”命令,创建的新容器,依然可以看到上述数据卷,并在“datavolume1”中显示所有存在的文件。

这样,通过使用名为“rqt5”的数据卷容器,就可以在不同的容器之间共享数据了。而且并不要求使用者确切的连接到已知的Docker宿主机的文件目录,这对于多用户的使用环境是很重要的,避免暴露Docker服务器的实际目录信息。

当退出所有的容器 后, 执 行“docker inspect-format="{{.volume}}"rqt5”命令,在返回信息中很清晰的看到,使用数据卷容器挂载数据卷,并不会直接的反映数据卷容器的信息,而直接显示其所挂载的数据卷目录。即使执行“docker rm rqt4”命令,删除挂载数据卷的容器,当执 行“docker attch rqt5”命令启动“rqt5”等容器后,依然可以正常的访问其挂载的目录。

通过数据卷容器来挂载数据卷,容器在其中的作用只是用来传递数据卷配置信息。执行“docker run --name rqt8 -it dormancypress/rqt”命令,创建名为“rqt4”的容器。执行“docker run--name rqt9--volumes-from rqt8 ubuntu/bin/bash”命令,来挂载“rqt8”容器。在该容器中的“datavolume1”目录中写入“newfile.sh”文件。之后退出该容器。执行“docker rm -v rqt8”命令,删除“rqt8”容器,其中的“-v”参数可以同时删除其中的数据卷。但是,当再次启动“rqt9”容器,依然可以在其中的“datavolume1”目录中查看到之前存储的文件,并可以存储新的文件。

备份和恢复数据卷

与备份相关的命令格式为“docker run --volumesfrom [container name]-v$(pwd):/backup ubuntu tar vcf /backup/backup.tar[container data volume]”。在该命令行中使用 了“--volumes-from”参数挂载了需备份数据的容器名,实际上是将当前创建的容器指向参数中容器挂载的目录。“-v”参数指定了需要保存数据的路径,可以是当前本机的路径。将需要备份的数据容器与备份目录,同时挂载到执行备份命令的容器上,而需要备份数据的容器,实际上也是挂载在本机上的数据卷中。

例如,执行“cocker restart rqt5”,“docker attach rqt5”命令,重启并登录到“rqt5”容器上。当需要备份中的“datavolume1”数据卷时,可以先退出该容 器,执 行“docker run--name rqt10--volumesfrom rqt5 -/~beifen:/backup:wr ubuntu/bin/bash tar vcf/backup/rqt5.tar/datavolume1”命令,可以针对“rqt5”中的数据卷进行备份,新建立的容器为“rqt10”,将其复制到本机中当前用户目录下的“beifen”目录中,“/backup”为容器中指定的目录,“datavolume1”为需要备份的数据卷。当执行完毕后,在Docker主机本地上打开当前用户目录,可以看到名为“beifen”的目录,其中包含了备份的数 据。 执 行“docker run--volumes-from [container name] -v$(pwd):/backup ubuntu tar xvf /backup/backup.tar [container data volume]”之类的命令,可以通过解压还原操作,将备份的数据还原回去。

猜你喜欢

宿主机镜像命令
只听主人的命令
镜像
嵌入式计算机软件测试关键技术研究
镜像
移防命令下达后
虚拟网络实验室在农村职校计算机网络技术教学中的应用研究
这是人民的命令
镜像
对卢沟桥事变期间一份“作战命令”的考析