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

为避免上述问题,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. 前端之JavaScript篇

    一. 简介 javascript是一门动态弱类型的解释性编程语言, 增强页面动画效果,实现页面与用户之间实时动态的交互.  JavaScript有三部分组成: ECMAscript, DOM, BOM ...

  2. Failed to access IIS metabase.

    framework4.0 可这样 C:\Inetpub\AdminScripts>cd C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\ C:\WIN ...

  3. Unity子弹生成系统

    子弹系统和粒子系统比较类似,为了创建和五花八门的子弹,例如追踪,连续继承,散弹等,需要一个拥有众多参数的子弹生成器,这里叫它Shooter好了. Shooter负责把玩各类子弹造型和参数,创建出子弹, ...

  4. Android远程服务AIDL开发过程中容易遇见的两个问题

    问题 一 JavaBinder: Uncaught remote exception! (Exceptions are not yet supported across processes.) jav ...

  5. 用Python构造ARP请求、扫描、欺骗

    目录 0. ARP介绍 1. Scapy简述 2. Scapy简单演示 2.1 安装 2.2 构造包演示 2.2.1 进入kamene交互界面 2.2.2 查看以太网头部 2.2.3 查看 ICMP ...

  6. Eureka参数配置->Client端参数

     1.基本参数配置列表: 参数 默认值 说明 eureka.client.availability-zones    告知client有哪些region及availability-zones,支持配置 ...

  7. springboot值mybatis 别名等配置

    在application配置文件中添加如下: mybatis: #该配置替换在sql-config-map中的typeAliases配置 type-aliases-package: com.ww.ww ...

  8. freemarker模版引擎技术总结

    FreeMarker语言概述 FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写. FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式 ...

  9. 深入集合类系列——HashMap和HashTable的区别

    含义:HashMap是基于哈希表的Map接口的非同步实现.允许使用null值和null键.此类不保证映射的顺序,特别是它不保证该顺序恒久不变. 数据结构:HashMap实际上是一个“链表散列”的数据结 ...

  10. 详解Java多线程锁之synchronized

    synchronized是Java中解决并发问题的一种最常用的方法,也是最简单的一种方法. synchronized的四种使用方式 修饰代码块:被修饰的代码块称为同步语句块,其作用的范围是大括号{}括 ...