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

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

  • 资源限制 组可以设置为不超过配置的内存限制, 其中还包括文件系统缓存
  • 优先级 某些组可能会获得更大的 CPU 利用率份额或磁盘 i/o 吞吐量
  • 帐号会计 度量组的资源使用情况, 例如, 用于计费的目的
  • 控制 冻结组进程, 设置进程的检查点和重新启动

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

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

  • PID 命名空间为进程标识符 (PIDs) 的分配、进程列表及其详细信息提供了隔离。

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

  • 网络命名空间隔离网络接口控制器 (物理或虚拟)、iptables 防火墙规则、路由表等。网络命名空间可以使用 "veth " 虚拟以太网设备彼此连接。
  • UTS 命名空间允许更改主机名。
  • mount(装载)命名空间允许创建不同的文件系统布局, 或使某些装入点为只读。
  • IPC 命名空间将 System V 的进程间通信通过命名空间隔离开来。
  • 用户命名空间将用户 id 通过命名空间隔离开来。

普通用户 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 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 也可以
...

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

您可能感兴趣的文章:

文章同步发布: https://www.geek-share.com/detail/2755227386.html

Docker 运行时的用户与组管理的方法的更多相关文章

  1. linux系统用户和组管理

    用户和组管理 Linux是多用户多任务的网络操作系统,作为网络管理员,掌握用户的组的创建与管理至关重要. 学习要点: 了解用户和组的群的配置文件. 熟悉掌握Linux下用户的创建和维护管理. 熟悉掌握 ...

  2. 一、Vim编辑器 二、用户和组管理 三、软件的安装(jdk,mysql) 四、Shell编程

    一.Vim编辑器的使用 1. vim编辑器的运行模式 编辑模式:等待用户编辑命令的输入 插入模式:编辑文本内容 命令模式:执行命令 2. 使用 :vim 文件名 3. 查看当前vim编辑器介绍:vim ...

  3. (转)AIX 用户和组管理

    AIX 用户和组管理 原文:https://www.ibm.com/developerworks/cn/aix/library/au-aixuseradmin/ 管理 IBM AIX 中的用户和组是管 ...

  4. Linux用户与组管理命令

    1.列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可. who | cut -d" " -f1 | sort -u 或 who | cut -d ...

  5. (转)Centos 7.3 用户和组管理

    Centos 7.3 用户和组管理 原文:http://blog.csdn.net/github_39069288/article/details/73306489 3.1 用户和密码配置文件 pas ...

  6. linux学习16 Linux用户和组管理命令演练和实战应用

    一.上集回顾 1.bash globing,IO重定向及管道 glob:*,?,[],[^] IO重定向: >,>>, 2>,2>> &>,& ...

  7. Day03_破解Windows7系统密码&用户与组管理&服务器远程管理

    破解Windows系统密码 一.利用5次shift漏洞破解win7密码 1.1 漏洞 1.在未登录系统时,连续按5次shift键,弹出程序c:\windows\system32\sethc.exe 2 ...

  8. 总结描述用户和组管理类命令的使用方法,系统用户相关信息,取出主机IP地址

    1.列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可. [root@db146 ~]# who|cut -f1 -d' ' |sort -u root 2.取出最后 ...

  9. linux基础之用户和组管理及权限

    一.用户和组管理 相关配置文件 /etc/passwd: 用户名 : 密码占位符 : UID : GID : COMMENTS : 家目录 :默认shell /etc/group: 组名 : 组密码占 ...

随机推荐

  1. Java 8 Date-Time API概览

    更新时间:2018-04-19 根据网上资料整理 java 8增加了新的Date-Time API (JSR 310),增强对日期与时间的处理.它在很大程度上受到Joda-Time的影响.之前写过一篇 ...

  2. python传递参数给shell

    #格式化字符 print "hello, %s" % ('mm') #传递参数 n="192.168.200.2" os.popen('ping %s -c 2 ...

  3. aclocal: error: aclocal: file '/usr/local/share/aclocal/wxwin.m4' does not exist

    1. 查找wxwin.m4文件 mdfind -name wxwin.m4 2. 删除/usr/local/share/aclocal/wxwin.m4,建立软连接 cd /usr/local/sha ...

  4. Java的MD5加密和解密

    链接:http://www.cnblogs.com/android-blogs/p/5305598.html Java的MD5加密和解密 简单demo: import  java.security.* ...

  5. scala流程控制语句以及方法和函数

    1.if else表达式 scala中没有三目运算符,因为根本不需要.scala中if else表达式是有返回值的,如果if或者else返回的类型不一样,就返回Any类型(所有类型的公共超类型). 例 ...

  6. IDEA 常用插件收藏

    1.maven helper 查看maven依赖,解决jar包冲突. 2.Alibaba Java Coding Guidelines  代码风格遵循阿里java规范. 3.Lombok 简化实体中的 ...

  7. Centos7 之目录处理命令(八)

    linux中 关于目录 有几个重要概念 一个是 / 根目录  还有一个当前用户的家目录 比如 root用户的家目录是 /root  普通用户的家目录是/home/xxx 下 root登录 默认家目录 ...

  8. 【OpenCV】图像增强---灰度变换、直方图均衡化

    图像增强的目的:改善图像的视觉效果或使图像更适合于人或机器的分析处理.通过图像增强,可以减少图像噪声,提高目标与背景的对比度,也可以增强或抑制图像中的某些细节.  ------------------ ...

  9. redis几种加锁的实现

    1. redis加锁分类 redis能用的的加锁命令分表是INCR.SETNX.SET 2. 第一种锁命令INCR 这种加锁的思路是, key 不存在,那么 key 的值会先被初始化为 0 ,然后再执 ...

  10. [SHOI2010]最小生成树

    题目 首先让其余所有边都减\(1\)和让自己加\(1\)没什么区别 考虑\(kruskal\)的过程 首先边权大于这条边的是不用考虑的 考虑把那些边权比这条边小的调节到比这条边大,这样就相当于在生成树 ...