docker 容器挂载 volume 的目录权限问题

2020-02-10 16:05:07 +08:00
 programV2
抱歉又来打扰 V 友, 想把 php 搭的网站迁移到 docker 上, 如果把主机上的目录 ./project/web 挂载进容器中: /var/www/html/ , 请问这样的话主机上的目录 ./project/web 权限该如何设置呢? 是否也应该把 ower 改成 www-data 呢? 如下:
chown -R www-data:www-data ./project/web
5202 次点击
所在节点    程序员
18 条回复
phy25
2020-02-10 16:06:57 +08:00
这个权限取决于你用的是什么容器的亲亲。
momocraft
2020-02-10 16:09:41 +08:00
改成 **容器内的** 相应用户的 UID (数字)。同一 UID 数字在容器内外的用户名可能不同。
programV2
2020-02-10 16:29:41 +08:00
@phy25 谢谢回复! 我用的容器是 drupal:8.5.5-fpm-alpine, drupal8 在 ubuntu 上搭建的话用户权限 owner 要设置为 www-data, 装进容器后是不是也是 www-data?
@momocraft 谢谢. 我主要的困惑是 drupal8 在 ubuntu 上搭建的话用户权限 owner 要设置为 www-data, 装进容器后是不也是 www-data?
jinliming2
2020-02-10 19:42:38 +08:00
理论上不需要设置权限,把目录挂载进 docker 之后,挂载的目录会在容器启动时被设置为容器中启动时用户的权限。
anguiao
2020-02-10 19:54:23 +08:00
容器里面 www-data 的 UID 不一定和容器外面的一样,要把 UID 设置成一样的才行。
litanid
2020-02-10 19:57:16 +08:00
我是把容器里 wwwdata 的 uid 改成外面用户一样
programV2
2020-02-10 20:14:31 +08:00
@jinliming2 不行, 我试过安装网站时报错提示没权限

@litanid@anguiao 谢谢! 那我直接 id命令查看www-data的 UID 和 GID , 如果不一样, 再用 usermod groupmod 把主机上的用户 改成跟容器里的一样, 就行了吧? 改里面或者外面 的 uid 应该没区别吧?
saytesnake
2020-02-10 21:46:53 +08:00
最近用的几个镜像都很巧 UID 是 1001,实际上很简单,看下 Dockerfile 怎么写的,一般是定义用户名或直接就是 UID,随后起一个容器,进去看下指定用户的 UID 是多少就可以了。
litanid
2020-02-10 22:37:28 +08:00
@programV2 个人感觉还是改容器里的好点,外面牵扯太多,不方便。
programV2
2020-02-10 23:02:56 +08:00
@litanid 谢谢 V 友回复!我刚查了下容器外的 www-data 是
uid=33(www-data) gid=33(www-data) groups=33(www-data)

而容器内 www-data 是
uid=82(www-data) gid=82(www-data) groups=82(www-data),82(www-data)

我只要改 uid 和 gid 就可以了吗? 后面的 groups=82(www-data),82(www-data) 不用管他吗?

另外想请问我容器外主机上部署容器是用 root 用户, 容器内运行用户默认也是 root, 这样有什么安全风险? 除了把挂载主机目录./project/web 的 owner 改成 www-data 及 chmod -R 755 ./project/web 外该如何加固?        

@saytesnake
litanid
2020-02-11 03:26:45 +08:00
我的本来意思是说把容器里 wwwdata 的 uid 和 gid,改成主机目录常用用户非 root 的 uid 和 gid,而不是主机的 wwwdata,这样主机常用用户可以随意更改目录内容。
saytesnake
2020-02-11 15:28:26 +08:00
@programV2 跟容器外(即主机)的用户与组没有任何关系...你直接 chown -R 82.82 /project/web 就可以了。
programV2
2020-02-11 17:02:09 +08:00
@litanid 谢谢 V 友指点! 请问 1.我现在在主机新建普通用户 foo: useradd -m -s -u 2005 -g 2005 foo , 我建了 3 个 docker 容器:Nginx,Drupal, MySQL, 其中 Nginx 和 Drupal 容器都是挂载到 ./project/web , 这样我是不是需要同时改这两个容器的 uid gid? 分别进这两个容器执行下列命令吗?

usermod -u 2005 www-data
groupmod -g 2005 www-data
find / -user 82 -exec chown -h www-data {} \;
find / -group 82 -exec chgrp -h www-data {} \;

2. 改完 uid gid 后我在主机上执行 chmod -R 755 ./project/web 及 chown -R foo:foo ./project/web
为了减少网站被黑掉或挂马的危险, 还有什么地方该加固的吗? 我主机已经改成证书登陆了. 谢谢 V 友指点!
programV2
2020-02-11 17:17:57 +08:00
@saytesnake 谢谢V友指点! 我建了 3 个 docker 容器:Nginx,Drupal, MySQL, 其中 Nginx 和 Drupal 容器都是挂载到 ./project/web , 直接 chown -R 82.82 /project/web 那我 nginx 容器不就无法访问这个数据卷了吗 ? 刚进 nginx 容器发现没有 www-data 这个用户名,请问 nginx 服务访问 /project/web 用的是哪个用户名?


@litanid V 友,我刚进 nginx 容器发现没有 www-data 这个用户名,请问 nginx 服务访问 /project/web 用的是哪个用户名?
programV2
2020-02-11 17:30:43 +08:00
@litanid
@saytesnake 我 docker-compose.yml 部分设置如下
version: "3"
services:
nginx:
image: nginx:$NGINX_TAG
container_name: "${PROJECT_NAME}_nginx"
ports:
- $NGINX_PORTA

volumes:
- "./drupal/web:/var/www/html"
- "./drupal/logs/nginx:/var/log/nginx"
- "./drupal/nginx/nginx.conf:/etc/nginx/conf.d/default.conf"
- "./drupal/cloudflare:/etc/ssl"
depends_on:
- php

drupal:
image: drupal:$DRUPAL_TAG
container_name: "${PROJECT_NAME}_drupal"
volumes:
- "./drupal/web:/var/www/html"
- "./drupal/mysql:/var/lib/mysql"
restart: always
depends_on:
- mysql
programV2
2020-02-11 21:21:43 +08:00
@anguiao 谢谢 ! 请问 1.我现在在主机新建普通用户 foo: useradd -m -s -u 2005 -g 2005 foo , 我建了 3 个 docker 容器:Nginx,Drupal, MySQL, 其中 Nginx 和 Drupal 容器都是挂载到 ./project/web , 这样我是不是需要同时改这两个容器的 uid gid? 分别进这两个容器执行下列命令吗?

usermod -u 2005 www-data
groupmod -g 2005 www-data
find / -user 82 -exec chown -h www-data {} \;
find / -group 82 -exec chgrp -h www-data {} \;

ps: 我刚进 nginx 容器发现没有 www-data 这个用户名,请问 nginx 服务访问 /project/web 用的是哪个用户名?

2. 改完 uid gid 后我在主机上执行 chmod -R 755 ./project/web 及 chown -R foo:foo ./project/web
为了减少网站被黑掉或挂马的危险, 还有什么地方该加固的吗? 我主机已经改成证书登陆了. 谢谢 V 友指点!
cdlnls
2020-02-12 00:04:46 +08:00
我个人觉得没必要关心容器里面的用户权限,关心这个,还不如关心程序有没有问题。
看一下服务器开放了什么端口,不必要的可以关掉,常用的端口可以改改。然后都设置复杂密码。
programV2
2020-02-13 15:22:46 +08:00
@cdlnls 谢谢大佬回复 !端口和密码我都加固了, 之前安装网站时赶时间运行了 chmod -R 777, 现在是想把网站源码文件夹的 owner 改为 www-data 用户, 我刚进 nginx 容器发现没有 www-data 这个用户名,请问 nginx 服务访问 /project/web 用的是哪个用户名?



1.主机建了 3 个 docker 容器:Nginx,Drupal, MySQL, 其中 Nginx 和 Drupal 容器都是挂载到 ./project/web , 这样我是不是需要同时改这两个容器的 uid gid? 我现在在主机新建普通用户 foo: useradd -m -s -u 2005 -g 2005 foo , 还要分别进这两个容器执行下列命令吗?

usermod -u 2005 www-data
groupmod -g 2005 www-data
find / -user 82 -exec chown -h www-data {} \;
find / -group 82 -exec chgrp -h www-data {} \;




我 docker-compose.yml 部分设置如下
version: "3"
services:
nginx:
image: nginx:$NGINX_TAG
container_name: "${PROJECT_NAME}_nginx"
ports:
- $NGINX_PORTA

volumes:
- "./drupal/web:/var/www/html"
- "./drupal/logs/nginx:/var/log/nginx"
- "./drupal/nginx/nginx.conf:/etc/nginx/conf.d/default.conf"
- "./drupal/cloudflare:/etc/ssl"
depends_on:
- php

drupal:
image: drupal:$DRUPAL_TAG
container_name: "${PROJECT_NAME}_drupal"
volumes:
- "./drupal/web:/var/www/html"
- "./drupal/mysql:/var/lib/mysql"
restart: always
depends_on:
- mysql

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/643498

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX