Docker基础-Docker数据管理
1、数据卷
数据卷是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似于Linux中的mount操作。
数据卷可以提供很多有用的特性:
1.数据卷可以在容器之间共享和重用,容器间传递数据将变得高效方便; 2.数据卷内数据的修改会立马生效,无论是容器内操作还是本地操作; 3.数据卷的更新不会影响镜像,解耦了应用和数据; 4.卷会一直存在,直到没有容器使用,可以安全卸载它。
1.在容器内创建一个数据卷
在使用docker run命令的时候,使用-v参数在容器内创建一个数据卷。多次重复使用可以创建多个数据卷。
举例如下:
[root@docker docker]# docker run -itd --name nginx -v /nginxdata -p 80:80 nginx:latest 2951cdfdaa53a2a4e0f67ab93bdc395a3587ce09e498d73b7fc83ffac387ea65 [root@docker docker]# [root@docker docker]# docker exec -it 2951cd /bin/bash root@2951cdfdaa53:/# ls bin boot dev etc home lib lib64 media mnt nginxdata opt proc root run sbin srv sys tmp usr var root@2951cdfdaa53:/#
可以看到容器里内已经存在一个数据卷:nginxdata
-p参数是暴露指定的容器服务端口到宿主机,其中 -p 80:80中,:前面的是宿主机的端口,:后面的是容器内暴露的端口,可以理解为将容器内暴露的端口绑定到宿主机。
2.挂载一个主机目录作为数据卷
使用-v参数也可以指定挂载一个本地目录到容器中去作为数据卷(推荐方式)。
举例如下:
[root@docker /]# docker run -itd --name nginx_3 -v /data/nginxdata/:/opt/nginxdata -p 8083:80 nginx:latest 728014689c945412bc645d7039bbc8c0a33a2ab6812eec0fc21dfe21c19adf26 [root@docker /]# docker exec -it nginx_3 /bin/bash root@728014689c94:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var root@728014689c94:/# cd /opt/nginxdata/ root@728014689c94:/opt/nginxdata# touch test.txt root@728014689c94:/opt/nginxdata# echo "write in container" > test.txt root@728014689c94:/opt/nginxdata# exit [root@docker /]# cd /data/nginxdata/ [root@docker nginxdata]# ls test.txt [root@docker nginxdata]# cat test.txt write in container [root@docker nginxdata]#
上面的:-v /data/nginxdata/:/opt/nginxdata是指将本地的/data/nginxdata/挂载到容器中的/opt/nginxdata作为数据卷。
在容器nginx_3中的/opt/nginxdata目录中创建一个test.txt并写入"write in container"然后退出容器,在/data/nginxdata/中也存在这个文件和内容。
当然,在本地写入数据之后,在容器中也是立即生效的:
[root@docker nginxdata]# echo "write in local" >>./test.txt [root@docker nginxdata]# cat test.txt write in container write in local [root@docker nginxdata]# docker exec -it nginx_3 /bin/bash root@728014689c94:/# cd opt/nginxdata/ root@728014689c94:/opt/nginxdata# cat test.txt write in container write in local root@728014689c94:/opt/nginxdata#
3.挂载一个本地文件作为数据卷
-v参数也可以指定一个本地文件挂载到容器中作为数据卷(不推荐)。
[root@docker ~]# docker run --rm -itd --name nginx_4 -v /data/nginxdata/index.html:/usr/share/nginx/html/index.html -p 8084:80 nginx:latest 9838611b1230ad85c96a4215151c281199e330c4b101b9e13f4179976aa338b3 [root@docker ~]#
把指定的index.html文件挂载到容器中nginx的网站空间/usr/share/nginx/html/中,并把原先的index.html替换掉了。
注意:
如果直接挂载一个文件到容器中,使用文件编辑工具,包括vi、vim或者sed --in-place的时候可能会造成文件inode的改变,从Dcker1.1.0起,会报错;推荐使用的方式是直接挂载文件所在的目录。
2、数据卷容器
如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。数据卷容器也是一个容器,但是它的目的是专门用来提供数据卷供其他容器挂载。
首先,创建一个数据卷容器,并在容器内创建一个数据卷挂载到/dbdata:
[root@docker ~]# docker run -it -v /dbdata --name dbdata centos:latest [root@695f96ac5b87 /]#
查看/dbdata目录:
[root@695f96ac5b87 /]# ls anaconda-post.log bin dbdata dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var [root@695f96ac5b87 /]# cd dbdata/ [root@695f96ac5b87 dbdata]# ls [root@695f96ac5b87 dbdata]#
在其他容器中使用--volumes-from来挂载dbdata容器中的数据卷:
创建db1和db2两个容器,都挂载在dbdata上,可以在两个容器中都能看到dbdata目录:
[root@docker ~]# docker run -it --volumes-from dbdata --name db1 centos:latest [root@6adc3ecfe19d /]# ls anaconda-post.log bin dbdata dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var [root@6adc3ecfe19d /]# exit exit [root@docker ~]# docker run -it --volumes-from dbdata --name db2 centos:latest [root@c9cade8bc911 /]# ls anaconda-post.log bin dbdata dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var [root@c9cade8bc911 /]# exit exit [root@docker ~]#
在dbdata容器的dbdata目录中写入数据:
[root@695f96ac5b87 /]# cd /dbdata/ [root@695f96ac5b87 dbdata]# ls [root@695f96ac5b87 dbdata]# echo "write in dbdata:/dbdata" > test.txt [root@695f96ac5b87 dbdata]# cat test.txt write in dbdata:/dbdata [root@695f96ac5b87 dbdata]#
分别在db1和db2中查看:
db1中查看:
[root@docker ~]# docker exec -it db1 /bin/bash [root@6adc3ecfe19d /]# ls anaconda-post.log bin dbdata dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var [root@6adc3ecfe19d /]# cd dbdata/ [root@6adc3ecfe19d dbdata]# ls test.txt [root@6adc3ecfe19d dbdata]# cat test.txt write in dbdata:/dbdata [root@6adc3ecfe19d dbdata]# echo "write in db1:/dbdata" >> test.txt [root@6adc3ecfe19d dbdata]# cat test.txt write in dbdata:/dbdata write in db1:/dbdata [root@6adc3ecfe19d dbdata]#
db2中查看:
[root@docker ~]# docker exec -it db2 /bin/bash [root@c9cade8bc911 /]# cd dbdata/ [root@c9cade8bc911 dbdata]# ls test.txt [root@c9cade8bc911 dbdata]# cat test.txt write in dbdata:/dbdata write in db1:/dbdata [root@c9cade8bc911 dbdata]# echo "write in db2:/dbdata" >> test.txt [root@c9cade8bc911 dbdata]# cat test.txt write in dbdata:/dbdata write in db1:/dbdata write in db2:/dbdata [root@c9cade8bc911 dbdata]#
最后在dbdata容器中查看分别在db1和db2中写入的数据:
[root@695f96ac5b87 dbdata]# cat test.txt write in dbdata:/dbdata write in db1:/dbdata write in db2:/dbdata [root@695f96ac5b87 dbdata]#
可以多次使用--volumes-from参数来从多个容器挂载多个数据卷。还可以从其他已经挂载了容器卷的容器来挂载数据卷。
举例如下:
[root@docker ~]# docker run -itd --name db3 --volumes-from db1 centos:latest 3cb31e1771c26f3b1dc74b7e00091cf25576c32dbebf824a5b20dbe79e243930 [root@docker ~]# docker exec -it db3 /bin/bash [root@3cb31e1771c2 /]# ls anaconda-post.log bin dbdata dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var [root@3cb31e1771c2 /]#
注意:
1.使用--volumes-from参数所挂载数据卷的容器自身并不需要保持在运行状态。
2.如果删除了挂载的容器(包括dbdata、db1和db2),数据卷并不会自动删除。如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时使用docker rm -v命令来指定同时删除关联的容器。
3、利用数据卷容器来迁移数据
可以利用数据卷容器对其中的数据卷进行备份、恢复,以实现数据的迁移。=
1.备份
[root@docker ~]# docker run --volumes-from dbdata -v $(pwd):/backup --name worker centos:latest tar zcf backup/backup.tar dbdata
命令解释:
1.首先利用centos:latest镜像创建了一个名为worker的容器,使用--volumes-from参数让worker容器挂载dbdata容器的数据卷/dbdata,使用-v $(pwd):/backup参数来挂载本地当前目录到worker容器的/backup目录。 2.worker容器启动后,使用了tar zcf backup/backup.tar /dbdata命令来将/dbdata下内容备份到/backup/backup.tar,即当前目录下会生成一个backup.tar的文件。
查看本地当前目录:
[root@docker ~]# ll total 525288 -rw-------. 1 root root 1071 Jan 19 2017 anaconda-ks.cfg -rw-r--r-- 1 root root 180 Nov 29 12:11 backup.tar -rw-r--r-- 1 root root 109 Nov 29 10:00 daemon.json -rwxr-xr-x 1 root root 67 Nov 28 16:13 docker-pid [root@docker ~]#
2.恢复
要将备份好的数据恢复到一个容器,先要创建一个带有数据卷的容器dbdata2,然后另建一个新的容器,挂载dbdata2的,并使用untar解压备份文件到所挂载的容器卷中。
举例如下:
[root@docker ~]# docker run -itd -v /dbdata --name dbdata2 centos:latest 60919fece4a797d174b2c40228ccf09558a76d092500ea8428b7f6163fec49a9 [root@docker ~]# docker run --volumes-from dbdata2 -v $(pwd):/backup --name db4 centos:latest tar xf /backup/backup.tar
在新的数据卷容器dbdata2中可以查案恢复结果:
[root@docker ~]# docker exec -it dbdata2 /bin/bash [root@60919fece4a7 /]# ls anaconda-post.log bin dbdata dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var [root@60919fece4a7 /]# cd dbdata/ [root@60919fece4a7 dbdata]# ls test.txt [root@60919fece4a7 dbdata]# cat test.txt write in dbdata:/dbdata write in db1:/dbdata write in db2:/dbdata [root@60919fece4a7 dbdata]#
转载于:https://www.cnblogs.com/jie-fang/p/7920201.html
Docker基础-Docker数据管理相关推荐
- docker基础——Docker是什么
Docker概念简介 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中, ...
- docker 基础之数据管理
数据卷 一.将本地默认目录挂载到docker容器内指定的目录 #将本地的目录挂在到docker容器内 docker run -it --name container-test -h CONTAINER ...
- Docker之docker基础
Docker之docker基础 docker架构 docker镜像与镜像仓库 为什么镜像仓库名字是Registry而不是repository?在docker中仓库的名字是以应用的名称取名的. 镜像是静 ...
- Docker之旅(1)-Docker基础
一.Docker 简介 1.1 Docker 概念 Docker 于 2013 年开源,其基于 go 语言开发,是一个开源的 PaaS 服务(Platform as a Service,平台即服务的缩 ...
- Docker基础讲解狂神笔记:容器数据卷,docker compose,docker swarm(2/2)未修订版欢迎留言补漏
L06 容器数据卷 相对于01-05难度加大 什么是容器数据卷 Docker理念:将应用和环境打包成一个镜像! 程序要保存数据,数据并不能放在容器里面,因为一旦数据放在容器,误操作删除掉容器,数据也随 ...
- Docker学习(2)——图文并茂讲解Docker基础命令
一.Docker基础命令总结 命令 功能 docker load -i ubuntu.tar 导入镜像 docker run -it --name vm1 ubuntu 创建容器(以ubuntu镜像为 ...
- Docker基础技术:Linux Namespace【上】
点点收获: //之前发现Coolshell上好久不更新了, 博主果然去搞大业去了,只恨这几篇文章看到太晚了啊~太厉害了. 1. clone(), unshare(), setns()初识; 主要是š ...
- Docker 之 Docker基础操作
第1章 Docker基础操作 1.1 常用的命令 0) 安装Docker 环境 yum -y install docker 1) 指定 IP,DNS 网络位启动Docker容器 a) docke ...
- docker基础 (狂神说)
Docker 学习笔记 Docker 概述 1.docker为什么会出现 一款产品:开发-上线 两套开发环境! 应用环境,应用配置! 开发-运维.问题:我在我的电脑上可以允许!版本更新,导致服务不可用 ...
最新文章
- 记住这35个英文单词,你就可以在RPA界混了!
- arcgis下的python编程-面向ArcGIS的Python脚本编程
- 最新Win7 +Python3.6.0(Anaconda3-4.3.21)+Tensorflow的安装与配置(不用切换python3.5) 原创 2017年09月23日 15:14:58 标签:pyt
- 2018.7.11 昨天晚上的列表(字典)嵌套题
- 3d游戏编程大师技巧 源代码_C/C++编程新手入门基础系列:俄罗斯方块小游戏制作源代码...
- Python 实用技巧
- 游戏必备组件有哪些_微信广告将升级小程序、小游戏开发者收入方案
- 魔兽世界拍卖行稳定服务器,魔兽世界TBC:大量玩家拍卖行卡到抓狂,分析其中可能的原因...
- Oracle 多行显示在一行详解(listagg)
- CVPR 2022 NTIRE 高动态范围成像(HDR)比赛冠军方案
- CSV文件使用Excel打开
- dhcp服务器 无线桥接,老款TP-Link TL-WR841N路由器无线桥接设置方法
- STM32RBT6+RC522读取CPU卡demo
- TorchScript的TracedModule和ScriptModule的区别
- Xftp7免费版(个人)下载链接
- 2021-2027中国服务器机箱市场现状研究分析与发展前景预测报告
- Ubuntu 安装Trac
- ola.hallengren的SQL Server维护脚本
- houdini 解决opengl 3.3 远程桌面错误
- Python那么火,到底能用来做什么?我们来说说Python3的主要应用
热门文章
- Python变量使用前必须先声明,并且一旦声明就不能在当前作用域内改变其类型————(错)
- 输入有序数组返回下标
- IAR6.1的工程迁移到IAR6.5不能用的解决方法
- 【展开讲讲?xmind日常小知识】xmind2020插入表格
- ImportBeanDefinitionRegistrar向容器中注册bean
- 高并发核心Selector详解
- 【译】Attacks against machine learning — an overview
- Part 1 — Introduction to Smart (legal?) Contracts
- Tensorflow中GRU和LSTM的权重初始化
- 研究Xposed相关二:如何root android模拟器(android4.3.1)