首页 > 其他分享 >Docker数据共享与持久化(六)

Docker数据共享与持久化(六)

时间:2022-12-27 10:37:02浏览次数:69  
标签:容器 持久 数据共享 目录 nginx 挂载 Docker 数据 docker

接下来介绍如何在 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/ 如发现有错,请留言,谢谢)

标签:容器,持久,数据共享,目录,nginx,挂载,Docker,数据,docker
From: https://www.cnblogs.com/zhangyongli2011/p/17007492.html

相关文章

  • Docker基本操作(端口?网络模式?)(五)
    一、端口暴露Docker容器更多情况下是用来运行Web应用的,所以要如何访问到容器中的Web服务呢?比如我们现在运行一个nginx容器服务:$dockerrun--namewebserver-d......
  • Linux环境下docker安装nginx及其配置
    安装一、获取镜像在线安装直接执行命令:dockerpullnginx:1.22.1需要指定版本,可以进入官网https://hub.docker.com/,搜索nginx查看仓库中的版本离线安装本地pull下......
  • Docker基本操作(镜像操作?容器操作?)(四)
    Docker的基本原理我们已经了解了,也已经安装上了,接下来我们就一起来学习下Docker的常用操作,实际上主要就是DockerCLI的一些常用命令使用。一、镜像操作之前我们提......
  • Docker安装(安装Docker-CE)(三)
    现版本安装Docker已经非常简单了,有很多种方式,而自17年开始,Docker分为Docker-CE(社区版)、Docker-EE(企业版),另外Docker-IO是较早的版本,通常用的都是Docker-CE版;目前CentOS内......
  • 支持Docker的底层技术(Namespaces?CGroups?UnionFS?Docker 架构?)(二)
    上一篇介绍了Docker基本概念,这一篇介绍下支持Docker的底层技术Docker本质就是宿主机的一个特殊进程,Docker是通过namespace实现资源隔离,通过cgroup实现资源限制,通过......
  • Docker基本概念(LXC?镜像、容器、仓库是什么?容器和虚拟机又是什么?)(一)
    学习Docker前,我们有必要了解下Docker的前生LXC(LinuxContainer)。一、LXC介绍LXC可以提供轻量级的虚拟化,用来隔离进程和资源,和我们传统观念中的全虚拟化完全不一样,非常轻......
  • docker 常用命令大全
    参考地址:https://blog.csdn.net/leilei1366615/article/details/106267225文章目录(一)docker基础命令(二)docker镜像命令(三)docker容器命令(四)自己提交一个镜像(五)docker运......
  • Docker容器与Docker网络模式
    一、Docker容器操作1、容器创建将镜像加载到容器的过程。新创建的容器默认处于停止状态,不运行任何程序,需要在其中发起一个进程来启动容器1234567格式......
  • Docker资源控制及数据管理
    一、CPU资源控制1、cgroups概述是一个非常强大的linux内核工具,他不仅可以限制被namespace隔离起来的资源,还可以为资源设置权重、计算使用量、操控进程启停等等,所以cgrou......
  • ubuntu 22.04安装docker后无法启动的问题
    在安装Docker后无法启动,查看Docker的日志vim/var/log/docker.log显示如下的错误time="2022-12-27T00:36:54.741331300+08:00"level=infomsg="stoppingeventstreamfo......