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

为避免上述问题,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. Android MediaPlayer 播放音频

    本文链接: Android MediaPlayer 播放音频 主要介绍使用MediaPlayer播放音频的方式.关于MediaPlayer的基础知识,比如状态,可以参考Android MediaPla ...

  2. 使用Consul做leader选举的方案

    在分布式集群部署模式下,为了维护数据一致性,通常需要选举出一个leader来进行协调,并且在leader挂掉后能从集群中选举出一个新的leader.选举leader的方案有很多种,对Paxos和Raf ...

  3. SpringBoot的注解注入功能移植到.Net平台(开源)

    *:first-child { margin-top: 0 !important; } .markdown-body>*:last-child { margin-bottom: 0 !impor ...

  4. git远程仓库常用命令

    1.     git  add .               将工作区的文件推到暂存区: 2.    git commit -m " 备注信息"         将暂存区内容提交 ...

  5. 3D 飞行器航迹规划

    3D-Route-Planning 三维航迹规划 -Matlab 本次代码主要解决数学建模中多约束条件下的航迹规划问题 解决的问题如下:   复杂环境下航迹快速规划是智能飞行器控制的一个重要课题.由于 ...

  6. 使用file_get_contents() 发送GET、POST请求

    服务器端执行HTTP请求,大家经常使用的就是CURL,curl工具的确是很好的数据文件传输工具,那么除此之外还有其他的工具能实现这个功能吗? 现在为你介绍一个很常见的工具 file_get_conte ...

  7. 学习VBA

    学习VBA VBA 就是 (Visual basic for Application) 用的比较多的是在Excel中处理数据,可以方便快捷地使用编程方式来对数据进行操作. VBA 数据类型 Integ ...

  8. 记一次arch滚挂后,更换lts内核

    背景 因为arch的滚动升级模式,每天pacman -Syu已经是一种习惯了(虽然我是使用yay的),升级过程中会连内核一起升级,但不会立刻生效,通常要等到下次重启时才会生效. 因为此前使用的是有一点 ...

  9. Java 学习笔记之 Sleep停止线程

    Sleep停止线程: 在Sleep状态下被interrupt,interrupted 状态会被擦除,返回false. 线程在Sleep状态下被interrupt: public class Sleep ...

  10. 两台CentOS6.5 在不同机器上互联

    准备工作 1.安装vmware及虚拟机centos6.5: 2.将安装好的centos6.5复制一份,在另一台机器上拷贝. 要进行不同机器上虚拟机的互相通信,需要用桥接模式进行互联.如下图,对vmwa ...