V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
programV2
V2EX  ›  程序员

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

  •  
  •   programV2 · 2020-02-10 16:05:07 +08:00 · 5172 次点击
    这是一个创建于 1759 天前的主题,其中的信息可能已经有所发展或是发生改变。
    抱歉又来打扰 V 友, 想把 php 搭的网站迁移到 docker 上, 如果把主机上的目录 ./project/web 挂载进容器中: /var/www/html/ , 请问这样的话主机上的目录 ./project/web 权限该如何设置呢? 是否也应该把 ower 改成 www-data 呢? 如下:
    chown -R www-data:www-data ./project/web
    18 条回复    2020-02-13 15:22:46 +08:00
    phy25
        1
    phy25  
       2020-02-10 16:06:57 +08:00 via Android
    这个权限取决于你用的是什么容器的亲亲。
    momocraft
        2
    momocraft  
       2020-02-10 16:09:41 +08:00
    改成 **容器内的** 相应用户的 UID (数字)。同一 UID 数字在容器内外的用户名可能不同。
    programV2
        3
    programV2  
    OP
       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
        4
    jinliming2  
       2020-02-10 19:42:38 +08:00 via iPhone
    理论上不需要设置权限,把目录挂载进 docker 之后,挂载的目录会在容器启动时被设置为容器中启动时用户的权限。
    anguiao
        5
    anguiao  
       2020-02-10 19:54:23 +08:00
    容器里面 www-data 的 UID 不一定和容器外面的一样,要把 UID 设置成一样的才行。
    litanid
        6
    litanid  
       2020-02-10 19:57:16 +08:00 via Android
    我是把容器里 wwwdata 的 uid 改成外面用户一样
    programV2
        7
    programV2  
    OP
       2020-02-10 20:14:31 +08:00
    @jinliming2 不行, 我试过安装网站时报错提示没权限

    @litanid@anguiao 谢谢! 那我直接 id命令查看www-data的 UID 和 GID , 如果不一样, 再用 usermod groupmod 把主机上的用户 改成跟容器里的一样, 就行了吧? 改里面或者外面 的 uid 应该没区别吧?
    saytesnake
        8
    saytesnake  
       2020-02-10 21:46:53 +08:00 via Android
    最近用的几个镜像都很巧 UID 是 1001,实际上很简单,看下 Dockerfile 怎么写的,一般是定义用户名或直接就是 UID,随后起一个容器,进去看下指定用户的 UID 是多少就可以了。
    litanid
        9
    litanid  
       2020-02-10 22:37:28 +08:00 via Android
    @programV2 个人感觉还是改容器里的好点,外面牵扯太多,不方便。
    programV2
        10
    programV2  
    OP
       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
        11
    litanid  
       2020-02-11 03:26:45 +08:00 via Android
    我的本来意思是说把容器里 wwwdata 的 uid 和 gid,改成主机目录常用用户非 root 的 uid 和 gid,而不是主机的 wwwdata,这样主机常用用户可以随意更改目录内容。
    saytesnake
        12
    saytesnake  
       2020-02-11 15:28:26 +08:00
    @programV2 跟容器外(即主机)的用户与组没有任何关系...你直接 chown -R 82.82 /project/web 就可以了。
    programV2
        13
    programV2  
    OP
       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
        14
    programV2  
    OP
       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
        15
    programV2  
    OP
       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
        16
    programV2  
    OP
       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
        17
    cdlnls  
       2020-02-12 00:04:46 +08:00 via iPhone
    我个人觉得没必要关心容器里面的用户权限,关心这个,还不如关心程序有没有问题。
    看一下服务器开放了什么端口,不必要的可以关掉,常用的端口可以改改。然后都设置复杂密码。
    programV2
        18
    programV2  
    OP
       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
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3502 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 11:14 · PVG 19:14 · LAX 03:14 · JFK 06:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.