Docker运行时的用户与组如何管理

发布时间:2022-03-24 17:40:52 作者:iii
来源:亿速云 阅读:604

这篇文章主要介绍了Docker运行时的用户与组如何管理的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Docker运行时的用户与组如何管理文章都会有所收获,下面我们一起来看看吧。

docker 以进程为核心, 对系统资源进行隔离使用的管理工具. 隔离是通过 cgroups (control groups 进程控制组) 这个操作系统内核特性来实现的. 包括用户的参数限制、 帐户管理、 资源(cpu,内存,磁盘i/o,网络)使用的隔离等. docker 在运行时可以为容器内进程指定用户和组. 没有指定时默认是 root .但因为隔离的原因, 并不会因此丧失安全性. 传统上, 特定的应用都以特定的用户来运行, 在容器内进程指定运行程序的所属用户或组并不需要在 host 中事先创建.

进程控制组cgroups主要可能做以下几件事:

与 cgroups(控制进程组) 相关联的概念是 namespaces (命令空间).

命名空间主要有六种名称隔离类型:

虽然新命名空间与其他同级对象隔离, 但其 "父 " 命名空间中的进程仍会看到子命名空间中的所有进程 (尽管具有不同的 pid 编号)。

普通用户 docker run 容器内 root

如 busybox, 可以在 docker 容器中以 root 身份运行软件. 但 docker 容器本身仍以普通用户执行.

考虑这样的情况

echo test | docker run -i busybox cat

前面的是当前用户当前系统进程,后面的转入容器内用户和容器内进程运行.

当在容器内 pid 以1运行时, linux 会忽略信号系统的默认行为, 进程收到 sigint 或 sigterm 信号时不会退出, 除非你的进程为此编码. 可以通过 dockerfile stopsignal signal指定停止信号.

如:

stopsignal sigkill

创建一个 dockerfile

from alpine:latest
run apk add --update htop && rm -rf /var/cache/apk/*
cmd ["htop"]
$ docker build -t myhtop . #构建镜像
$ docker run -it --rm --pid=host myhtop #与 host 进程运行于同一个命名空间

Docker运行时的用户与组如何管理

普通用户 docker run 容器内指定不同用户 demo_user

docker run --user=demo_user:group1 --group-add group2 <image_name> <command>

这里的 demo_user 和 group1(主组), group2(副组) 不是主机的用户和组, 而是创建容器镜像时创建的.

当dockerfile里没有通过user指令指定运行用户时, 容器会以 root 用户运行进程.

docker 指定用户的方式

dockerfile 中指定用户运行特定的命令

user <user>[:<group>] #或
user <uid>[:<gid>]

docker run -u(--user)[user:group] 或 --group-add 参数方式

$ docker run busybox cat /etc/passwd
root:x:0:0:root:/root:/bin/sh
...
www-data:x:33:33:www-data:/var/www:/bin/false
nobody:x:65534:65534:nobody:/home:/bin/false

$ docker run --user www-data busybox id
uid=33(www-data) gid=33(www-data)

docker 容器内用户的权限

对比以下情况, host 中普通用户创建的文件, 到 docker 容器下映射成了 root 用户属主:

$ mkdir test && touch test/a.txt && cd test
$ docker run --rm -it -v `pwd`:/mnt -w /mnt busybox  /bin/sh -c 'ls -al /mnt/*' 
-rw-r--r--  1 root   root       0 oct 22 15:36 /mnt/a.txt

而在容器内卷目录中创建的文件, 则对应 host 当前执行 docker 的用户:

$ docker run --rm -it -v `pwd`:/mnt -w /mnt busybox  /bin/sh -c 'touch b.txt'
$ ls -al
-rw-r--r-- 1 xwx staff  0 10 22 23:36 a.txt
-rw-r--r-- 1 xwx staff  0 10 22 23:54 b.txt

docker volume 文件访问权限

创建和使用卷, docker 不支持相对路径的挂载点, 多个容器可以同时使用同一个卷.

$ docker volume create hello #创建卷

hello

$ docker run -it --rm -v hello:/world -w /world busybox /bin/sh -c 'touch /world/a.txt && ls -al'  #容器内建个文件
total 8
drwxr-xr-x  2 root   root     4096 oct 22 16:38 .
drwxr-xr-x  1 root   root     4096 oct 22 16:38 ..
-rw-r--r--  1 root   root       0 oct 22 16:38 a.txt

$ docker run -it --rm -v hello:/world -w /world busybox /bin/sh -c 'rm /world/a.txt && ls -al' #从容器内删除
total 8
drwxr-xr-x  2 root   root     4096 oct 22 16:38 .
drwxr-xr-x  1 root   root     4096 oct 22 16:38 ..

外部创建文件, 容器内指定用户去删除

$ touch c.txt && sudo chmod root:wheel c.txt
$ docker run -u 100 -it --rm -v `pwd`:/world -w /world busybox /bin/sh -c 'rm /world/c.txt && ls -al'

实际是可以删除的

rm: remove '/world/c.txt'? y
total 4
drwxr-xr-x  4 100   root      128 oct 23 16:09 .
drwxr-xr-x  1 root   root     4096 oct 23 16:09 ..
-rw-r--r--  1 100   root       0 oct 22 15:36 a.txt
-rw-r--r--  1 100   root       0 oct 22 15:54 b.txt

docker 普通用户的1024以下端口权限

 $ docker run -u 100 -it --rm -p 70:80 busybox /bin/sh -c 'nc -l -p 80'
nc: bind: permission denied #用户id 100 时, 不能打开80端口
 $ docker run -u 100 -it --rm -p 70:8800 busybox /bin/sh -c 'nc -l -p 8800' #容器端口大于1024时则可以
...
 $ docker run -it --rm -p 70:80 busybox /bin/sh -c 'nc -l -p 80' #容器内是 root 也可以
...

关于“Docker运行时的用户与组如何管理”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Docker运行时的用户与组如何管理”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注亿速云行业资讯频道。

推荐阅读:
  1. 新手学Linux之用户与组管理
  2. 用户与用户组管理

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

docker

上一篇:Docker容器使用实例分析

下一篇:docker私有仓库的搭建和使用的方法

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》