可以通过用户名观察
容器内运行程序的用户的UID, 会与容器外主机UID的用户对应,在主机top查看进程时,就可以看到容器内现在都有谁在运行程序。
问题:如果主机/etc/passwd中,没有对应的UID用户会怎么显示? 经过实验后,top命令会显示容器内用户的ID.
一开始,产生了极其错误的想法:先在主机上创建一个使用容器的普通用户,假设为zhangsan. UID为1000。 由于登录容器的用户是root, 把容器内/etc/passwd中的root的UID修改为1000.
这样当容器内运行程序时,主机的top会显示User为张三。
但是修改了root的UID,root就变成了普通用户,因为当UID=0时,用户是超级用户。
这样容器内就只有普通用户,没有了超级用户,之前用root创建的文件都不能访问。
由于没有了超级用户,/etc/passwd也无法会修改了。
解决:
关闭容器;开启容器;在连接容器。在连接容器时,运行相应命令,在重新创建一个超级用户。
docker exec -it 87b877346f41 /bin/bash -c 'useradd -u 0 -o -g root -G root -d /yuri yuri'
命令解析:
-u 0:指将uid指定为0(零)与root相同,登录后的提示符为#而非$。
-o:指因为重复了uid(与root帐号的uid重复)必须指定这个参数。
-g root:初始化组的组名,当用户属于多个组时,(在-G参数中指定),登录时所在组。缺省该项时,系统新建一个与用户名同名的组,并且初始化时设为该组名。而不论-G指定为哪些组。
-G root:指定用户名所属的组列表,一个用户可以属于多个组,组名间用逗号分隔,组名必须已经存在。
-d /yuri:指定用户的属主目录
yuri 新建的用户名为yuri
这样yuri就变成了超级用户。用yuri把/etc/passwd修改root成超级用户。
问题解决后,改变思想:在容器内重新一个普通用户,其UID与主机对应用户UID相同。在赋予普通用户root权限。这样用普通用户的身份去登录容器。