Docker容器数据卷

igxiaoshan Lv5

docker容器数据卷是什么

1
2
3
卷,就是目录或者文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续或共享数据的特性

卷的设计目的就是数据的持久化,完全独立于容器的生命周期,因此docker不会在容器删除时删除其挂载的数据卷

docker容器卷有点类似于Redis里面的rdb和aof文件;将docker容器内的数据保存进宿主机的磁盘中

  • 运行一个带有容器卷村粗功能的容器实例
1
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名

–privileged=true

1
2
3
4
5
docker挂载主机目录访问如果出现"cannot open directory.:Permission denied"
解决方法: 在挂载目录后多加一个 --privileged=true 参数即可


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

docker容器数据卷能干什么

1
2
3
4
5
6
7
8
9
将应用与运行的环境打包镜像,run后形成容器实例运行,但是我们对数据的要求希望是持久化的

Docker容器产生的数据,如果不备份,那么当容器实例删除后,容器内的数据自然也就没有了;为了能保存在docker容器中的数据,我们使用卷

特点:
1. 数据卷可在容器之间共享或重用数据
2. 卷中的更改可以直接实时生效,快捷-方便
3. 数据卷中的更改不会包含在镜像的更新中
4. 数据卷的生命周期一直持续到没有容器使用它为止
  • 案例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
## 宿主&容器之间映射添加数据容器卷
### 公式
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名

docker run -it --name myu3 --privileged=true -v /mydata/docker/ubuntu/hostData/:/tmp/ubuntuData ubuntu /bin/bash

## 查看容器是否挂载成功
docker inspect 容器ID

"Mounts": [
{
"Type": "bind",
"Source": "/mydata/docker/ubuntu/hostData",
"Destination": "/tmp/ubuntuData",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
]


容器数据卷读写规则映射添加

  • 读写 : rw
1
2
3
4
## 启动命令
docker run -it --privileged=true -v /mydocker/u/:/tmp:rw ubuntu

rw = read + write
  • 只读 : ro

容器实例内部被限制,只能读取,不能写入

1
2
3
4
5
6
## 启动命令
docker run -it --privileged=true -v /mydocker/u:/tmp:ro ubuntu

ro = read + only

### 此时容器只能读取不能写,如果宿主机写入内容,可以同步给容器内,容器可以读取到

容器数据卷的继承和共享

  • 案例 : 实现多容器的数据卷继承和共享

容器一 : 完成和宿主机的映射

1
docker run -it --privileged=true -v /mydocker/u:/tmp --name="u1" ubuntu

容器二 : 继承容器1的卷规则

1
2
3
4
5
## 公式
docker run -it --privileged=true --volumes-from 父类 --name u2 ubuntu

## 启动命令
docker run -it --privileged=true --volumes-from u1 --name u2 ubuntu

案例结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
## 容器启动

[root@CentOS7_001 hostData]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
91f5fd074ff4 ubuntu "/bin/bash" About a minute ago Up About a minute u2
3be843732232 ba6acccedd29 "/bin/bash" About an hour ago Up About an hour u1
[root@CentOS7_001 hostData]#

## u1容器内
root@3be843732232:/# cd /tmp/ubuntuData/
root@3be843732232:/tmp/ubuntuData# ll
total 0
root@3be843732232:/tmp/ubuntuData# touch containerIn.txt
root@3be843732232:/tmp/ubuntuData# ll
total 4
drwxr-xr-x. 2 root root 50 May 29 02:37 ./
drwxrwxrwt. 1 root root 24 May 29 02:34 ../
-rw-r--r--. 1 root root 0 May 29 02:36 containerIn.txt


## u2容器内
root@91f5fd074ff4:/# cd /tmp/ubuntuData/
root@91f5fd074ff4:/tmp/ubuntuData# ll
total 4
drwxr-xr-x. 2 root root 50 May 29 02:37 ./
drwxrwxrwt. 1 root root 24 May 29 03:36 ../
-rw-r--r--. 1 root root 0 May 29 02:36 containerIn.txt
root@91f5fd074ff4:/tmp/ubuntuData# touch u2.txt
root@91f5fd074ff4:/tmp/ubuntuData# ll
total 4
drwxr-xr-x. 2 root root 64 May 29 03:36 ./
drwxrwxrwt. 1 root root 24 May 29 03:36 ../
-rw-r--r--. 1 root root 0 May 29 02:36 containerIn.txt
-rw-r--r--. 1 root root 0 May 29 03:36 u2.txt


## 宿主机外
[root@CentOS7_001 ~]# cd /mydata/docker/ubuntu/hostData/
[root@CentOS7_001 hostData]# ll
总用量 4
-rw-r--r--. 1 root root 0 5月 29 10:36 containerIn.txt
-rw-r--r--. 1 root root 0 5月 29 11:36 u2.txt