接下来介绍如何在 Docker 内部以及容器之间管理数据,在容器中管理数据主要有两种方式:

  • 数据卷(Data Volumes)
  • 挂载主机目录 (Bind mounts)

一、数据卷

数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:

  • 数据卷可以在容器之间共享和重用
  • 对数据卷的修改会立马生效
  • 对数据卷的更新,不会影响镜像
  • 数据卷默认会一直存在,即使容器被删除

数据卷

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

可以通过如下命令创建一个数据卷:

$ docker volume create my-vol

查看数据卷:

$ docker volume ls
local my-vol

同样可以通过 inspect 命令查看数据卷详细信息:

$ docker volume inspect my-vol
[
{
"CreatedAt": "2019-11-02T03:08:02+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/data/docker/volumes/my-vol/_data",
"Name": "my-vol",
"Options": {},
"Scope": "local"
}
]

启动一个挂载数据卷的容器:在用docker run命令的时候,使用--mount或者-v标记来将数据卷挂载到容器里。下面创建一个名为 web 的容器,并加载一个数据卷到容器的 /usr/share/nginx/html 目录:

# -v my-vol:/xxxx
# --mount source=my-vol,target=/xxxx
$ docker run -d -p 8080:80 --name web -v my-vol:/usr/share/nginx/html nginx

运行完成后,可以查看数据卷目录下面已经有文件了:

$ ls /data/docker/volumes/my-vol/_data/
50x.html index.html

这个时候我们可以通过localhost:8080访问容器服务:

$ curl http://localhost:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p> <p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p>
</body>
</html>

如果我们把数据下面的 index.html 文件内容变更下:

$ echo "Hello Docker" > /data/docker/volumes/my-vol/_data/index.html

这个时候重新访问就可以看到内容已经变化了:

$ curl http://localhost:8080
Hello Docker

数据卷是被设计用来持久化数据的,它的生命周期独立于容器,Docker 不会在容器被删除后自动删除 数据卷,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的数据卷。如果需要在删除容器的同时移除数据卷。可以在删除容器的时候使用docker rm -v这个命令。 无主的数据卷可能会占据很多空间,要清理请使用以下命令:

$ docker volume prune

二、挂载主机目录

Docker 同样支持把宿主机上的目录挂载到容器中,同样可以使用 -v 或者 --mount 参数来进行挂载,如下所示,把宿主机的 /tmp 目录挂载到一个容器中:

$ ls /tmp/
nginx.tar.gz yum_save_tx.2019-11-01.23-56.ux9w_4.yumtx
$ ls /tmp/nginx.tar.gz
/tmp/nginx.tar.gz
$ docker run -it -v /tmp:/usr/tmp busybox /bin/sh
/ # ls /usr/tmp/
nginx.tar.gz yum_save_tx.2019-11-01.23-56.ux9w_4.yumtx

通过-v参数,冒号前为宿主机目录,必须为绝对路径,冒号后为容器内挂载的路径。这样容器内就可以共享宿主机里的文件了。

挂载权限

默认挂载的路径权限为读写。如果指定为只读可以用:ro,如:-v /tmp:/usr/tmp:ro。

– 容器目录不可以为相对路径

– 宿主机目录如果不存在,则会自动生成

– 挂载宿主机已存在目录后,在容器内对其进行操作,报“Permission denied”。可通过两种方式解决:

  • 1> 关闭selinux。

    临时关闭:# setenforce 0

    永久关闭:修改/etc/sysconfig/selinux文件,将 SELINUX 的值设置为disabled。

  • 2> 以特权方式启动容器

    指定--privileged参数,如:

    # docker run -it --privileged=true -v /test:/soft centos /bin/bash

bind mount 和 volume 其实都是利用宿主机的文件系统,不同之处在于 volume 是 docker 自身管理的目录中的子目录,所以不存在权限引发的挂载的问题,并且目录路径是 docker 自身管理的,所以也不需要在不同的服务器上指定不同的路径,你不需要关心路径。它们之间的主要区别有如下几点:

  • volume 会引起 docker 目录膨胀,因为既要存镜像,又要存 volume,最好不要放在系统盘,将 docker 的安装目录配置到其他更大的挂载盘
  • 两者有一个不同的行为:当容器外的对应目录是空的,volume 会先将容器内的内容拷贝到容器外目录,而 mount 会将外部的目录覆盖容器内部目录
  • volume 还有一个不如 bind mount 的地方,不能直接挂载文件,例如挂载 nginx 容器的配置文件:nginx.conf

下一篇将介绍Dockerfile

(转发请注明出处:http://www.cnblogs.com/zhangyongli2011/ 如发现有错,请留言,谢谢)

Docker数据共享与持久化(六)的更多相关文章

  1. Docker 数据共享与持久化

  2. docker容器的持久化存储:Volume

    独立于docker容器的持久化存储: 法(1):自动将服务器文件夹挂载到容器内部文件夹/usr/share/nginx/html,这样只修改服务器文件夹下的内容即可对应修改容器内部文件夹的内容 将服务 ...

  3. Docker入门教程(六)另外的15个Docker命令

    Docker入门教程(六)另外的15个Docker命令 [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第六篇,继续介绍Docker命令.之前的第二篇文章 ...

  4. docker mysql 数据持久化到本地、设置不区别表名大小写-清风柳絮-51CTO博客

    原文:docker mysql 数据持久化到本地.设置不区别表名大小写-清风柳絮-51CTO博客 Docker MySQL 把数据存储在本地目录,很简单,只需要映射本地目录到容器即可 1.加上-v参数 ...

  5. Docker 容器数据 持久化(系统学习Docker05)

    写在前面 本来是可以将数据存储在 容器内部 的.但是存在容器内部,一旦容器被删除掉或者容器毁坏(我亲身经历的痛,当时我们的大数据平台就是运行在docker容器内,有次停电后,不管怎样容器都起不来.以前 ...

  6. docker 数据共享,数据复制

    docker 提供的数据共享的方式有 docker   run  -it  -v:/dataname  image 数据复制使用 docker  cp  containerid:/dataname   ...

  7. Docker数据卷持久化

    Docker提供三种不同的方式将数据从宿主机挂载到容器中:volumes,bind mounts和tmpfs. volumes:Docker管理宿主机文件系统的一部分(/var/lib/docker/ ...

  8. Docker之 数据持久化

    容器中数据持久化主要有两种方式: 数据卷(Data Volumes) 数据卷容器(Data Volumes Dontainers) 数据卷 数据卷是一个可供一个或多个容器使用的特殊目录,可以绕过UFS ...

  9. 【07】循序渐进学 docker:数据持久化

    写在前面的话 学到这里相信有心的朋友都发现问题了,我们每次都会去删掉容器,在创建新的容器.那数据怎么办?岂不删库跑路了? 就算不是数据库,假设公司有日志保留的需求,那每一次发布岂不日志都被干掉了? D ...

  10. Docker自学纪实(三)Docker容器数据持久化

    谈起数据卷 我一直觉得是个枯燥无聊的话题 但是通过今天的实操和阅读 我发现其实并不是 其实就像走夜路 没有光明,第一次都是恐惧 但是如果走的次数多了 或者静下心来去克制恐惧 也许就会驾轻就熟或者等到黎 ...

随机推荐

  1. 【VMware VCF】VMware Cloud Foundation Part 03:准备 Excel 参数表。

    VMware Cloud Foundation 使用 VMware Cloud Builder 工具完成自动化以及标准化的部署,除了要准备必须的用于部署管理域并运行管理相关组件的 ESXi 主机以外, ...

  2. 搭建lnmp环境-nginx(第一步)

    建议: 本次lnmp采用yum形式安装,编译安装过于繁琐,操作不好还不如yum安装,所以不推荐. 全部安装在宿主机上,如果需要安装多个版本的软件才使用docker nginx无所谓版本了 刚安装好系统 ...

  3. 【Oracle】SQL笔记

    与MySQL的区分 https://www.cnblogs.com/bailing80/p/11440927.html 获取当前系统时间 -- 查询当前系统时间,DUAL为一张临时表 SELECT S ...

  4. 【Java】【常用类】Date 日期类

    java.util.Date java.sql.Date 创建日期对象和打印结果 public class DateTest { public static void main(String[] ar ...

  5. 人形机器人(humanoid)(双足机器人、四足机器人) —— 硬件测试的方法

    硬件测试的方法: 硬件的稳定性.鲁棒性.为机器人设定好固有的执行策略,然后长时间的让机器人重复执行这些既定好的动作.该种测试方法主要测试硬件的设计是否合理,硬件在长时间的运行中是否可以稳定运行而不是出 ...

  6. conda报错、anconda报错:requests.exceptions.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

    anconda报错,报错信息: requests.exceptions.JSONDecodeError: Expecting value: line 1 column 1 (char 0) 不能使用c ...

  7. 向日葵的平替:fastnat的使用

    相关: 向日葵的平替:一款个人开发的远程工具--fastnat ---------------------------------------------- 1. 下载安装 2. 注册设备 我这里在两 ...

  8. AMiner的数据质量和完善问题

    最近参加到了一个国家科技项目中,这里就不吐槽这种高校承接国家科技项目是一件多么不靠谱的事情了,这里就说说我们的对标产品"AMiner".补充一下,虽然个人对AMiner的评价不是很 ...

  9. 从零到一:用Go语言构建你的第一个Web服务

    使用Go语言从零开始搭建一个Web服务,包括环境搭建.路由处理.中间件使用.JSON和表单数据处理等关键步骤,提供丰富的代码示例. 关注TechLead,复旦博士,分享云服务领域全维度开发技术.拥有1 ...

  10. FAT32和NTFS文件系统的区别

    文件系统对于在计算设备上运行至关重要. 因此,选择正确的文件系统变得很重要. FAT32 和 NTFS 是两个具有显着差异的文件系统. 1.磁盘分区容量区别 NTFS可以支持的分区(如果采用动态磁盘则 ...