docker 镜像的用户密码的问题?

2018-11-21 20:31:33 +08:00
 rizon

突然想起这个问题。之所以问这个问题,是因为我最近使用 jupyter 的官方镜像,但是发现登陆的用户不是 root,缺少一些权限。

  1. docker 镜像默认是不是没有密码?
  2. 那么一些镜像如果用户不是 root 用户该怎么切换用户呢?(只有 使用--user参数这一种方法吗?)
  3. 如果我修改了用户的密码,那么 docker 的 exec 命令还可以直接进入到 bash 吗?如果可以想问一下这个 exec 命令是什么原理?为什么不用关心用户权限。
17543 次点击
所在节点    程序员
59 条回复
likuku
2018-11-21 21:24:23 +08:00
你这是把 docker 当虚拟机来用了...
CivAx
2018-11-21 21:30:14 +08:00
你这是把 docker 当虚拟机来用了...
zmj1316
2018-11-21 21:41:41 +08:00
我这里进去就是 root 啊,docker 默认就是 root,其他用户才需要自己建

LS 别笑话,我还真拿 docker 当虚拟机使了🤣,每个容器单独开 ssh 映射接口出去,然后挂外面的文件夹。
因为一台机器需要配各种环境给好多人用,每个人都要 root 权限装东西,折腾坏了还要重新配环境,除了 docker 没啥好用的了。
CivAx
2018-11-21 21:47:52 +08:00
1、docker history $imageID
可以用来观察在你 docker pull 或者 docker run xxx 的时候,docker 自动帮你配置的镜像分别执行过什么命令。

2、除非你用的自定义镜像;官方所有镜像都是(大都是)基于 Debian 8 来构建,并且使用 ROOT 账号执行命令, --user 的作用不是指定“这个容器内的默认用户是谁”,而是决定“由宿主机的谁来运行这个容器”,详见 Linux nameSpace 说明文档。如果一定要指定镜像的运行时用户,可以用 Dockerfile 中的 USER 参数指定,任何写在 USER 以下的命令都会被以 $USER 来执行

3、docker -it exec root $containerName bash
翻译:
docker -参数(启用交互式 分配伪终端) exec 以 root 用户身份 $容器名 使用 bash 作为 session (你开心可以用 sh )
rizon
2018-11-21 22:08:04 +08:00
@CivAx #4
你说的 --user 表示的是宿主机的用户?可是我使用`docker exec --user jovyan -it datascience_jupyter_lab bash`这个命令登陆进去就是 jovyan 这个用户,但是这个用户宿主机里是没有的。 所以这里匹配的还是容器里的用户吧
CivAx
2018-11-21 22:37:11 +08:00
@rizon docker run
stebest
2018-11-21 23:04:20 +08:00
这些都是 linux 的基本操作,,,和 docker 没啥关系,在 Linux 怎么创建用户怎么切换用户,在这里就怎么弄
gam2046
2018-11-22 08:34:30 +08:00
@CivAx 求大佬科普下。

我感觉 Docker 内分帐号意义并不是很大,因为 docker 本身被设计成一个容器只做一件事(虽然有人会在单容器内启动多个业务)。

那么在一个容器,只有一个工作的情况下,再划分多个帐号的意义是什么呢?退一步说,即使容器内业务存在漏洞,被人渗透,取得 webshell 或其他同等性质的权限。容器内的 root 并没有什么特别。

尽管如此,我发现有些镜像,例如 php、Tomcat 一类的,依旧会采用多用户的形式,例如会创建一个 www-data 的用户。而非采用默认的 root。所以,我觉得这其中应该有我没想到的原因吧?
kios
2018-11-22 08:48:26 +08:00
我觉得你对 docker 的理解错了
grantonzhuang
2018-11-22 08:59:30 +08:00
@gam2046 我也有相同的疑问
shylockhg
2018-11-22 09:00:27 +08:00
docker container 就是活在妄想里的宿主机进程。。。
shylockhg
2018-11-22 09:01:21 +08:00
@gam2046 用户有各种需求,比如我现在在用 docker+vim 开发,开发环境异常纯净
shylockhg
2018-11-22 09:06:30 +08:00
1.看镜像 build 怎么设置
2.su
3.exec 就是执行 container 里的程序
Hzzone
2018-11-22 09:49:04 +08:00
passerbytiny
2018-11-22 10:12:54 +08:00
@zmj1316 如果你只把 /opt 目录挂载成卷,那么创建用户、yum/apt-get 安装程序等等操作,容器都是干不了的,必须重建镜像;如果你把 /etc、/usr/local、/var 都挂载成了卷,那这容器就是个云主机,还需要脱裤子放屁地映射端口:那么用 docker 当虚拟机到底有啥好处。不会是不挂载数据卷,出问题的时候直接销毁并重建容器吧,相当于“快速重新安装系统”。
CivAx
2018-11-22 10:14:01 +08:00
@gam2046
第一段:
我就被要求过一个 Docker 起一堆服务打包成一个“系统”来进行快速部署,然后在 V 友的帮助下劝说了他放弃了这个念头(可以翻翻我的发帖纪录,我觉得那个帖子仅为其中的评论也都值得收藏)。

第二段:
实际上是有“特别”的。
除了极其严重的“ Docker 逃逸”等漏洞,还有一个十分低级但很常见的错误会导致以 root 权限运行的容器会另宿主机暴露在风险之中。
由于 nameSpace 的关系,如果你在 docker run 的时候--user 指定为 root,那么这个容器(实际上恰当的叫法是进程)则活在 root 的 nameSpace 里,也就是俗称的“具有 root 权限”。如果你还不幸地挂载了高危目录,譬如 -v /:/host 或者 -v /etc:/etc,那么一旦因为某些软件的漏洞,攻击者攻破进入到容器中,他直接 chroot 就直接有可以破坏宿主机的能力。

第三段:
“ docker run -it debian ”
“ cat /etc/passwd ”
----
“ docker run -it tomcat ”
“ cat /etc/passwd ”
“ cat /etc/issue ”
julyclyde
2018-11-22 10:18:48 +08:00
我还以为没人批判把容器当虚拟机用呢,原来还是有懂行的人的
Beebird
2018-11-22 10:26:30 +08:00
@rizon 出于安全考虑,越来越多的 docker image 中的 User 不再是 root 了,如果你一定要以 root 身份登录到 docker container 中,可以试试 docker exec --privileged -u root -it <container id> sh
zmj1316
2018-11-22 10:33:42 +08:00
@passerbytiny 我只挂外面用户自己的数据卷,方便直接跑代码和模型,挂其他的我还怎么配不同的环境啊......非要建用户直接在 Dockerfile 里面建就行了啊。容器被玩坏了就直接从 image 重新开一个出来,数据卷一直在的。

主要目的一个是方便配环境,网上去下就行了,还有因为用户是小白,经常会玩坏系统。。。。。。

我的情况是,一个实际用户会需要开多个不同环境的容器,挂的是同一个数据卷,一个容器只有一个实际用户使用的。。。
ipwx
2018-11-22 10:41:13 +08:00
@zmj1316 我大概理解你的场景,但是我觉得你的管理方法有问题。

我建议你开放 docker 权限给你们组里面其他人,每个人专用自己的环境。好多人共用一个 Docker 环境,这和原来的直接裸机装环境,有什么差别呢?

什么,你说裸机装机太麻烦?我这边都是用 Ansible 装裸机环境的。被搞坏了很快就能回复。当然,在此之前,我会对一切要求我用 root 装环境的组员说不,所以也就没那么多可能的搞坏的情况了。

如果不下方 Docker 容器的权限给组员,有组员要 Python 2,有组员要 Python 3,有组员要特殊的系统包才能运行 pip,都来找你处理吗?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/510174

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX