要解决的问题:在移除了现有容器或者添加了新容器时,之前容器的数据无法访问。

为避免上述问题,Docker提供了以下策略来持久化数据

1.tmpfs挂载

2.绑定挂载

将Docker宿主机上的文件/目录挂载到容器中(就是说将host文件系统中的数据借给容器用)。注意:数据流在Docker宿主机和容器之间是双向流动的,任何破坏性的操作(比如删除一个目录)也都会对宿主机产生负面影响

host源(又称mount源)----------container目标(又称mount point)

目录:如果container目录已存在,则源数据会被隐藏并被替换为host源中的数据

文件:向容器中添加文件,同时也保留了容器原有的数据

# 将宿主机的主目录挂载到容器中一个名为host-name的目录
[root@localhost chrome]# docker run -it --name mount-test -v $HOME:/host-name ubuntu bash
root@e7b70f5681cf:/# ll
total
drwxr-xr-x. root root Sep : ./
drwxr-xr-x. root root Sep : ../
-rwxr-xr-x. root root Sep : .dockerenv*
drwxr-xr-x. root root Sep : bin/
drwxr-xr-x. root root Apr boot/
drwxr-xr-x. root root Sep : dev/
drwxr-xr-x. root root Sep : etc/
drwxr-xr-x. root root Apr home/
dr-xr-x---. root root Sep : host-name/
drwxr-xr-x. root root May lib/
drwxr-xr-x. root root Sep : lib64/
drwxr-xr-x. root root Sep : media/
drwxr-xr-x. root root Sep : mnt/
drwxr-xr-x. root root Sep : opt/
dr-xr-xr-x. root root Sep : proc/
drwx------. root root Sep : root/
drwxr-xr-x. root root Sep : run/
drwxr-xr-x. root root Sep : sbin/
drwxr-xr-x. root root Sep : srv/
dr-xr-xr-x. root root Sep : sys/
drwxrwxrwt. root root Sep : tmp/
drwxr-xr-x. root root Sep : usr/
drwxr-xr-x. root root Sep : var/
root@e7b70f5681cf:/# pwd
/
root@e7b70f5681cf:/# cd host-name/
root@e7b70f5681cf:/host-name# touch a.txt # 进入容器内再host-name目录下创建文件a.txt
root@e7b70f5681cf:/host-name# ll
total
dr-xr-x---. root root Sep : ./
drwxr-xr-x. root root Sep : ../
-rw-------. root root Sep : .bash_history
-rw-r--r--. root root Dec .bash_logout
-rw-r--r--. root root Dec .bash_profile
-rw-r--r--. root root Dec .bashrc
drwx------. root root Sep : .cache/
drwxr-xr-x. root root Sep : .config/
-rw-r--r--. root root Dec .cshrc
drwx------. root root Sep : .dbus/
drwx------. root root Sep : .docker/
-rw-------. root root Sep : .esd_auth
drwx------. root root Sep : .gnupg/
drwxr-xr-x. root root Sep : .gstreamer-0.10/
-rw-r--r--. root root Mar .gtkrc-2.0-kde4
drwxr-xr-x. root root Sep : .kde/
drwxr-xr-x. root root Sep : .local/
drwxr-----. root root Sep : .pki/
-rw-r--r--. root root Dec .tcshrc
-rw-------. root root Sep : .viminfo
drwxr-xr-x. root root Sep : Desktop/
drwxr-xr-x. root root Sep : Documents/
drwxr-xr-x. root root Sep : Downloads/
drwxr-xr-x. root root Sep : Music/
drwxr-xr-x. root root Sep : Pictures/
drwxr-xr-x. root root Sep : Public/
drwxr-xr-x. root root Sep : Templates/
drwxr-xr-x. root root Sep : Videos/
-rw-r--r--. root root Sep : a.txt
-rw-------. root root Sep : anaconda-ks.cfg
-rw-r--r--. root root Sep : ch.exe.part
-rw-r--r--. root root Sep : initial-setup-ks.cfg # 再Docker宿主机打开一个新的终端窗口并输入以下命令,可发现宿主机上存在a.txt
[root@localhost chrome]# cd ~
[root@localhost ~]# ll
total
-rw-------. root root Sep : anaconda-ks.cfg
-rw-r--r--. root root Sep : a.txt
-rw-r--r--. root root Sep : ch.exe.part
drwxr-xr-x. root root Sep : Desktop
drwxr-xr-x. root root Sep : Documents
drwxr-xr-x. root root Sep : Downloads
-rw-r--r--. root root Sep : initial-setup-ks.cfg
drwxr-xr-x. root root Sep : Music
drwxr-xr-x. root root Sep : Pictures
drwxr-xr-x. root root Sep : Public
drwxr-xr-x. root root Sep : Templates
drwxr-xr-x. root root Sep : Videos
# 再Docker宿主机中终端输入以下命令,以停止这个容器
[root@localhost ~]# docker stop mount-test
mount-test
[root@localhost ~]# docker rm mount-test
mount-test # 确认Docker宿主机上a.txt文件依旧存在 [root@localhost ~]# cd ~
[root@localhost ~]# ll
total
-rw-------. root root Sep : anaconda-ks.cfg
-rw-r--r--. root root Sep : a.txt
-rw-r--r--. root root Sep : ch.exe.part
drwxr-xr-x. root root Sep : Desktop
drwxr-xr-x. root root Sep : Documents
drwxr-xr-x. root root Sep : Downloads
-rw-r--r--. root root Sep : initial-setup-ks.cfg
drwxr-xr-x. root root Sep : Music
drwxr-xr-x. root root Sep : Pictures
drwxr-xr-x. root root Sep : Public
drwxr-xr-x. root root Sep : Templates
drwxr-xr-x. root root Sep : Videos

3.卷

Docker卷是目前最为推荐的将容器中存储的数据持久化的方法,卷完全是由docker托管的。

与绑定挂载不同的是在容器中写入的文件,在移除容器后,再次启动具有附加卷的新容器时,容器中的文件依然存在,但是不会显示写进任何Docker宿主机目录

[root@localhost ~]# docker volume create --name=nginx-volume
nginx-volume
[root@localhost ~]# docker volume inspect nginx-volume
[
{
"CreatedAt": "2019-09-22T04:58:44-04:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/nginx-volume/_data",
"Name": "nginx-volume",
"Options": {},
"Scope": "local"
}
]
[root@localhost ~]# docker volume ls
DRIVER VOLUME NAME
local nginx-volume

Docker中的VOLUME命令

VOLUME指令会将附加在该指令之后的路径标记为外部的由Docker托管的数据存储卷。语法如下:

VOLUME ["/data-volume"]

Docker卷的更多相关文章

  1. Docker - 卷组管理(三)

    一.不指定宿主机目录 首先运行一个nginx容器 docker run -d --name mynginx -p 8080:80 -v /usr/share/nginx/html nginx --na ...

  2. docker卷管理(四)

    什么是数据卷 overlay2存储卷 docker镜像是由多个只读层叠加而成,启动容器时,docker会加载只读镜像层,并在镜像栈顶部添加一个可写层 如果运行中的容器修改了现有的一个已存在文件,那该文 ...

  3. docker卷挂载与容器内外互相拷贝数据

    一.宿主机与容器的挂载 docker可以支持把一个宿主机上的目录挂载到镜像里.命令如下: docker run -it -v /mydownload:/download nginx:v1 /bin/b ...

  4. Docker 容器数据卷(Data Volume)与数据管理

    卷(Volume)是容器中的一个数据挂载点,卷可以绕过联合文件系统,从而为Docker 提供持久数据,所提供的数据还可以在宿主机-容器或多个容器之间共享.通过卷,我们可以可以使修改数据直接生效,而不必 ...

  5. docker数据卷技术

    数据卷技术 数据卷手动挂载 数据卷容器 part1:数据卷挂载方式 数据卷手动挂载 -v 主机目录:容器目录 #核心参数 #示例 docker run -it --name=centos_test - ...

  6. Docker生产环境实践指南

    技术栈:1. 构建系统2. 镜像仓库3. 宿主机管理4. 配置管理5. 部署6. 编排7. 日志8. 监控 镜像:1. 如果用户像往常一样运行包安装命令,这些永远也用不上的缓存包文件将会永远地成为镜像 ...

  7. Docker 1.13 管理命令

    1.12 CLI 的问题 Docker1.12 命令行接口(CLI)有40多个顶级命令,这些命令存在以下问题: 没有归类组织,这让docker 新手很难学习: 有些命令没有提供足够的上下文环境,以至于 ...

  8. Docker存储驱动之Device Mapper简介

    Device Mapper是一个基于kernel的框架,它增强了很多Linux上的高级卷管理技术.Docker的devicemapper驱动在镜像和容器管理上,利用了该框架的超配和快照功能.为了区别, ...

  9. 从零开始学习 Docker

      这篇文章是我学习 Docker 的记录,大部分内容摘抄自 <<Docker - 从入门到实践>> 一书,并非本人原创.学习过程中整理成适合我自己的笔记,其中也包含了我自己的 ...

随机推荐

  1. springboot之全局处理异常封装

    springboot之全局处理异常封装 简介 在项目中经常出现系统异常的情况,比如NullPointerException等等.如果默认未处理的情况下,springboot会响应默认的错误提示,这样对 ...

  2. 自动更新Aria2中的bt-trackers选项

    #!/bin/bash /usr/sbin/service aria2 stop list=`wget -qO- https://raw.githubusercontent.com/ngosang/t ...

  3. Jmeter 接口自动化-脚本数据分离实例

    一. 背景:  为了让大家更加的了解Jmeter,并且使用起来游刃有余.这篇我们主要讲一下,如何优雅的使用Jmeter一步步的实现接口自动化,完成脚本与数据分离,把可能对Jmeter脚本的维护转移到c ...

  4. Salesforce学习之路-developer篇(二)利用Jenkins和Bitbucket实现Salesforce的CI/CD功能

    上文提到,基于CRM的二次开发是必不可少的,但是在实际项目中CI/CD是不可忽略的一个重要部分,与传统的Java,Python项目不同,如果对Salesforce进行持续集成和持续部署呢? 结合找到的 ...

  5. JavaScript之深入函数(一)

    在任何编程语言中,函数的功能都是十分强大的,JavaScript也不例外.之前已经讲解了函数的一些基本知识,诸如函数定义,函数执行和函数返回值等,今天就带大家深入了解JavaScript中函数的原理及 ...

  6. 数据结构之二叉树篇卷三 -- 二叉树非递归遍历(With Java)

    Nonrecursive Traversal of Binary Tree First I wanna talk about why we should <code>Stack</c ...

  7. Spring boot 梳理 - 配置eclipse集成maven,并开发Spring boot hello

    @RestController @EnableAutoConfiguration public class App { @RequestMapping("/hello") publ ...

  8. C#刷遍Leetcode面试题系列连载(1) - 入门与工具简介

    目录 为什么要刷LeetCode 刷LeetCode有哪些好处? LeetCode vs 传统的 OJ LeetCode刷题时的心态建设 C#如何刷遍LeetCode 选项1: VS本地Debug + ...

  9. SpringBoot 定时任务实现方式

    定时任务实现的几种方式: Timer:是java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务.使用这种方式可以让你的程序按照某一个频度执行,但 ...

  10. thymeleaf 遍历使用案例

    1.语法: th:each属性用于迭代循环,语法:th:each="obj,iterStat:${objList}" 迭代对象可以是List,Map,数组等; 2.说明:iterS ...