Linux运维知识之Docker存储管理
沉沙 2019-01-02 来源 : 阅读 1200 评论 0

摘要:本篇教程探讨了Linux运维知识之Docker存储管理,希望阅读本篇文章以后大家有所收获,帮助大家对相关内容的理解更加深入。

本篇教程探讨了Linux运维知识之Docker存储管理,希望阅读本篇文章以后大家有所收获,帮助大家对相关内容的理解更加深入。

Linux运维知识之Docker存储管理

<

一 Docker volume形态
因为Docker 采用 AFUS 分层文件系统时,文件系统的改动都是发生在最上面的容器层,在容器的生命周期内,它是持续的,包括容器在被停止后。但是,当容器被删除后,该数据层也随之被删除了。因此,Docker 采用 volume (卷)的形式来向容器提供持久化存储。Docker volume 有如下几种形态。
    默认,即无Docker volume
    Data volume (数据卷)
    data container(数据卷容器)
二 默认无volume
默认情况下,容器不使用任何 volume,此时,容器的数据被保存在容器之内,它只在容器的生命周期内存在,会随着容器的被删除而被删除,此时若需要永久保存可使用 docker commit 命令将它持久化为一个新的镜像。
三 Data volume (数据卷)
一个 data volume 是容器中绕过 Union 文件系统的一个特定的目录。被设计用来保存数据,而不管容器的生命周期。因此,当你删除一个容器时,Docker 不会自动地删除一个volume。
3.1 -v挂载容器内目录
数据卷特性:
    数据卷是目录或文件,而非没有格式化的磁盘(块设备)
    数据卷可以在容器之间共享和重用
    对数据卷的修改会立马生效
    对数据卷的更新,不会影响镜像
    数据卷默认会一直存在,即使容器被删除
root@docker:~# docker run -d -p 8080:80/tcp --name web01 -v /webroot:/usr/local/apache2/htdocs httpd #挂载固定目录
root@docker:~# docker run -d -p 9090:80/tcp --name web02 -v /usr/local/apache2/htdocs httpd #自动映射目录
    -d:后台进程;
    -p:映射端口,物理机端口:容器端口;
    -v:物理机文件夹:容器的目录(容器中目录如果不存在,会自动创建,如果存在,会覆盖掉),即将宿主机中的目录挂载到镜像中的目录。
提示:若需要挂载多个目录,可多次采用-v。
区别:
类型
 
挂载固定目录
 
自动映射目录
volume 位置
 
可任意指定
 
/var/lib/docker/volumes/……
对已有mount point 影响
 
隐藏并替换为 volume
 
原有数据复制到 volume
是否支持单个文件
 
支持
 
不支持,只能是目录
权限控制
 
可设置为只读,默认为读写权限
 
无控制,均为读写权限
移植性
 
移植性弱,与host path绑定
 
移植性强,无需指定host目录
  1 root@docker:~# docker inspect b7 | grep -A11 "Mounts"
  2 root@docker:~# echo "Hello web01!" >/webroot/index.html
  3 root@docker:~# echo "Hello web02!" >/var/lib/docker/volumes/725d7d76ec8eb10f5730fe5663cb1d1eb7481efaa2a5a790343dca5d0557564a/_data/index.html
 
39_thumb1
提示:若不指定本地目录则会自动在宿主机/var/lib/docker/volumes下为其生成一个随机目录。
40_thumb1
测试:浏览器访问://172.24.8.90:8080/
41_thumb1
测试:浏览器访问://172.24.8.90:9090/
42_thumb1
提示:采用volumes数据卷的情况下,当对应的容器被删除时,其挂载的目录会保留。主机上的目录可以是一个本地目录,也可以在一个 NFS share等形式。
3.2 -v挂载文件
  1 root@docker:~# docker run --rm -it --name centos7-01 -v ~/.bashrc:/root/.bashrc centos:7
提示:本地主机文件作为数据卷挂载到容器中,不建议在容器中直接修改。
四 docker的数据共享
4.1 docker容器与宿主机共享数据
方式一:docker cp
cp的用法如下:
  1 docker cp [OPTIONS] CONTAINER:PATH LOCALPATH|-
  2 docker cp [OPTIONS] LOCALPATH|- CONTAINER:PATH
  3 root@docker:~# docker cp /root/.vimrc centos7-01:/root/   #从宿主机拷贝至容器
  4 root@docker:~# docker cp centos7-01:/root/.vimrc /root/.vimrc_bak         #从容器拷贝至宿主机
 
方式二:采用数据卷挂载形式,见3。
4.2 docker容器之间共享数据
情景一:共享host宿主机目录
将同一个host目录挂载到不同的容器即可。
  1 root@docker:~# docker run -d -p 1010:80/tcp --name web03 -v /webroot:/usr/local/apache2/htdocs httpd
  2 root@docker:~# docker run -d -p 2020:80/tcp --name web04 -v /webroot:/usr/local/apache2/htdocs httpd
  3 root@docker:~# echo "This is share file!" >/webroot/index.html
 
测试:浏览器分别访问//172.24.8.90:1010和///172.24.8.90:2020/。
4.2 docker容器与容器共享数据
见5.data container(数据卷容器)。
五 data container(数据卷容器)
data container中不会跑应用,而只是挂载一个卷,volume container是专门为其他容器提供volume的容器,它提供的卷的类型可以是bind mount,也可以是docker managed volume。
5.1 创建数据卷容器
data container。这种 container 中不会跑应用,而只是挂载一个卷。
  1 root@docker:~# docker create --name sharefile01 -v /data:/usr/local/apache2/htdocs centos:7
  2 root@docker:~# docker inspect sharefile01 | grep -A11 "Mounts"
 
43_thumb1
解释:创建一个名为sharefile01的用于容器之间共享数据的数据卷容器,并将宿主机的/data目录挂载至该容器的/usr/local/apache2/htdocs目录。
提示:其他容器只需获取数据卷容器的挂载点,因此可该容器可不运行。/usr/local/apache2/htdocs为容器中的目录,并非宿主机本地目录,当其他容器引用此容器时,会自动在容器中挂载此目录。
5.2 引用数据卷容器
新建容器时可通过--volumes-from参数指定需要引用的数据卷容器。
  1 root@docker:~# docker run -d -p 3030:80/tcp --name web05 --volumes-from sharefile01 httpd
  2 root@docker:~# docker run -d -p 4040:80/tcp --name web06 --volumes-from sharefile01 httpd
  3 root@docker:~# echo "This is share file two!" >/data/index.html
 
测试:浏览器分别访问//172.24.8.90:3030和///172.24.8.90:4040/。
六 volume管理
6.1 创建volume卷
  1 root@docker:~# docker volume create --name data02
  2 root@docker:~# docker volume inspect data02
 
44_thumb1
6.2 使用volume卷
  1 root@docker:~# docker run -d -p 5050:80/tcp --name web07 -v data02:/usr/local/apache2/htdocs httpd
  2 root@docker:~# echo "Hello web07!" > /var/lib/docker/volumes/data02/_data/index.html
 
测试:浏览器访问//172.24.8.90:5050。
6.3 查看volume卷
  1 root@docker:~# docker volume ls    #查看所有volume卷
  2 root@docker:~# docker volume ls -qf dangling=true         #查看所有孤儿卷
 
提示:使用 docker run -v 启动的容器被删除以后,在主机上所挂载的卷不会删除,即残留孤儿卷。
6.4 删除volume卷
  1 root@docker:~# docker volume rm 95704ae78c05261a46d2dc1f2bf872a8c3dc634817e7c0db53e7e6d40f2dc8ea
  2 root@docker:~# docker volume rm $(docker volume ls -qf dangling=true) #删除孤儿卷
 
6.5 删除容器时删除 volume
  1 root@docker:~# docker run -d -p 6060:80/tcp --name web08 -v /usr/local/apache2/htdocs httpd
  2 root@docker:~# docker inspect web08
 
45_thumb1
  1 root@docker:~# docker rm -vf web08
  2 root@docker:~# docker volume ls
 
提示:若容器采用静态固定挂载,则使用-vf也无法删除volume卷。
七 volume数据备份及还原
7.1 备份
原理:将需要备份的容器,如web09,当做数据卷容器,以此容器创建一个mydatabackup临时容器,并将宿主机/mybackup挂载到mydatabackup容器的/databack,并在该临时容器中执行备份的打包命令,备份需要保存数据的目录,如/usr/local/apache2到/databack,也就是备份到宿主机/mybackup目录。
  1 root@docker:~# docker run -d -p 1111:80/tcp --name web09 -v /usr/local/apache2/htdocs  httpd
  2 root@docker:~# docker inspect web09 | grep -A11 "Mounts"
  3 root@docker:~# echo "This is web09 backup test!">/var/lib/docker/volumes/16aa6956e7076ecb9f256c302833640880e3bb1b8602771cca378e7230975488/_data/index.html
 
46_thumb1
提示:创建用于备份的容器,并备份该文件。
  1 root@docker:~# docker run --volumes-from web09 --name mydatabackup -v /mybackup:/databack httpd tar zcf /databack/http-backup.tar.gz /usr/local/apache2/htdocs
47_thumb1
7.2 还原
原理:新建一个临容器,如temp01,然后将容器需要保存的数据的目录,如/usr/local/apache2挂载至宿主机,然后再并将宿主机/mybackup挂载到该容器的/databack,将temp01临时容器当做数据卷容器新建web10容器,并将备份文件解压恢复,则恢复至temp01容器所挂载的宿主机目录,再以temp01为数据卷容器创建新的容器即可。
  1 root@docker:~# docker run -d -v /usr/local/apache2/htdocs --name temp01 httpd
  2 root@docker:~# docker run --volumes-from temp01 --name web10 -v /mybackup:/databack httpd tar zxf /databack/http-backup.tar.gz
  3 #此步骤执行完毕即将备份文件已经还原至容器的/usr/local/apache2/htdocs。
  4 root@docker:~# docker run -d -p 2222:80/tcp --name web11 --volumes-from temp01 httpd
 
测试:浏览器访问//172.24.8.90:2222。
48_thumb1    

本文由职坐标整理发布,学习更多的相关知识,请关注职坐标IT知识库!

本文由 @沉沙 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程