Управление разрешениями на объемы данных Docker — теория и проверка

1. Управление правами пользователей в контейнерах Docker.
Управление разрешениями в системе Linux осуществляется с помощью uid и gid. Система Linux проверит uid и gid созданного процесса, чтобы определить, имеет ли он достаточные разрешения для изменения файла, а не через имя пользователя и группу пользователей для подтверждения.

Аналогично, в Docker-контейнере все контейнеры, работающие на хосте, используют одно и то же ядро, что также можно понимать как общий метод управления разрешениями.

Когда том монтирует каталог, он по умолчанию принадлежит пользователю root. Если он не доступен другим пользователям, файлы и папки, созданные в томе тома, будут иметь тот же uid:gid (номер), что и том в контейнере. .

1.1.Правила разрешения на запуск контейнера.При
запуске контейнера пользователь в контейнере
не указывает пользователя: по умолчанию используется root.Заданный
пользователь: использует указанный пользователь.1.2.Технология
изоляции пространства
имен.Технология изоляции пространства имен: внутри докер-контейнера по-прежнему управляются права «root», но на самом деле достигаются только разрешения обычных пользователей, тем самым достигается эффект изоляции разрешений.

1.3. Если файлы в смонтированном каталоге используются в контейнере, владелец соответствующих файлов будет повышен до root. Если контейнер имеет права только пользователей без полномочий root, эти файлы не могут работать.

Если файл в смонтированном каталоге используется внутри контейнера, владелец соответствующего файла будет повышен до root. Если контейнер имеет разрешения только для пользователей без полномочий root, эти файлы не могут работать.

Во-вторых, в данном случае мы используем elasticsearch. Мы создали пользователя es
для файла dockerfile, составляющего образ. Команда запуска 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"

Вставьте сюда описание изображения

Примечание.
Если при запуске контейнера он хочет изменить или добавить каталог хоста тома данных, права будут повышены до корневого. Другими словами, каталог /docker/elasticsearch-7.4.2/data и каталог узлов повысят права доступа es до root, что мы и видим сейчас.

Описание ошибки запуска.
Когда процесс пользователя «es» обращается к каталогу «/docker/elasticsearch-7.4.2/data» без прав root, возникает проблема «Отказано в доступе».

Каталог тома данных на хосте.
Владельцем каталога «данные» по текущему пути является «root», поскольку этот каталог по умолчанию создается процессом Docker.

Если контейнер хочет изменить или добавить каталог хоста тома данных, права будут повышены до корневого. Что делать, если это приводит к сбою?
Способ 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», поскольку uid пользователя «hd» равен 1000.

Uid пользователя es в контейнере также равен 1000, что указывает на то, что hd и es по сути являются одним и тем же пользователем
docker exec -it elasticsearch bash -c "ls -la /docker/elasticsearch-7.4.2/data"

おすすめ

転載: blog.csdn.net/jialiu111111/article/details/131666525