一 简介

docker提供数据卷来实现数据共享与持久化,而数据卷的挂载有两种方式:

  • 挂载主机目录(Bind mounts)
  • 数据卷容器(Data Volumes)

数据卷是一个可供容器使用的特殊目录,它绕过文件系统,可以提供很多有用的特性:

  • 数据卷可以在容器之间共享和重用
  • 数据卷是目录或者文件,而非没有格式化的磁盘(块设备)
  • 对数据卷的修改会立马生效
  • 对数据卷的更新不会影响镜像
  • 卷会一直存在,只到没有容器使用

挂载主机目录

删除所有容器

[root@docker-server1 ~]# docker ps -aq|xargs docker rm -f

创建一个数据卷

[root@docker-server1 ~]# docker run -d -P --name web -v /webapp docker.io/centos:6 /bin/bash

Unable to find image 'centos:6' locally
: Pulling from library/centos
ff50d722b382: Pull complete
Digest: sha256:dec8f471302de43f4cfcf82f56d99a5227b5ea1aa6d02fa56344986e1f4610e7
Status: Downloaded newer image for centos:
a306908b2740202fa19d25b3b99a62981960b728f66992d099cb130694e6e207

选项说明:

-d:将容器放入后台运行
-P:将容器中的端口暴露到宿主机的一个随机端口
-v:创建一个数据卷,这个数据卷会自动映射到宿主机的某个目录,一般在/var/lib/docker/vfs下

挂载一个宿主机目录作为数据卷
[root@docker-server1 ~]# docker run -d -P --name web1 -v /data:/webapp docker.io/centos:6 /bin/bash

#将宿主机的/data目录挂载至容器的/webapp目录

4ee7b1a64be5eefb339ff73f25de3420c57f4d08dfdd611fd347e95c4ad4c278                               

二  数据卷容器

2.1 创建一个数据卷容器

[root@docker-server1 ~]# docker run -it -v /dbdata --name dbdata docker.io/centos:6

#创建一个数据卷容器dbdata,并创建一个数据卷挂载至/dbdata

其他容器可以通过--volumes-from来挂载dbdata容器中的数据卷:

[root@docker-server1 ~]# docker run -it --volumes-from dbdata --name db1 centos:6

[root@docker-server1 ~]# docker run -it --volumes-from dbdata --name db2 centos:6

容器db1和db2都挂载同一个数据卷到/dbdata目录,三个容器任何一方在该目录的写入,其他容器都能看到

--volumes-from参数可以多次使用,从多个容器挂载多个数据卷

如果删除了挂载的容器,数据卷并不会被自动删除,如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时显示的使用docker rm -v 命令来指定同时删除关联的容器。

利用数据卷容器迁移数据

2.2 备份数据

#先创建一个容器worker,并使用--volumes-from将dbdata挂载到worker容器,然后使用-v参数将容器的/backup目录映射到宿主机的backup目录。然后在容器中执行备份操作,这样就把数据备份到宿主机的/backup目录中了

[root@docker-server1 ~]# docker run -it --volumes-from dbdata -v /backup:/backup --name worker centos:6

[root@e0ed338e565a /]# tar zcf /backup/backup.tar.gz /dbdata

[root@e0ed338e565a /]# exit

[root@docker-server1 ~]# ll /backup/backup.tar.gz

-rw-r--r--  root root  Nov   : /backup/backup.tar.gz

2.3 还原数据

#创建一个新容器,并用-v参数挂载本地的备份目录,然后执行解压操作,将备份文件解压至/dbdata目录

[root@docker-server1 ~]# docker run -it -v /dbdata --name dbdata2 centos:6 /bin/bash

[root@9cd7c00cbfd7 /]# exit

#创建一个容器dbdata2

[root@docker-server1 ~]# docker run -it --volumes-from dbdata2 -v /backup:/backup centos:6 tar xf /backup/backup.tar.gz

2.4 删除数据盘

查看主机上现有的数据盘

[root@docker-server1 ~]# docker volume ls

DRIVER              VOLUME NAME
local 8a55cbee9e17257a1075821453f93f3e607f6332f4225fe4419000ec1173bc9b
local 011c8b324617c79971e5bb907e821f9e240a6c5b350c1e2556724fc5fc539383
local c187ebc912eca05f6ea6bd2d212c7d0fccb2fc8d8f737f0e909c96a8ea7ca66d
默认情况下,在删除容器时,docker并不会删除其数据盘,查看没有容器在使用的数据盘方法如下:
docker volume ls -f dangling=true
如果想要删除没有使用的数据盘,使用如下指令:
docker volume rm VOLUME_NAME
删除掉容器时,同时删掉数据盘,则使用:
docker rm -v container_name

三 挂载主机目录

把本地的一个目录挂载到容器,修该本地的目录就可以达到修改容器的目的

3.1 创建一个挂载的容器

[root@docker-server1 ~]# docker run -d -p 80:80 -v /data:/usr/local/apache2/htdocs httpd:2.4

Unable to find image 'httpd:2.4' locally
2.4: Pulling from library/httpd
8d691f585fa8: Already exists
8eb779d8bd44: Pull complete
574add29ec5c: Pull complete
30d7fa9ec230: Pull complete
ede292f2b031: Pull complete
Digest: sha256:35fcab73dc9ae55db5c4ac33f5e0c7e76b7735aaddb628366bab04db6f8ae96e
Status: Downloaded newer image for httpd:2.4
a69423b85fb5fd7dbe25e14fa54767b9761259404721a781d7fa393827981e46

[root@docker-server1 ~]# docker ps -a

\CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS                NAMES
a69423b85fb5 httpd:2.4 "httpd-foreground" seconds ago Up seconds 0.0.0.0:->/tcp goofy_kowalevski

访问192.168.132.131:80

3.2 在物理机写入数据

[root@docker-server1 ~]# echo "Hello Docker"  >>   /data/index.html
Hello Docker /data/index.html

[root@docker-server1 data]# echo "This is teat"  >> /data/test.html

3.3 查看

进入容器

[root@docker-server1 data]# docker exec -it a69423b85fb5 /bin/bash
root@a69423b85fb5:/usr/local/apache2# cd /usr/local/apache2/htdocs/
root@a69423b85fb5:/usr/local/apache2/htdocs# ls -l
total
-rw-r--r-- root root Nov : index.html
-rw-r--r-- root root Nov : test.html
root@a69423b85fb5:/usr/local/apache2/htdocs# cat index.html
Hello Docker
root@a69423b85fb5:/usr/local/apache2/htdocs# exit
exit

3.5 删除容器测试

[root@docker-server1 data]# docker rm -f a69423b85fb5

[root@docker-server1 data]# docker run -d -p 80:80 -v /data:/usr/local/apache2/htdocs httpd:2.4

3b821b608a83f0dffb44ac8f53422806775258cbf5451502ed28b66d210680f9

进入容器查看

[root@docker-server1 data]# docker exec -it 3b821 /bin/bash
root@3b821b608a83:/usr/local/apache2# cd /usr/local/apache2/htdocs/
root@3b821b608a83:/usr/local/apache2/htdocs# ls -l
total
-rw-r--r-- root root Nov : index.html
-rw-r--r-- root root Nov : test.html
root@3b821b608a83:/usr/local/apache2/htdocs# cat index.html
Hello Docker
root@3b821b608a83:/usr/local/apache2/htdocs# exit
exit

访问测试

测试再次创建的容器数据还在

docker挂载数据卷的默认为权限为读写(rw),用户也可以通过ro指定为只读:

[root@docker-server1 data]# docker run -d -p 81:80 -v /data:/usr/local/apache2/htdocs:ro  httpd:2.4

354fe8e46850d21b1f986c6f9ad39f5dc012bf47127e1ce627736cd0759c3505

也可以访问

进入容器

[root@docker-server1 data]# docker ps -a

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                           PORTS                NAMES
354fe8e46850 httpd:2.4 "httpd-foreground" minutes ago Up minutes 0.0.0.0:->/tcp zealous_boyd

[root@docker-server1 data]# docker exec -it 354fe8e46850 /bin/bash

root@354fe8e46850:/usr/local/apache2# cd htdocs/
root@354fe8e46850:/usr/local/apache2/htdocs# touch test-.html #不可写
touch: cannot touch 'test-1.html': Read-only file system

博主声明:本文的内容来源主要来自誉天教育晏威老师,由本人实验完成操作验证,需要的博友请联系誉天教育(http://www.yutianedu.com/),获得官方同意或者晏老师(https://www.cnblogs.com/breezey/)本人同意即可转载,谢谢!

DOCKER学习_003:Docker的存储的更多相关文章

  1. Docker学习笔记 — Docker私有仓库搭建

    Docker学习笔记 — Docker私有仓库搭建   目录(?)[-] 环境准备 搭建私有仓库 测试 管理仓库中的镜像 查询 删除 Registry V2   和Mavan的管理一样,Dockers ...

  2. Docker学习之Docker容器基本使用

    Docker学习之Docker容器基本使用 新建容器并启动 命令格式:docker run --options repository:tag 后台运行 命令格式:-d 已存在的容器相关操作 启动:do ...

  3. Docker学习之Docker镜像基本使用

    Docker学习之Docker镜像基本使用 获取镜像 命令格式:docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签] 例如: docker pull ...

  4. DOCKER学习_014:Docker存储补充

    在前面已经学习了Docker的存储,https://www.cnblogs.com/zyxnhr/p/11830238.html,现在对前面的内容的一个补充,具体请参考https://www.cnbl ...

  5. Docker学习笔记 - Docker的守护进程

    学习目标:  查看Docker守护进程的运行状态 启动.停止.重启Docker守护进程 Docker守护进程的启动选项 修改和查看Docker守护进程的启动选项 1.# 查看docker运行状态  方 ...

  6. Docker学习笔记 — Docker私有仓库搭建【转载】

    标签: Docker 2015-03-10 21:08 24190人阅读 评论(0) 收藏 举报  分类: Docker(26)    目录(?)[+]   和Mavan的管理一样,Dockers不仅 ...

  7. Docker学习笔记 - Docker容器内部署redis

    Docker学习笔记(2-4)Docker应用实验-redist server 和client的安装使用 一.获取redis容器(含客户端和服务端) 二.创建服务端容器 1.在终端A中运行redis- ...

  8. Docker学习笔记 - Docker客户端和服务端

    学习内容: Docker客户端和服务端的通讯方式:client和自定义程序 Docker客户端和服务端的连接方式:socket 演示Docker客户端和服务端之间用remote-api通讯:nc   ...

  9. Docker 学习2 Docker基础用法

    一.docker架构 1.client端 2.server端,docker daemo守护进程,监听在套接字之上.docker支持三种类型套接字. a.ip vs套接字:即IP + 端口套接字 b.i ...

随机推荐

  1. 2018-3-22-win10-uwp-设置-HttpClient-浏览器标识

    title author date CreateTime categories win10 uwp 设置 HttpClient 浏览器标识 lindexi 2018-3-22 9:1:55 +0800 ...

  2. 4.2.1 Data Flow-File Write-基本过程

  3. @codeforces - 414E@ Mashmokh's Designed Problem

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一棵 n 个点的树,每个点的儿子是有序的. 现给定 m 次操 ...

  4. HZOJ 通讯

    B. 通讯 题目描述 “这一切都是命运石之门的选择.” 试图研制时间机器的机关SERN截获了中二科学家伦太郎发往过去的一条短 信,并由此得知了伦太郎制作出了电话微波炉(仮). 为了掌握时间机器的技术, ...

  5. Shell echo 命令

    Shell 的echo 指令与PHP的echo指令类似,都是用于字符串的输出.命令格式: echo string 您可以使用echo实现更复杂的输出格式控制. 1.显示普通字符串: echo &quo ...

  6. uva 12003 Array Transformer (线段树套平衡树)

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

  7. oracle函数 power(x,y)

    [功能]返回x的y次幂 [参数]x,y 数字型表达式 [返回]数字 [示例] select power(2.5,2),power(1.5,0),power(20,-1) from dual; 返回:6 ...

  8. nginx——前端服务环境

    背景:之前一直使用tomcat服务器来作为测试环境:(vue项目打包后想测试下生产环境下有没有问题!使用tomcat有各种问题,还怀疑是我们源码有问题?尴尬)今天公司同事才告诉我tomcat是专门为j ...

  9. Python--day43--mysql唯一索引和外键变种之多对多

    唯一索引:(unique关键字)unique 名字 (num) 外键的变种:

  10. UVA 11107 Life Forms——(多字符串的最长公共子序列,后缀数组+LCP)

    题意: 输入n个序列,求出一个最大长度的字符串,使得它在超过一半的DNA序列中连续出现.如果有多解,按照字典序从小到大输出所有解. 分析:这道题的关键是将多个字符串连接成一个串,方法是用不同的分隔符把 ...