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应用:
[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:
[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 , 说明我们添加数据卷成功 使用
docker inspect
,可以结合grep -A和-B
选项,它们分别用于显示匹配行之后和之前的行, 可以查看容器信息获知挂载数据卷情况:
[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 镜像名
[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的容器:
[root@hadoop104 ~]# docker run -it --name="u1" -v /tmp/u:/tmp/u ubuntu
新启一个终端,启动u2:
[root@hadoop104 ~]# docker run -it --name="u2" --volumes-from u1 ubuntu
在u1中创建u1Data.txt
root@d56a0021bf57:/# cd /tmp/u/
root@d56a0021bf57:/tmp/u# touch u1Data.txt
查看u2中/tmp/u/目录:
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