Skip to content

Docker容器数据卷

以下场景需要Docker满足需求:

  • 将运用与运行的环境打包形成容器运行 ,运行可以伴随着容器,但是我们对数据的要求希望是持久化的。
  • 容器之间希望有可能共享数据。

1. 数据卷概述

卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性。卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。

Docker挂载主机目录访问出现报错cannot open directory.:Permission denied

解决办法:在挂载目录后多加一个--privileged=true参数即可。原因在于CentOs7安全模块会比之前系统版本加强,不安全的会先禁止,所以目录挂载的情况被默认为不安全的行为,在SELinux里面挂载目录被禁止掉了,如果要开启,我们一般使用-pivileged=tue命令,扩大容器的权限解决挂载目录没有权限的问题,也即使用该参数,container内的root拥有真正的root权限,否则container内的root只是外部的一个普通用户权限。

2. 添加数据卷

格式: docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
将容器中的tomcat的webapps目录暴露出来,在宿主机的/tmp/webapps目录下存放web应用:

sh
[root@hadoop104 ~]# docker run -d -v /tmp/webapps:/usr/local/tomcat/webapps/ -p 80:8080 tomcat:9.0.93-jdk8
27704bc629941bdb9896b2af26685f12c42b158d53ce45b50d02a7d4bd4ecb57
[root@hadoop104 ~]# docker ps
CONTAINER ID   IMAGE                COMMAND                   CREATED         STATUS         PORTS                                       NAMES
27704bc62994   tomcat:9.0.93-jdk8   "catalina.sh run"         5 seconds ago   Up 3 seconds   0.0.0.0:80->8080/tcp, :::80->8080/tcp       pensive_bassi
d3a0010f4aa0   registry             "/entrypoint.sh /etc…"   13 hours ago    Up 13 hours    0.0.0.0:5000->5000/tcp, :::5000->5000/tcp   nervous_mahavira

验证添加数据卷成功, 在/tmp/webapps目录下创建demo文件夹,并编写index.html:

sh
[root@hadoop104 tmp]# cd webapps/
[root@hadoop104 webapps]# ll
总用量 0
[root@hadoop104 webapps]# mkdir demo
[root@hadoop104 webapps]# cd demo
[root@hadoop104 demo]# vi index.html
[root@hadoop104 demo]# cat index.html
<html>
<head>
<meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <title>首页</title>
</head>
<body>
<h1>Hello Docker</h1>
</body>
</html>

访问http://hadoop104/demo , 说明我们添加数据卷成功 Alt text 使用docker inspect,可以结合grep -A和-B选项,它们分别用于显示匹配行之后和之前的行, 可以查看容器信息获知挂载数据卷情况:

sh
[root@hadoop104 demo]# docker inspect 27704bc62994 |  grep -A 10 "Mounts"
        "Mounts": [
            {
                "Type": "bind",
                ## 源路径
                "Source": "/tmp/webapps",
                ## 目标
                "Destination": "/usr/local/tomcat/webapps",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
        "Config": {

3. 数据卷读写权限配置

如果需要容器内部被限制,只能读取不能写,就需要设置数据卷的权限。
格式: docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名

sh
[root@hadoop104 ~]# docker run -it --name="u1" -v /tmp/u:/tmp/u:ro ubuntu
root@ac2fd4ca1bf4:/# cd /tmp/u
root@ac2fd4ca1bf4:/tmp/u# mkdir test
mkdir: cannot create directory 'test': Read-only file system
root@ac2fd4ca1bf4:/tmp/u# touch test
touch: cannot touch 'test': Read-only file system

4. 数据卷的继承和共享

格式: docker run -it --volumes-from 容器名 镜像名
让容器u1和容器u2共享同一个目录, 先启动名叫u1的容器:

sh
[root@hadoop104 ~]# docker run -it --name="u1" -v /tmp/u:/tmp/u ubuntu

新启一个终端,启动u2:

sh
[root@hadoop104 ~]# docker run -it --name="u2" --volumes-from u1 ubuntu

在u1中创建u1Data.txt

sh
root@d56a0021bf57:/# cd /tmp/u/
root@d56a0021bf57:/tmp/u# touch u1Data.txt

查看u2中/tmp/u/目录:

sh
root@277661b56523:/tmp/u# ll
total 0
drwxr-xr-x. 2 root root 24 Oct 21 14:24 ./
drwxrwxrwt. 1 root root 15 Oct 21 14:24 ../
-rw-r--r--. 1 root root  0 Oct 21 14:24 u1Data.txt