时间:2021-05-19
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:latestRUN 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
这里的 demo_user 和 group1(主组), group2(副组) 不是主机的用户和组, 而是创建容器镜像时创建的.
当Dockerfile里没有通过USER指令指定运行用户时, 容器会以 root 用户运行进程.
docker 指定用户的方式
Dockerfile 中指定用户运行特定的命令
docker run -u(--user)[user:group] 或 --group-add 参数方式
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.txtdocker 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 8drwxr-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 8drwxr-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'? ytotal 4drwxr-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.txtdocker 普通用户的1024以下端口权限
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
在1.20版本之后,Kubernetes将不再支持把Docker作为容器运行时使用。不必惊慌,实际上没多大影响。摘要:这里只是不建议将Docker作为底层运行时
直接解决方法具体可参考StackOverflow链接docker运行时存在守护程序,所以我们需要停止docker内运行的容器和docker服务。具体可参考官网给
近日,Kubernetes官方发布公告,宣布自v1.20起放弃对Docker的支持,届时用户将收到Docker弃用警告,并需要改用其他容器运行时。但Docker
win10系统浏览器提示“运行时间错误”的解决方法!Windows10用户反馈,浏览网页时系统突然出现提示“运行时间错误&r
RTTI,即Run-TimeTypeIdentification,运行时类型识别。运行时类型识别是Java中非常有用的机制,在Java运行时,RTTI维护类的相