在docker容器中使用非root用户执行脚本操作
应用容器化之后,在docker容器启动时,默认使用的是root用户执行命令,因此容器中的应用默认都是使用root用户来运行的,存在很高的安全风险,那么如何能够使用非root的业务用户来运行应用呢,
下面我将举一个简单的例子来说明。
该例子是在容器中使用自建的用户来运行一个简单的shell脚本,并将脚本输出日志持久到容器外部。接下来让我们来看从制作镜像到容器运行的全过程吧。
1、构建镜像:
我将会使用dockerfile的方式来构建镜像,基础镜像使用ubuntu14.04(需要先拉取该镜像,dockerpullubuntu:14.04)。dockerfile内容如下
[root@host09test]#catDockerfile FROMdocker.io/ubuntu:14.04 MAINTAINERhepengfei RUNgroupaddhpf--创建用户组 RUNuseradd-d/data-ghpf-mhpf--创建用户 RUNsu-hpf-c"mkdir-p/data/scripts" RUNsu-hpf-c"mkdir-p/data/logs" WORKDIR/data/scripts COPYtest.sh/data/scripts/ RUNchownhpf:hpftest.sh RUNchmod755test.sh ENTRYPOINTsu-hpf-c"/data/scripts/test.sh"--使用所创建的用户来运行脚本 [root@host09test]#
脚本内容如下:
[root@host09test]#cattest.sh while[1=1] do echo`id`>>/data/logs/hpf.log--将日志输出到文件,启动容器的时候做持久化 sleep1 done [root@host09test]#
接下来让我们来构建镜像:
[root@host09test]#dockerbuild-thpf:v2. SendingbuildcontexttoDockerdaemon3.072kB Step1:FROMdocker.io/ubuntu:14.04 --->c69811d4e993 Step2:MAINTAINERhepengfei --->Usingcache --->b8401d2eb439 Step3:RUNgroupaddhpf --->Usingcache --->2e0d20802c41 Step4:RUNuseradd-d/data-ghpf-mhpf --->Usingcache --->bac36ee97aba Step5:RUNsu-hpf-c"mkdir-p/data/scripts" --->Usingcache --->a92c3f5f8e34 Step6:RUNsu-hpf-c"mkdir-p/data/logs" --->Usingcache --->2e8665da7092 Step7:WORKDIR/data/scripts --->Usingcache --->7cf84a5a8aca Step8:COPYtest.sh/data/scripts/ --->7e4c24de2096 Removingintermediatecontainerf96358d91c35 Step9:RUNchownhpf:hpftest.sh --->Runninginfc9ab290c56c --->f38afd1ea62c Removingintermediatecontainerfc9ab290c56c Step10:RUNchmod755test.sh --->Runningina35b507a1527 --->5b5223249f4c Removingintermediatecontainera35b507a1527 Step11:ENTRYPOINTsu-hpf-c"/data/scripts/test.sh" --->Runningin1ee7cc7fbec7 --->26e7d603dbac Removingintermediatecontainer1ee7cc7fbec7 Successfullybuilt26e7d603dbac [root@host09test]#
查看所构建的镜像:
[root@host09test]#dockerimages REPOSITORYTAGIMAGEIDCREATEDSIZE hpfv226e7d603dbac42minutesago188.3MB docker.io/ubuntu14.04c69811d4e9933weeksago188MB [root@host09test]#
2、启动容器:
注意,在启动容器之前,需要将宿主机上/data/hepf/log目录的权限,否则容器启动时,脚本中的日志将没有权限写该目录,我直接将该目录权限修改成777了。
[root@host09test]#chmod777/data/hepf/log
[root@host09test]#dockerrun-it-v/data/hepf/log:/data/logshpf:v2
现在来查看/data/hepf/log目录中的日志文件:
[root@host09log]#pwd /data/hepf/log [root@host09log]#ll total12 -rw-rw-r--11000100010800Sep708:02hpf.log [root@host09log]#tail-2hpf.log uid=1000(hpf)gid=1000(hpf)groups=1000(hpf) uid=1000(hpf)gid=1000(hpf)groups=1000(hpf) [root@host09log]#
可以看到,该文件的属主跟容器中创建的hpf用户是一致的:
hpf@ba688af3f598:~$id uid=1000(hpf)gid=1000(hpf)groups=1000(hpf) hpf@ba688af3f598:~$
如果宿主机上已有其他用户跟容器中创建用户的id一样的话,宿主机上的日志文件属主就会变成该用户,但是暂时没有发现什么问题。
[root@host09log]#cat/etc/passwd|grephpf1 hpf1:x:1000:1000::/data1:/bin/bash[root@host09log]#ll total12 -rw-rw-r--1hpf1hpf111250Sep708:50hpf.log [root@host09log]#
简单的例子到这里就结束了。
补充知识:docker默认存放以及docker非root用户
方法1
sudodockerinfo|grep“DockerRootDir”
首先停掉Docker服务:
systemctlrestartdocker
或者
servicedockerstop
然后移动整个/var/lib/docker目录到目的路径:
mv/var/lib/docker/root/data/docker
ln-s/root/data/docker/var/lib/docker
方法2
Docker的配置文件可以设置大部分的后台进程参数,在各个操作系统中的存放位置不一致,在Ubuntu中的位置是:/etc/default/docker,在CentOS中的位置是:/etc/sysconfig/docker。
如果是CentOS则添加下面这行:
OPTIONS=–graph=”/root/data/docker”–selinux-enabled-Hfd://
如果是Ubuntu则添加下面这行(因为Ubuntu默认没开启selinux):
OPTIONS=–graph=”/root/data/docker”-Hfd://
或者
DOCKER_OPTS=”-g/root/data/docker”
1、首先创建docker用户组,如果docker用户组存在可以忽略
sudogroupadddocker
2、把用户添加进docker组中
sudogpasswd-a${USER}docker
3、重启docker
sudoservicedockerrestart
4、如果普通用户执行docker命令,如果提示get……dialunix/var/run/docker.sock权限不够,则修改/var/run/docker.sock权限
使用root用户执行如下命令,即可
sudochmoda+rw/var/run/docker.sock
以上这篇在docker容器中使用非root用户执行脚本操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。