docker数据卷权限管理--理论和验证

一、Docker容器中用户权限管理
Linux系统的权限管理是由uid和gid负责,Linux系统会检查创建进程的uid和gid,以确定它是否有足够的权限修改文件,而非是通过用户名和用户组来确认。

同样,在docker容器中主机上运行的所有容器共享同一个内核也可以理解为共享权限管理方式。

在volume挂载目录时默认属于root用户,如果没有chown给其他用户的话,在Volume卷中创建的文件和文件夹将拥有与在容器中的卷相同的uid:gid(数字)。

1.1、容器启动的权限规则
容器启动的时候,容器中的用户
没有指定用户:默认使用root
指定用户:使用指定用户
1.2、 namespace隔离技术
namespace隔离技术:docker容器内部依然是以"root"的权限管理,但实际只有普通用户的权限,从而达到权限隔离的效果。

1.3、如果在容器内对挂载目录下的文件进行了操作,则相应文件的所有者就会升级为root,如果容器中只有非root用户的权限,就无法对这些文件进行操作了。

如果在容器内对挂载目录下的文件进行了操作,则相应文件的所有者就会升级为root,如果容器中只有非root用户的权限,就无法对这些文件进行操作了。

二,我们这里使用elasticsearch作为案例
构成镜像的dockerfile
我们创建了es用户
启动cmd命令是通过es用户启动的


FROM centos:7.7.1908
# 创建者 
MAINTAINER HuiDian <www.smartdot.com.cn> 

COPY elasticsearch-7.4.2-linux-x86_64.tar.gz /home

COPY elasticsearch-analysis-ansj-7.4.2.0-release.zip /home

COPY elasticsearch.yml /home 

COPY jvm.options /home 



 
ENV JAVA_HOME /docker/elasticsearch-7.4.2/jdk
 
RUN mkdir -p /docker/ &&\  
	yum install -y unzip zip lrzsz vim &&\  
	# 解压
	mv /home/elasticsearch-7.4.2-linux-x86_64.tar.gz /docker/  &&\ 
	cd /docker &&\ 
	tar -zxvf elasticsearch-7.4.2-linux-x86_64.tar.gz     &&\ 
	# ansj 分词器 解压到指定目录
	unzip /home/elasticsearch-analysis-ansj-7.4.2.0-release.zip -d  /docker/elasticsearch-7.4.2/plugins/ansj  &&\    
	# 添加配置文件
	mv /home/elasticsearch.yml /docker/elasticsearch-7.4.2/config/ &&\     
	mv /home/jvm.options /docker/elasticsearch-7.4.2/config/ &&\   
	# 创建es用户
	useradd es && chown -R es:es /docker/elasticsearch-7.4.2   &&\      
	# 删掉安装包
	rm -rf /docker/elasticsearch-7.4.2-linux-x86_64.tar.gz  &&\  
	rm -rf /home/elasticsearch-analysis-ansj-7.4.2.0-release.zip

# cmd,run命令使用es用户启动	
USER es
EXPOSE 9200
EXPOSE 9300
CMD "/docker/elasticsearch-7.4.2/bin/elasticsearch"

当不使用数据卷启动后
容器中的用户是es
/docker/elasticsearch-7.4.2/data 的用户也是es
容器正常启动

docker run -d \
	--name elasticsearch \
	-p 9200:9200   \
	-p 9300:9300   \
	elasticsearch_huidian:7.4.2 

我们查看一下未挂载数据卷时候的目录权限和当前用户

docker rm -f elasticsearch
docker run -id --name=elasticsearch elasticsearch_huidian:7.4.2
docker exec -it elasticsearch  bash    -c "whoami && id"
docker exec -it elasticsearch  bash   -c "ls -la /docker/elasticsearch-7.4.2/data"

在这里插入图片描述
当使用数据卷启动后,启动失败
启动容器


docker rm -f elasticsearch

docker run -d --name elasticsearch  -p 9200:9200  -p 9300:9300  -v /home/hd/docker/elasticsearch/data:/docker/elasticsearch-7.4.2/data  elasticsearch_huidian:7.4.2

docker ps -a 

我们查看挂载数据卷时候的目录权限和当前用户

docker rm -f elasticsearch

docker run -it --name=elasticsearch -v /home/hd/docker/elasticsearch/data:/docker/elasticsearch-7.4.2/data  elasticsearch_huidian:7.4.2  bash  -c "whoami && id"

docker rm -f elasticsearch
docker run -it --name=elasticsearch -v /home/hd/docker/elasticsearch/data:/docker/elasticsearch-7.4.2/data  elasticsearch_huidian:7.4.2  bash -c "ls -la /docker/elasticsearch-7.4.2/data"

在这里插入图片描述

说明
当容器启动的时候,如果容器要对数据卷的主机目录进行修改或者添加,那么会将权限提升为root。也就是说/docker/elasticsearch-7.4.2/data目录和nodes目录会将es的权限提升为root,也就是当前我们看到的。

启动失败说明
当"es"用户的进程访问"/docker/elasticsearch-7.4.2/data"目录时,没有root权限,会出现 Permission denied的问题。

宿主机上的数据卷目录
当前路径下"data"目录的拥有者是"root",这是因为这个目录是Docker进程缺省创建出来的。

如果容器要对数据卷的主机目录进行修改或者添加,那么会将权限提升为root。导致失败,应该怎么处理?
方式1–修改数据卷权限
把当前目录的拥有者赋值给uid 1000,再启动"elasticsearch"容器就一切正常了

chown -R 1000:1000 /home/hd/docker/elasticsearch/data


docker rm -f elasticsearch

docker run -d --name elasticsearch  -p 9200:9200  -p 9300:9300  -v /home/hd/docker/elasticsearch/data:/docker/elasticsearch-7.4.2/data  elasticsearch_huidian:7.4.2

docker ps -a 

当我们再进入容器内部查看"/home/hd/docker/elasticsearch/data"目录的权限,其拥有者已经变成 “es”

在宿主机上我们看到的"data"目录的拥有者是"hd",这是因为"hd"用户的uid是1000。

而容器中es用户的uid也是1000,说明hd和es本质是同一个用户
docker exec -it elasticsearch bash -c “ls -la /docker/elasticsearch-7.4.2/data”

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于 Docker 数据的进阶篇,我可以为你提供以下内容: 1. 数据的类型 Docker 数据有三种类型:主机挂载、匿名、命名。其中,主机挂载是将主机上的目录挂载到容器中;匿名是在容器内部创建的临时;命名则是给起一个名字,并将其保存在 Docker 数据存储区中。 2. 数据的备份与恢复 我们可以使用 Docker Compose 中的 `docker-compose.yml` 文件来定义数据的备份和恢复。具体方法是,在 `volumes` 字段中定义及其备份路径,然后在 `services` 字段中指定容器和对应的名称。 例如: ``` version: "3" services: db: image: mysql volumes: - db_data:/var/lib/mysql command: --default-authentication-plugin=mysql_native_password backup: image: backup volumes: - /path/to/backup:/backup - db_data:/data/db command: backup.sh volumes: db_data: ``` 以上代码中,我们定义了一个 `db` 服务和一个 `backup` 服务。其中,`db` 服务使用了名为 `db_data` 的命名,并挂载到容器的 `/var/lib/mysql` 目录中;`backup` 服务则使用了两个,一个是挂载到宿主机上的 `/path/to/backup` 目录,用于保存备份文件;另一个是使用了 `db_data` 命名,并挂载到容器的 `/data/db` 目录中,用于备份数据。最后,我们在 `backup` 服务中执行了备份脚本 `backup.sh`。 3. 数据的共享 我们可以将一个数据挂载到多个容器中,实现数据的共享。例如,我们可以将一个命名挂载到 `web` 和 `db` 两个服务中,这样它们就可以共享数据了。 ``` version: "3" services: web: image: nginx volumes: - web_data:/usr/share/nginx/html db: image: mysql volumes: - db_data:/var/lib/mysql - web_data:/var/www/html volumes: db_data: web_data: ``` 以上代码中,我们定义了一个 `web` 服务和一个 `db` 服务。其中,`web` 服务使用了名为 `web_data` 的命名,挂载到容器的 `/usr/share/nginx/html` 目录中;`db` 服务则使用了 `db_data` 和 `web_data` 两个,分别挂载到容器的 `/var/lib/mysql` 和 `/var/www/html` 目录中,实现了数据的共享。 希望以上内容能够对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值