Docker容器中数据卷volumes的使用

目录
  • 选择使用 -v还是—mount
  • -v和—mount的不同行为
  • 启动一个带volume的容器
  • 启动一个带有volumes服务
  • 使用容器加载一个volume
  • 使用只读volume
  • 机器间共享数据
  • 使用volume驱动
  • 总结

volumes是Docker数据持久化机制。bind mounts依赖主机目录结构,volumes完全由Docker管理。Volumes有以下优点:

  • Volumes更容易备份和移植。
  • 可以通过Docker CLI或API进行管理
  • Volumes可以无区别的工作中Windows和Linux下。
  • 多个容器共享Volumes更安全。
  • Volume驱动可以允许你把数据存储到远程主机或者云端,并且加密数据内容,以及添加额外功能。
  • 一个新的数据内容可以由容器预填充。

而且,volumes不会增加容器的大小,生命周期独立与容器。

如果你的容器产生不需要持久化数据,请使用tmpfs mount方式,可以避免容器的写入层数据写入。

Volumes use  rprivate  bind propagation, and bind propagation is not configurable for volumes.(不理解什么意思)

选择使用 -v还是—mount

起初,-v或者—volume用于独立容器,--mount用于 swarm services。然而,从 Docker 17.06开始,也可是使用 --mount用于独立容器。—mount命令更精准详细。-v将选项进行了合并。使用—mount。

如果你需要制定volume驱动选项,你必须使用 —mount。

  • -v或者--volume:由3部分参数组成,使用“:”间隔。顺序不能颠倒。

    • 第一个部分是volumes名字,在宿主机上具有唯一性。匿名卷名字系统给出。
    • 第二部分是挂载到容器里的文件或文件夹路径。
    • 第三部分是可选项列表分隔符,例如“or”,这些可选项在下面会讨论。
  • —mount:由多个键值对组成,<key>=<value>。—mount要比-v或者--volume命令更长,但是更容易理解。
    • type,可以是bind,volume或者tmpfs。这篇文章主要讨论volumes,所以type一直使用volume.
    • source,volumes的名字,匿名volume可以省略。source可缩写为src.
    • destination,挂载到容器中的文件或目录路径。可也缩写为dst或者使用target。
    • readonly,指定挂载在容器中为只读。
    • volume-opt,可选属性,可以多次使用。

下面是—mount和-v的例子。

-v和—mount的不同行为

与bind mounts不同,对于—mount和-v所有的选项都可以使用。

当使用volumes服务时,只支持—mount.

创建和管理volumes

不像bind mount,你可以在容器外创建和管理volumes。

创建一个volume:

$ docker volume create my-vol

显示所有volumes

$ docker volume ls
local               my-vol

查看volumes

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

删除一个volume:

$ docker volume rm my-vol

启动一个带volume的容器

如果你启动一个带有volume容器,volume还没有创建,Docker会为你创建。下面的例子挂载myvol2到容器中的/app/下。

下面的例子-v和—mount结果是一样的。
—mount:

$  docker run  -d   \
  --name  devtest  \
  --mount   source = myvol2,target = /app  \
  nginx:latest

-v:

$  docker run  -d   \
 --name  devtest  \
 -v  myvol2:/app  \
  nginx:latest

使用inspect查看挂载是否正确,查看Mounts部分:

"Mounts" :   [
 {
 "Type" :   "volume" ,
 "Name" :   "myvol2" ,
 "Source" :   "/var/lib/docker/volumes/myvol2/_data" ,
 "Destination" :   "/app" ,
 "Driver" :   "local" ,
 "Mode" :   "" ,
 "RW" :   true ,
 "Propagation" :   ""
 }
],

可以看出挂载正确,并且是可读写的。

停止容器然后删除volume

$  docker container stop devtest
$  docker container rm devtest
$  docker volume rm myvol2

启动一个带有volumes服务

当你启动服务定义一个volume,每个服务可以使用自己本地人volume.如果你使用local volume,容器不能分享数据,但是一些volume驱动支持分享存储。 Docker for AWS and Docker for Azure使用 Cloudstor插件 都支持持久化存储。

下面的例子启动4份nginx服务,每个使用一个本地存储myvol2。

$  docker service create  -d   \
 --replicas = 4  \
 --name  devtest-service  \
 --mount   source = myvol2,target = /app  \
  nginx:latest

使用 docker service ps devtest-service  查看服务是否运行:

$  docker service ps devtest-service

ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS

4d7oz1j85wwn        devtest-service.1   nginx:latest        moby                Running             Running 14 seconds ago  

删除服务

$  docker service rm devtest-service

服务标识的不同

docker service create  命令不支持-v或者—volume。必须使用—mount。

使用容器加载一个volume

和上面一样,如果你启动一个容器创建一个新的volume,在容器被挂载的目录(/app/)中有文件或者文件夹,这个目录中的内容会被拷贝到volume中。然后容器挂载使用volume,其他容器使用这个volume也可以访问预加载内容。

为了说明这个,这个例子启动一个nginx容器并且加载一个新volume nginx-vol,里面包括容器中 /usr/share/nginx/html  目录中的内容,里面存储的是nginx默认的HTML内容。

—mount and -v具有相同结果

—mount:

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

-v

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

以下是运行后清理命令

$  docker container stop nginxtest
$  docker container rm nginxtest
$  docker volume rm nginx-vol

使用只读volume

对于一些开发应用,容器需要回写数据到Docker主机。但有时容器只需要读数据。请记住多个容器可以挂载相同volume,一个挂载读写容器,也可以挂载只读容器,还可以两种同时挂载。

这个例子修改上面的例子,但是挂载的是只读容器,使用’or’分隔符处理选项列表,

—mount and -v具有相同结果

—mount

$  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

使用  docker inspect nginxtest 命令查看是否挂载正确,查看Mounts部分

"Mounts" :   [
 {
 "Type" :   "volume" ,
 "Name" :   "nginx-vol" ,
 "Source" :   "/var/lib/docker/volumes/nginx-vol/_data" ,
 "Destination" :   "/usr/share/nginx/html" ,
 "Driver" :   "local" ,
 "Mode" :   "" ,
 "RW" :   false ,
 "Propagation" :   ""
 }
],

清理命令

$  docker container stop nginxtest
$  docker container rm nginxtest
$  docker volume rm nginx-vol

机器间共享数据

当构建高可用应用程序,你需要配置多个相同的服务访问相同文件。

有几种方法可以达到这种效果。一种是在你的应用中添加对云存储文件的访问,如 Amazon S3。另一种是使用支持外服存储驱动(NFS,  Amazon S3 )的volume。

Volume驱动允许你在应用中抽象下层的存储系统。例如,如果你的服务使用NFS驱动volume,你可以使用不同的驱动更新服务,就像存储在云中的数据,不需要修改应用逻辑。

使用volume驱动

当你使用docker volume create创建一个volume,或者当你启动一个带有没创建volume的容器,你可以指定volume驱动。下面例子使用 vieux/sshfs volume驱动 ,首先创建一个独立的volume,然后启动一个创建新volume的容器。

初始化设置

这个例子假设你有两个节点,第一个是Docker主机而且可以连接到第二个的ssh.

在Docker主机中安装vieux/sshfs插件:

$  docker plugin install  --grant-all-permissions  vieux/sshfs

使用volume驱动创建volume

这个样例指定一个SSH密码,但是如果两个主机共享keys配置,你可以省略密码。每个volume驱动可以没有或者更多配置选项,可以使用-o标识。

$  docker volume create  --driver  vieux/sshfs  \
 -o   sshcmd = test @node2:/home/test  \
 -o   password = testpassword  \
  sshvolume

test @node2:/home/test 为远程主机挂载点

启动一个带有使用volume驱动创建volume的容器

这个样例指定一个SSH密码,但是如果两个主机共享keys配置,你可以省略密码。每个volume驱动可以没有或者更多配置选项。如果volume驱动要穿可选参数,你必须使用—mount。

$  docker run  -d   \
 --name  sshfs-container  \
 --volume-driver  vieux/sshfs  \
 --mount   src = sshvolume,target = /app,volume-opt = sshcmd = test @node2:/home/test,volume-opt = password = testpassword  \
  nginx:latest

参考: https://docs.docker.com/storage/volumes/

总结

到此这篇关于Docker容器中数据卷volumes使用的文章就介绍到这了,更多相关Docker volumes使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Docker容器数据卷介绍及操作示例

    目录 容器数据卷介绍 什么是数据卷 数据卷能做什么? 特点 Docker 容器数据卷操作 直接命令添加数据卷 dockerfile 添加数据卷 Docker 数据卷容器 数据卷容器简介 案例演示 容器数据卷介绍 什么是数据卷 将运用与运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对数据的要求是持久化的. 容器之间希望有可能共享数据. Docker 容器产生的数据,如果不通过 docker commit 生成新的镜像,使得数据做为镜像的一部分保存下载,那么当容器删除后,数据自然也就没有了

  • Docker容器数据卷技术介绍

    目录 Docker容器数据卷技术介绍 一.卷技术介绍 二.使用数据卷 Docker容器数据卷技术介绍 一.卷技术介绍 现在我们知道docker的理念就是把应用和环境打包成镜像,方便我们去运行容器. 但是现在有一个问题,比如我容器里的mysql存了好多的数据,那万一容器被删除,数据是不是就没了?这显然不合适. 于是,一个新的需求产生了:将数据存储在容器之外的地方,比如本地.对应的解决方案就是卷技术了,通过它,将容器中产生的数据同步到本地,让容器之间可以共享数据. 卷技术,说白了就是目录的挂载,将容

  • Docker数据卷容器创建及使用方法解析

    数据卷容器是一个专门用来挂载数据卷的容器,该容器主要是供其他容器引用和使用.所谓的数据卷容器,实际上就是一个普通的容器,举例如下: 创建数据卷容器 使用如下方式创建数据卷容器: docker run -itd -v /usr/share/nginx/html/ --name mydata ubuntu 命令执行效果如下图: 引用容器 使用如下命令引用数据卷容器: docker run -itd --volumes-from mydata -p 80:80 --name nginx1 nginx

  • docker中容器数据卷volume介绍

    目录 docker 容器数据卷volume 使用数据卷 方式一:直接使用命令挂载 -v 方式二:Dockerfile 数据卷容器 总结 docker 容器数据卷volume 如果数据都在容器中,那么我们删除容器的时候数据就会丢失,所以我们希望数据可以持久化. 例如MySQL容器,我们希望数据可以存储在本地,当MySQL容器删除的时候,数据不会丢失. 容器之间可以有一个数据共享的技术,Docker容器中产生的数据,同步到本地,这就是卷技术.也就是数据挂载技术,将我们容器内的目录,挂载到Linux上

  • docker挂载本地目录和数据卷容器操作

    1.docker挂载本地目录 docker可以支持把一个宿主机上的目录挂载到镜像里. 交互模式运行 docker run -it -v /home/dock/Downloads:/usr/Downloads ubuntu64 /bin/bash 后台运行 docker run -d -v /home/dock/Downloads:/usr/Downloads --name ubuntu1 ubuntu64 通过-v参数,冒号前为宿主机目录,必须为绝对路径,冒号后为镜像内挂载的路径. 现在镜像内就

  • 详解Docker容器数据卷

    是什么 先来看看Docker的理念: 将运用与运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对数据的要求希望是持久化的容器之间希望有可能共享数据 Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来, 那么当容器删除后,数据自然也就没有了. 为了能保存数据在docker中我们使用卷. 一句话:有点类似我们Redis里面的RDB和AOF 能干嘛 卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系

  • Docker容器中数据卷volumes的使用

    目录 选择使用 -v还是—mount -v和—mount的不同行为 启动一个带volume的容器 启动一个带有volumes服务 使用容器加载一个volume 使用只读volume 机器间共享数据 使用volume驱动 总结 volumes是Docker数据持久化机制.bind mounts依赖主机目录结构,volumes完全由Docker管理.Volumes有以下优点: Volumes更容易备份和移植. 可以通过Docker CLI或API进行管理 Volumes可以无区别的工作中Window

  • Docker中数据卷(volume)管理的两种方式

    上篇文章给大家介绍过 docker基础知识之挂载本地目录的方法 ,今天给大家介绍Docker中数据卷(volume)管理的两种方式,具体内容如下所示: 什么是数据卷 数据卷( volume ):volume是存在于一个或多个容器中的特定文件或文件夹,这个目录以独立于联合文件系统的形式在宿主机中存在,并为数据的共享与持久化提供便利. 为什么要用数据卷 Docker分层文件系统存在的问题: Docker的镜像是由一系列的只读层组合而来的,当启动一个容器时, Docker加载镜像的所有只读层,并在最上

  • 在 Docker 容器中运行 PHPMyAdmin的详细步骤

    目录 基本用法 预设服务器 使用 MySQL Docker 容器 使用 Docker Compose 简化部署 配置安装 概括 PHPMyAdmin是 MySQL 和 MariaDB 数据库的流行管理界面.它允许您使用 Web 浏览器与您的模式.表和数据进行交互.phpMyAdmin能够为你的MySQL提供直观.方便的Web管理界面,非常好用. 该项目有一个官方的 Docker 镜像,它简化了在容器化环境中的部署.以下是如何使用图像快速运行新的 PHPMyAdmin 实例. 基本用法 最简单的安

  • 在Docker容器中不需要运行sshd的原因浅析

    当开始使用Docker时,人们经常问:"我该如何进入容器?",其他人会说"在你的容器里运行一个SSH服务器".但是,从这篇博文中你将会了解到你根本不需要运行SSHd守护进程来进入你的容器.当然,除非你的容器就是一个SSH服务器. 运行SSH服务器是很想当然的,因为它提供了进入容器的简便方式.在我们公司基本上每个人都最少使用过一次SSH.我们中有很大一部分人每天都会使用它,并且他们很熟悉公钥与私钥,无密码登录,密钥代理,甚至有时会使用端口转发和其他不常用的功能.正因如

  • 如何隔离docker容器中的用户的方法

    笔者在前文<理解 docker 容器中的 uid 和 gid>介绍了 docker 容器中的用户与宿主机上用户的关系,得出的结论是:docker 默认没有隔离宿主机用户和容器中的用户.如果你已经了解了 Linux 的 user namespace 技术(参考<Linux Namespace : User>),那么自然会问:docker 为什么不利用 Linux user namespace 实现用户的隔离呢?事实上,docker 已经实现了相关的功能,只是默认没有启用而已.笔者将在

  • 详解挂载运行的docker容器中如何挂载文件系统

    前言 感觉最近很多人都在问docker相关的问题,关于怎么操作一个已经启动的docker容器的文件系统,首先我发现这非常困难,因为 mnt的命名空间. 为了登录进入一个已经启动的docker容器,我们需要这么做: 使用nsenter来在临时挂载点上挂载整个docker容器的文件系统. 创建一个特定目录的绑定挂载来当作卷来使用. 卸载临时挂载. 好吧,开始实践. 启动一个名为charlie的docker实例: $ docker run --name charlie -ti ubuntu bash

  • 在docker容器中调用和执行宿主机的docker操作

    首先这个帖子,献给docker新手.当然如果你是一个老手,文中分割线后的操作方法也是一种思路. 首先说一下,如何在docker中执行宿主机的docker操作,我们管它叫docker in docker. 至于为什么要在docker中操作宿主机的docker,优点不言而喻,你既可以将你的具体需求容器化部署,又不用直接在宿主机上安装(假设我们没有办法在docker中操作宿主机的docker,那么我们只能将这样的软件程序直接安装到宿主机上,这样显然是不利于管理和维护的). 实现这种需求,其实非常简单,

  • docker容器中安装vim问题解决

    目录 故事的开始 装个 vim 编辑 hadoop-hive.env 大意了没有闪, 居然是 debian 其他方法 总结 故事的开始 很多互联网公司, 业务走过 0-1 的野蛮生长之后必定需要精细化管理; 尤其是 面向自己用户 这一块, 你需要像个渣男一样了解你的用户特点 / 需要 / 才知道怎样哄人家开心; 人家才会死心塌地跟着你. 如果是 面向企业(to B)用户, 问题很简单: 去拜访不同的合作公司/业内翘楚, 大家都是带有目的性, 互惠互利一来二去就清楚了; 但像我们这种 面向用户(t

  • 深入浅析Docker容器中的Patroni

    目录 创建镜像 文件结构 DockerFile entrypoint.sh function generatefile 构建镜像 运行镜像 总结 附图 上一篇文章向大家介绍了Repmgr的搭建过程,实现了自动切换,今天将向大家介绍,如何搭建容器下的Patroni集群环境,Patroni作为开箱即用PG高可用工具,越来越多的被各个厂商用于云环境下使用. patroni基本架构如图所示: etcd作为分布式注册中心.进行集群选主工作:vip-manager为主节点设置漂移IP:patroni负责引导

  • 一文教会你在Docker容器中实现Mysql主从复制

    目录 一 主从复制概念 二 主从复制的优势 三 Docker容器实现Mysql主从复制 3.1 创建主服务器容器 3.2 新建主配置文件 my.cnf 3.3 重启master容器实例 3.4 进入mysql-master容器 3.5 在主服务器中创建用户并授权 3.6 创建从服务器容器 3.7 新建主配置文件 my.cnf 3.8 重启slave容器实例 3.9 在主数据库中查看主从同步状态 3.10 进入mysql-slave容器 3.11 在从数据库中配置主从复制 3.12 在从数据库中查

随机推荐