容器卷
小坑
报错 : cannot open directory.:Permission denied
解决方案 : 命令后推荐添加 --privileged=true
原因 : CentOS7安全模块会比之前的系统版本加强,不安全的会被禁止,目录挂载的情况默认会被认为是不安全行为,
在SELinux里面挂载目录被禁止掉,如果要开启就需要使用 –privileged=true 命令,扩大容器权限解决。
使用这个参数在容器内的root才真正拥有了root权限,否则容器内的root在外部只是一个普通用户权限
容器卷简介
是什么
数据卷就是目录或文件,存在一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File
System提供的一些用于持续存储或共享数据的特性
什么用
- 完成数据持久化
-
我们使用registry创建私有库的时候,如果容器被关掉,我们将会失去库中内容 这时可以使用容器数据卷做备份
如以下命令 我们使用-v 将本机/usr/local/myregistry/当做备份储存了存到宿主机
docker run -d -p 5000:5000 -v /usr/local/myregistry/:/usr/local/doregistry --privileged=true --name=registry
registry
-
其他小知识
- 数据卷可以字容器之间共享或重用数据
- 卷中的更改可以直接实时生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
容器卷案例
乌班图容器和宿主机的数据共享
# 启动ubuntu容器 并使用数据卷
docker run -it --name myu --privileged=true -v /tmp/host_data:/tmp/docker_data ubuntu bash
# 进入绑定目录
cd /tmp/docker_data
# 创建数据
echo 'hello docker'>a.txt
# 查看数据
cat a.txt
# 返回宿主机 ctl + p + q
cd /tmp/host_data
vim a.txt
# 发现a.txt被同步到了宿主机 我们再插入数据
'hello docker'
# 重新进入容器
docker exec -it myu bash
cd /tmp/docker_data
cat a.txt
'hello world'
'hello docker'
数据卷持久化
# 将刚刚的ubuntu停止
docker stop myu
# 检查是否停止
docker ps
# 启动刚刚的容器
docker start myu
# 进入容器
docker exec -it myu bash
# 查看数据是否还存在
cd /tmp/docker_data
cat a.txt
容器被删除也可复原,只需要run的时候把目录写对就可
启动两个容器目录相同,可以实现数据共享的操作
通过:rw 和 :ro 可以控制容器读写权限
容器卷常用命令
docker inspect 容器id或容器名
在返回数据中查找Mounts就能看到挂载的信息
"Mounts": [
{
"Type": "bind",
"Source": "/tmp/host_data",
"Destination": "/tmp/docker_data",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
读写控制
# 在目录后添加:rw (默认)为读写模式
docker run -it --name myu --privileged=true -v /tmp/host_data:/tmp/docker_data:rw ubuntu bash
# ro 为只读模式
docker run -it --name myu --privileged=true -v /tmp/host_data:/tmp/docker_data:ro ubuntu bash
数据卷的继承
–volumes-from 父类
# 继承myu 跑一个 myu2
docker run -it --privileged=true --volumes-from myu --name myu2 ubuntu
# 自行查看绑定目录 发现文件还有