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数据管理相关推荐

  1. docker基础——Docker是什么

    Docker概念简介 Docker 是一个开源的应用容器引擎,基于  Go 语言  并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中, ...

  2. docker 基础之数据管理

    数据卷 一.将本地默认目录挂载到docker容器内指定的目录 #将本地的目录挂在到docker容器内 docker run -it --name container-test -h CONTAINER ...

  3. Docker之docker基础

    Docker之docker基础 docker架构 docker镜像与镜像仓库 为什么镜像仓库名字是Registry而不是repository?在docker中仓库的名字是以应用的名称取名的. 镜像是静 ...

  4. Docker之旅(1)-Docker基础

    一.Docker 简介 1.1 Docker 概念 Docker 于 2013 年开源,其基于 go 语言开发,是一个开源的 PaaS 服务(Platform as a Service,平台即服务的缩 ...

  5. Docker基础讲解狂神笔记:容器数据卷,docker compose,docker swarm(2/2)未修订版欢迎留言补漏

    L06 容器数据卷 相对于01-05难度加大 什么是容器数据卷 Docker理念:将应用和环境打包成一个镜像! 程序要保存数据,数据并不能放在容器里面,因为一旦数据放在容器,误操作删除掉容器,数据也随 ...

  6. Docker学习(2)——图文并茂讲解Docker基础命令

    一.Docker基础命令总结 命令 功能 docker load -i ubuntu.tar 导入镜像 docker run -it --name vm1 ubuntu 创建容器(以ubuntu镜像为 ...

  7. Docker基础技术:Linux Namespace【上】

    点点收获: //之前发现Coolshell上好久不更新了, 博主果然去搞大业去了,只恨这几篇文章看到太晚了啊~太厉害了. 1.  clone(), unshare(), setns()初识; 主要是š ...

  8. Docker 之 Docker基础操作

    第1章 Docker基础操作 1.1 常用的命令 0) 安装Docker 环境 yum -y install docker 1)   指定 IP,DNS 网络位启动Docker容器 a)  docke ...

  9. docker基础 (狂神说)

    Docker 学习笔记 Docker 概述 1.docker为什么会出现 一款产品:开发-上线 两套开发环境! 应用环境,应用配置! 开发-运维.问题:我在我的电脑上可以允许!版本更新,导致服务不可用 ...

最新文章

  1. 记住这35个英文单词,你就可以在RPA界混了!
  2. arcgis下的python编程-面向ArcGIS的Python脚本编程
  3. 最新Win7 +Python3.6.0(Anaconda3-4.3.21)+Tensorflow的安装与配置(不用切换python3.5) 原创 2017年09月23日 15:14:58 标签:pyt
  4. 2018.7.11 昨天晚上的列表(字典)嵌套题
  5. 3d游戏编程大师技巧 源代码_C/C++编程新手入门基础系列:俄罗斯方块小游戏制作源代码...
  6. Python 实用技巧
  7. 游戏必备组件有哪些_微信广告将升级小程序、小游戏开发者收入方案
  8. 魔兽世界拍卖行稳定服务器,魔兽世界TBC:大量玩家拍卖行卡到抓狂,分析其中可能的原因...
  9. Oracle 多行显示在一行详解(listagg)
  10. CVPR 2022 NTIRE 高动态范围成像(HDR)比赛冠军方案
  11. CSV文件使用Excel打开
  12. dhcp服务器 无线桥接,老款TP-Link TL-WR841N路由器无线桥接设置方法
  13. STM32RBT6+RC522读取CPU卡demo
  14. TorchScript的TracedModule和ScriptModule的区别
  15. Xftp7免费版(个人)下载链接
  16. 2021-2027中国服务器机箱市场现状研究分析与发展前景预测报告
  17. Ubuntu 安装Trac
  18. ola.hallengren的SQL Server维护脚本
  19. houdini 解决opengl 3.3 远程桌面错误
  20. Python那么火,到底能用来做什么?我们来说说Python3的主要应用

热门文章

  1. Python变量使用前必须先声明,并且一旦声明就不能在当前作用域内改变其类型————(错)
  2. 输入有序数组返回下标
  3. IAR6.1的工程迁移到IAR6.5不能用的解决方法
  4. 【展开讲讲?xmind日常小知识】xmind2020插入表格
  5. ImportBeanDefinitionRegistrar向容器中注册bean
  6. 高并发核心Selector详解
  7. 【译】Attacks against machine learning — an overview
  8. Part 1 — Introduction to Smart (legal?) Contracts
  9. Tensorflow中GRU和LSTM的权重初始化
  10. 研究Xposed相关二:如何root android模拟器(android4.3.1)