docker本身是轻量级容器,和宿主机公用一个内核,默认情况下容器内部的uid和宿主机uid是相互映射的,这样就造成,如果在容器使用root账号,那么相当于同时拥有了宿主机的权限,显然这是不安全的 如果要解决这个隐患,有两种方法,重点将第一种:
- docker借助于linux的user namepsace提供了用户映射,默认情况下是关闭的如果要开启需要编辑文件
/etc/docker/daemon.json
,添加 userns-remap属性,默认情况下可以指定default,这个时候会在/etc/subuid
、/etc/subgid
生成dockremap的namespace,当然也可以自己指定一个自己的,举例:{ "userns-remap": "www" }
查看subuid和subgid对应的虚拟id为:
www:100000:65536
这个表示如果www映射了从100000开始到165536这些用户 接下来,我们启动一个容器,以php-fpm为例,默认php-fpm在容器内部,查看用户的id[root@zhaoxiaohe ~]# docker exec -it c55356ca815a /bin/bash root@c55356ca815a:/var/www# id uid=0(root) gid=0(root) groups=0(root)
当我们生成一个文件,此时在容器内部显示的root权限
root@c55356ca815a:/var/www/laradock/wwwroot# echo test > docker.test root@c55356ca815a:/var/www/laradock/wwwroot# ls -l total 8 drwxr-xr-x 2 www-data www-data 25 Aug 21 09:15 default -rw-r--r-- 1 root root 5 Sep 12 02:32 docker.test drwxr-xr-x 6 www-data www-data 4096 Sep 12 02:28 wordpress
但是在宿主机的话会显示,是一个映射出来的uid
[root@zhaoxiaohe wwwroot]# ls -l total 8 drwxr-xr-x 2 101000 101000 25 Aug 21 17:15 default -rw-r--r-- 1 100000 100000 5 Sep 12 10:32 docker.test drwxr-xr-x 6 101000 101000 4096 Sep 12 10:28 wordpress
这样就防止了容器和宿主机一对一的用户相互映射 当有的容器需要使用的root权限的是,需要在docker-compose.yml设置userns_mode: “host”
- 容器启动的时候指定user, 格式为
docker --user uid<:gid>
0 Comments