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]#
Docker基础-Docker数据管理的更多相关文章
- [Docker基础]Docker安装教程
Install Docker Docker支持几乎所有的Linux发行版,也支持Mac和Windows. 各操作系统的安装方法可参考Docker官网. 安装环境 ubuntu 16.04 Docker ...
- docker 基础之数据管理
数据卷 一.将本地默认目录挂载到docker容器内指定的目录 #将本地的目录挂在到docker容器内 docker run -it --name container-test -h CONTAINER ...
- Docker 基础 - Docker 与前端(二)
一.Docker 系统架构 守护进程 负责容器的创建.运行和监控,还负责镜像的构建和存储.docker demon 命令可启动 Docker 守护进程. Docker 客户端 通过http与 dock ...
- Linux - docker基础
目录 Linux - docker基础 docker的概念 docker安装流程 docker基本命令学习 docker 的 hello docker 运行一个ubuntu容器 Docker与Cent ...
- Docker入门篇(一)之docker基础
1.Docker 架构 http://blog.csdn.net/u012562943/article/category/6048991/1Docker 使用客户端-服务器 (C/S) 架构模式,使用 ...
- Docker - Docker基础命令及使用
Docker Docker - 官网 Docker - Hub GitHub - Docker Docker中文社区 Docker基础命令 Docker 查看帮助信息:docker --help 查看 ...
- 【云计算】Docker云平台—Docker基础
Docker云平台系列共三讲,此为第一讲:Docker基础 参考资料: Docker官方文档:https://docs.docker.com/ Docker从入门到实践:https://yeasy.g ...
- Docker基础技术:Linux Namespace(下)
在 Docker基础技术:Linux Namespace(上篇)中我们了解了,UTD.IPC.PID.Mount 四个namespace,我们模仿Docker做了一个相当相当山寨的镜像.在这一篇中,主 ...
- Docker基础技术:Linux Namespace(上)
时下最热的技术莫过于Docker了,很多人都觉得Docker是个新技术,其实不然,Docker除了其编程语言用go比较新外,其实它还真不是个新东西,也就是个新瓶装旧酒的东西,所谓的The New “O ...
随机推荐
- Java学习--基本数据类型的定义和运算2
例1 public class OperateDemo01{ public static void main(String args[]){ int num = 22 ; System.out.pri ...
- Python自动化开发 - Python操作MySQL
本篇对于Python操作MySQL主要使用两种方式: 原生模块 pymsql ORM框架 SQLAchemy 一.pymysql pymsql是Python中操作MySQL的模块,其使用方法和mysq ...
- 10.scrapy入门
Scrapy 框架 Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,用途非常广泛. 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页 ...
- Elasticsearch 系列2 --- 安装elasticsearch-head管理工具
elasticsearch-head是elasticsearch的一个管理页面,它的官网是https://github.com/mobz/elasticsearch-head 通过官网我们得知,ES5 ...
- 一步一步学习Swift之(三):巧用AutoLayout布局
一些初学者经常在使用autoLayout时,做得效果不太理想,经常会出现界面错乱的情况. 本文章用一个小实例说明autoLayout的使用 非常的简单,只要记住 规则就可以使界面适屏布局,适配各种ip ...
- 背水一战 Windows 10 (47) - 控件(ScrollViewer 特性): Chaining, Rail, Inertia, Snap, Zoom
[源码下载] 背水一战 Windows 10 (47) - 控件(ScrollViewer 特性): Chaining, Rail, Inertia, Snap, Zoom 作者:webabcd 介绍 ...
- C# Enum枚举类型操作扩展类
使用示例: using System.ComponentModel; namespace SchoolEnterpriseManageSys.Enum { /// <summary> // ...
- java变量初始化顺序
第一次实例化一个类时,初始化优先顺序为: 1.父类中的静态成员变量和静态代码块初始化 2.本类中的静态成员变量和静态代码块初始化 3.父类中的实例成员初始化 4.父类中的构造方法 5.本类中的实例成员 ...
- [Visual Studio] 记一次排错:打不开 Nuget 包管理器里的安装package页面,无法 安装 / 恢复 包
出差一阵子PC很久没用了, 回来在用Visual Studio (2017) 的时候, 工程里无法安装Package了 >_< --- 也不知道电脑做了什么?--- Nuget包管 ...
- ajax post 请求发送 json 字符串
$.ajax({ // 请求方式 type:"post", // contentType contentType:"application/json", // ...