默认情况下,容器会随着用户删除而消失,包括容器里面的数据。如果我们要对容器里面的数据进行长久保存,就不得不引用存储卷的概念。

在容器中管理数据持久化主要有两种方式:
1、数据卷(data volumes)
2、挂载目录(Bind volumes)

数据卷

数据卷是一个可供一个或多个容器使用的共同目录,它提供很多有用的特性:
1、数据卷可以在容器之间共享和重用;
2、对数据卷的修改会立马生效;
3、对数据卷的更新不会影响镜像;
4、数据卷默认会一直存在,即使容器被删除;

注意:数据卷的使用类似于Linux下对目录进行mount,镜像中被指定的挂载点中的文件会被隐藏,显示的是我们挂载的数据卷。

数据卷的常用命令是docker volume命令,常规用法如下:

# docker volume --help
Usage: docker volume COMMAND
Manage volumes
Commands:
create Create a volume
inspect Display detailed information on one or more volumes
ls List volumes
prune Remove all unused local volumes
rm Remove one or more volumes Run 'docker volume COMMAND --help' for more information on a command.

创建数据卷:

docker volume create my_volume

查看数据卷:

# docker volume ls
DRIVER VOLUME NAME
local 7a9cbb48630c66180ba226974aa9307a502ce4c99648be48e1a0cfcbe4573854
local 861cb1d1c824570a426a6b2599357b6d66818cd98a36010857cb7d753312d11d
local my_volume
local mydata
local nginx_volume
local vol_simple
local wpdata

查看数据卷的详细信息:

# docker volume inspect my_volume
[
{
"CreatedAt": "2019-07-28T13:01:27+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/my_volume/_data",
"Name": "my_volume",
"Options": {},
"Scope": "local"
}
]

启动一个容器挂载数据卷,挂载数据卷的方法有两种:
1、用-v或者--volume;

# docker run -it --rm --name my_app -v my_volume:/data/apps busybox

2、用--mount;

# docker run -it --rm --name my_app --mount source=my_volume,target=/data/apps busybox

容器启动后可以查看容器信息,就可以看到具体的挂载信息:

# docker inspect my_app
......
"Mounts": [
{
"Type": "volume",
"Name": "my_volume",
"Source": "/var/lib/docker/volumes/my_volume/_data",
"Destination": "/data/apps",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
}
],
......

删除数据卷:

# docker volume rm my_volume

数据卷是用来持久化容器数据的,它独立于容器的生命周期,如果需要删除容器的同时也移除数据卷,可以使用docker rm -v命令。

如果要清理一些无主的数据卷,可以使用下面命令:

# docker volume prune

挂载目录

挂载主机目录和挂载数据卷的方式一样,只是在指定需要挂载的目录是一个全路径目录,比如:

# docker run -it --rm --name my_app -v /tmp/my_app:/data/apps busybox
# docker run -it --rm --name my_app --mount type=bind,source=/tmp/my_app,target=/data/apps busybox

从上面知道用-v和--mount都可以进行挂载。如果使用-v来挂载目录,如果本地/tmp/my_app存在,则直接将这个目录挂载到容器上,里面如果有文件等,就可以在容器中直接进行查看。如果本地没有这个目录,则在启动容器的过程中自动创建这个目录。如果使用--mount来挂载目录,如果本地目录不存在,就会报错,比如:

# docker run -it --rm --name my_app --mount type=bind,source=/tmp/my_app/web/data,target=/data/apps busybox
docker: Error response from daemon: invalid mount config for type "bind": bind source path does not exist: /tmp/my_app/web/data.
See 'docker run --help'.

默认挂载到容器中的目录,docker对其是有读写权限的,用户可以增加readonly参数使其只有只读权限。

# docker run -it --rm --name my_app --mount type=bind,source=/tmp/my_app,target=/data/apps,readonly busybox
/ # cd /data/apps/
/data/apps # ls
/data/apps # touch 1.txt
touch: 1.txt: Read-only file system

不仅可以挂载目录,还可以挂载单个文件,如下:

# docker run -it --rm --name my_app --mount type=bind,source=/$HOME/.bash_history,target=/data/apps/history busybox
# docker run -it --rm --name my_app -v /$HOME/.bash_history:/data/apps/history busybox

如果是跨主机使用,可以通过共享存储,比如NFS之类的。这样我们只要挂载NFS的目录,所有的读写操作其他主机也可见。

除了使用上面这两种挂载之外,还可以使用现有容器的挂载,通过--volumes-from命令就可以直接使用其他容器的挂载,比如:

# docker run -it --rm --name my_app -v /$HOME/.bash_history:/data/apps/history busybox
# docker run -it --rm --name new_app --volumes-from my_app busybox

这样,my_app和new_app使用的就是同一个挂载卷了。

《Docker从入门到跑路》之存储卷介绍的更多相关文章

  1. 《Docker从入门到跑路》之网络模型介绍

    Bridge模式 当我们安装完docker后,启动Docker daemon,就会在主机上看到一个docker0的网桥,默认在此主机上启动的容器都会连接到这个网桥上.虚拟网桥的工作方式和物理交换机的工 ...

  2. 《Docker从入门到跑路》之Dockerfile基本操作

    一.简介 Dockerfile是一个文本文件,里面包含一条条指令,每一条指令就是一层镜像.一般情况下,Dockerfile分为4个部分: 基础镜像 维护者信息 镜像操作指令 容器启动时执行命令 例如: ...

  3. 《Docker从入门到跑路》之镜像和容器的基本操作

    一.获取镜像 官方提供了一个公共镜像仓库Docker Hub,默认是从这上面获取镜像的. 搜素镜像使用docker search 命令: # docker search --help Usage: d ...

  4. 《Docker从入门到跑路》之简介

    什么是Docker Docker,中文翻译是"码头工人".根据官方的定义,Docker是以Docker容器为资源分割和调度的基本单元,封装了整个软件运行的环境,为开发者和系统管理员 ...

  5. 《Docker从入门到跑路》之基本用法介绍

    Docker是一种轻量级的虚拟化技术,它具备传统虚拟机无法比拟的优势,它更简易的安装和使用方式.更快的速度.服务集成和开源流程自动化. Docker的安装 安装Docker的基本要素:1.Docker ...

  6. 《Docker从入门到跑路》之多阶段构建

    多阶段构建就是在一个Dokcerfile中定义多个FROM,每个FROM都可以使用不同的基础镜像,并表示开始一个新的构建阶段,我们可以很方便的将一个阶段的文件复制到另外一个阶段中,在最终的阶段保存你需 ...

  7. 反手来个K8S入门到跑路

    layout: post title: 反手来个K8S入门到跑路 category: linux date: 2019-06-09 tags: linux k8s 反手来个K8S入门到跑路 前言 放假 ...

  8. Spring全家桶系列–[SpringBoot入门到跑路]

    //本文作者:cuifuan Spring全家桶————[SpringBoot入门到跑路] 对于之前的Spring框架的使用,各种配置文件XML.properties一旦出错之后错误难寻,这也是为什么 ...

  9. TiDB入门(四):从入门到“跑路”

    前言 前面三章基本把 TiDB 的环境弄好了,也做了一下简单测试,有兴趣的同学可以看一下: TiDB 入门(一):TiDB 简介 TiDB 入门(二):虚拟机搭建 TiDB-Ansible 部署方案 ...

随机推荐

  1. SpringMVC框架详细教程(二)

    创建动态Web项目 1.创建动态Web项目: 打开Eclipse,在Package Explorer右击,创建项目,选择动态Web项目(Dynamic Web Project). 填写项目名称,并选择 ...

  2. Angular input / ion-input ion-searchbar 实现软件盘换行 改 搜索 并且触发搜索方法 Android iOS适用

    Angular 实现软件盘 换行 改 搜索 并且除非 搜索方法:    Form 必须有 action="javascript: return true;”   input / ion-in ...

  3. 解决xcode ***is missing from working copy

    这是由于SVN置顶文件导致的,cd 至项目根目录 命令行 输入 find . -type d -name .svn | xargs rm -rf

  4. bootstrapTable随机改变列颜色

    { title: '运单编号', field: 'waybillNumber', align: 'center', valign: 'middle', cellStyle: function (val ...

  5. 【Java】【常用类】Object 基类 源码学习

    源码总览: 有好些都是native本地方法,背后是C++写的 没有关于构造器的描述,默认编译器提供的无参构造 https://blog.csdn.net/dmw412724/article/detai ...

  6. 委托的 `DynamicInvoke` 小优化

    委托的 DynamicInvoke 小优化 Intro 委托方法里有一个 DynamicInvoke 的方法,可以在不清楚委托实际类型的情况下执行委托方法,但是用 DynamicInvoke 去执行的 ...

  7. Shell 变量引用实例

    初学 Shell 编程时,对变量各种引用使用不太熟悉,走了很多弯路,本文记录变量引用的一些用法,希望对大家有所帮助. 引用 引用指将字符串用引用符号引起来,以防止特殊字符被 shell 脚本解释为其他 ...

  8. Mysql大厂高频面试题

    前言 前几天有读者找到我,说想要一套全面的Mysql面试题,今天陈某特地为她写了一篇. 文章的目录如下: Mysql面试题 什么是SQL? 结构化查询语言(Structured Query Langu ...

  9. windows批处理protoc生成C++代码

    1 首先需要生成protoc的可执行文件,具体可以参考  https://www.cnblogs.com/cnxkey/articles/10152646.html 2 将单个protoc文件生成.h ...

  10. JS Math&Date的方法 (下)

    Date - 时间日期对象 一:Date 时间对象 - 它是处理时间日期的 时间日期对象  - js提供了一个专门用来创建日期对象的构造函数 Date          new Date()  这是一 ...