Docker数据存储之Volumes详解

默认容器的数据的读写发生在容器的存储层,当容器被删除时其上的数据将会丢失。所以我们应该尽量保证容器存储层不发生写操作,为了实现数据的持久化存储我们需要选择一种方案来保存数据,当前有以下几种方式:

  • Volumes
  • Bind mounts
  • tmpfs mounts

下图展示了这三种技术:

Volumes

Volumes(数据卷)是一个可供一个或多个容器使用的位于宿主机上特殊目录,它拥有以下特性:

  • 数据卷可以在容器间共享和重用
  • 对数据卷的写入操作,不会对镜像有任何影响
  • 数据卷默认会一直存在,即使容器被删除

使用数据卷的目的是持久化容器中的数据,以在容器间共享或者防止数据丢失(写入容器存储层的数据会丢失)。

使用数据卷的步骤一般分为两步:

  1. 创建一个数据卷
  2. 使用-v或--mount参数将数据卷挂载容器指定目录中,这样所有该容器针对该指定目录的写操作都会保存在宿主机上的Volume中。

Volume管理

创建一个Volume:

$ docker volume create my-vol

查看Volumes:

$ docker volume ls
local    my-vol
$ docker volume inspect my-vol
[
 {
  "Driver": "local",
  "Labels": {},
  "Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
  "Name": "my-vol",
  "Options": {},
  "Scope": "local"
 }
]

我么可以看到创建的Volume my-vol保存在目录/var/lib/docker/volumes/下,以后所有针对该Volume的写数据都会保存中目录/var/lib/docker/volumes/my-vol/_data下。

删除一个Volume:

$ docker volume rm my-vol

或者删除所有未使用的Volumes:

docker volume prune

挂载数据卷到容器目录

创建了一个Volume之后,我们可以在运行容器时通过指定-v或--mount参数来使用该Volume:

使用--mount参数:

$ docker run -d \
 --name=nginxtest \
 --mount source=nginx-vol,destination=/usr/share/nginx/html \
 nginx:latest

source指定volume,destination指定容器内的文件或文件夹。

或者使用-v参数:

$ docker run -d \
 --name=nginxtest \
 -v nginx-vol:/usr/share/nginx/html \
 nginx:latest

挂载成功后,容器从/usr/share/nginx/html目录下读取或写入数据,实际上都是从宿主机的nginx-vol数据卷中读取或写入数据。因此Volumes或Bind mounts也可以看作是容器和宿主机共享文件的一种方式。

-v参数使用冒号分割source和destination,冒号前半部分是source,后半部分是destination。

如果你挂载一个还不存在的数据卷,Docker会自动创建它。(因此创建数据卷那一步非必需)

如果容器中的待挂载的目录不是一个空目录,那么该目录下的文件会被复制到数据卷中。(Bind mounts下,宿主机上的目录总会覆盖容器中的待挂载目录)

-v参数和--mount参数总的来说功能几乎相同,唯一的区别是在运行一个service时只能够--mount参数来挂载数据卷。

使用只读数据卷

有些情况下,我们希望某个数据卷对某个容器来说是只读的,可以通过添加readonly选项来实现:

$ docker run -d \
 --name=nginxtest \
 --mount source=nginx-vol,destination=/usr/share/nginx/html,readonly \
 nginx:latest

或者使用-v参数:

$ docker run -d \
 --name=nginxtest \
 -v nginx-vol:/usr/share/nginx/html:ro \
 nginx:latest

Volumes使用场景

请参考这篇文章:Docker数据存储总结

参考文章

https://docs.docker.com/storage/volumes/#share-data-among-machines

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接

(0)

相关推荐

  • Docker数据存储之tmpfs mounts详解

    阅读本文前,希望你已经对Volumes和Bind mounts有了初步的了解,具体可以参考以下文章: Docker数据持久化之Volumes Docker数据持久化之Bind mounts tmpfs mounts Volumes和Bind mounts模式使我们能够在宿主机和容器间共享文件从而我们能够将数据持久化到宿主机上,以避免写入容器存储层带来的容器停止后数据的丢失的问题. 如果你使用linux运行Docker,那么避免写入数据到容器存储层还有一个方案:tmpfs mounts. tmpf

  • CentOS下Docker的安装教程详解

    Docker划分为CE和EE,CE版本即社区版(免费):EE即企业版,强调安全(付费).Docker CE每月发布一个edge版本,每三个月发布一个stable版本,Docker EE和stable版本号保持一致. Docker CE支持64位版本CentOS 7,并且要求内核版本不低于3.10.CentOS满足最低内核的要求,如果内核版本比较低,部分功能(如overlay2存储层驱动)无法使用,并且部分功能可能不太稳定. 有三种安装Docker CE的方式:通过Docker仓库安装,下载安装包

  • Docker搭建自己的本地镜像仓库的步骤

    一.环境以及准备工作 1.ubuntu14.04 2.docker环境 二.搭建过程 1.更换镜像源(因为默认的太慢了,国内的更快) sudo vim /etc/default/docker 输入以下参数: DOCKER_OPTS="--registry-mirror=http://hub-mirror.c.163.com" //网易的,也可以使用daoClouds的 如果是刚安装的ubuntu环境的话,执行以下命令(当然也能用vi,或者直接写入) sudo apt-get updat

  • 阿里云esc服务器Docker部署单节点Mysql的讲解

    1.下载加速版msyql   docker pull hub.c.163.com/library/mysql:5.7 2.更名 docker tag hub.c.163.com/library/mysql:5.7 mysql:5.7 3.启动 docker run -it --rm --name mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql 4.设置mysql远程登录 docker exec -it mysql bash my

  • Docker容器应用日志查看方法

    docker attach命令 docker attach [options] 容器会连接到正在运行的容器,然后将容器的标准输入.输出和错误流信息附在本地打印出来.命令中options的取值有三种:--detach-keys,--no-stdin,--sig-proxy. 该命令只是进入容器终端,不会启动新的进程.所以当你同时使用多个窗口进入该容器,所有的窗口都会同步显示.如果一个窗口阻塞,那么其他窗口也就无法再进行操作. 使用ctrl+c可以直接断开连接,但是这样会导致容器退出,而且还stop

  • Docker数据存储总结

    阅读本文前,希望你已经对Volumes,Bind mounts和tmpfs mounts有了初步的了解,具体可以参考以下文章: Docker数据存储之Volumes Docker数据存储之Bind mounts Docker数据存储之tmpfs mounts 下图展示了Volumes,Bind mounts和tmpfs mounts三种存储技术的不同: Volumes的使用场景 在多个容器间共享数据. 无法确保Docker主机一定拥有某个指定的文件夹或目录结构,使用Volumes可以屏蔽这些宿主

  • Docker容器和本机之间的文件传输方法

    主机和容器之间传输文件的话需要用到容器的ID全称. 获取方法如下: 1.先拿到容器的短ID或者指定的name. 2.然后根据这两项的任意一项拿到ID全称. 有了这个长长的ID的话,本机和容器之间的文件传输就简单了. docker cp 本地文件路径 ID全称:容器路径 进入容器之后就能够看到刚才上传进来的文件了. 如果是容器传输文件到本地的话,反过来就好了: docker cp ID全称:容器文件路径 本地路径 进行挂载的话可以参考这篇:利用Volume在主机和Docker容器文件传输. 以上就

  • Docker数据存储之Bind mounts详解

    阅读本文前,希望你已经对Volumes有了初步的了解,具体可以参考这篇文章: Docker数据存储之Volumes详解 默认容器的数据的读写发生在容器的存储层,当容器被删除时其上的数据将会丢失.所以我们应该尽量保证容器存储层不发生写操作,为了实现数据的持久化存储我们需要选择一种方案来保存数据,当前有以下几种方式: Volumes Bind mounts tmpfs mounts 下图展示了这三种技术: Bind mounts Bind mounts模式和Volumes非常相似,不同点在于Bind

  • 第一次构建、运行、发布、获取docker镜像的步骤详解

    1.前言 过去,如果您要开始编写Python应用程序,第一步就是把Python的运行环境安装到您的机器上,而且安装的环境还要和线上的一致,比较麻烦. 使用Docker,您可以从docker的官方registry或者其他仓库,获取一个可移植的Python运行环境镜像,无需安装.然后,你可以基于这个镜像开发你的应用程序,这样可以确保您的应用程序,依赖项和运行时都一起运行. 2.构建一个python镜像 2.1.为了构建您自己的镜像,首先需要创建一个名称为Dockerfile的文件,用于定义创建镜像并

  • docker完整配置nginx+php+mysql的方法步骤

    首先了解一个方法: 使用docker exec进入Docker容器 docker在1.3.X版本之后还提供了一个新的命令exec用于进入容器,这种方式相对更简单一些,下面我们来看一下该命令的使用: sudo docker exec --help 接下来我们使用该命令进入一个已经在运行的容器 $ sudo docker ps $ sudo docker exec -it 775c7c9ee1e1 /bin/bash 一. 配置nginx 查找Docker Hub上的 nginx 镜像 runoob

随机推荐