應用容器化以後,在docker容器啓動時,默認使用的是root用戶執行命令,所以容器中的應用默認都是使用root用戶來運行的,存在很高的安全風險,那麼如何可以使用非root的業務用戶來運行應用呢,下面我將舉一個簡單的例子來講明。該例子是在容器中使用自建的用戶來運行一個簡單的shell腳本,並將腳本輸出日誌持久到容器外部。接下來讓咱們來看從製做鏡像到容器運行的全過程吧。
一、構建鏡像:
我將會使用dockerfile的方式來構建鏡像,基礎鏡像使用ubuntu 14.04(須要先拉取該鏡像,docker pull ubuntu:14.04)。dockerfile內容以下
[root@host09 test]# cat Dockerfile
FROM docker.io/ubuntu:14.04
MAINTAINER hepengfei
RUN groupadd hpf --建立用戶組
RUN useradd -d /data -g hpf -m hpf --建立用戶
RUN su - hpf -c "mkdir -p /data/scripts"
RUN su - hpf -c "mkdir -p /data/logs"
WORKDIR /data/scripts
COPY test.sh /data/scripts/
RUN chown hpf:hpf test.sh
RUN chmod 755 test.sh
ENTRYPOINT su - hpf -c "/data/scripts/test.sh" --使用所建立的用戶來運行腳本
[root@host09 test]#
腳本內容以下:
[root@host09 test]# cat test.sh
while [ 1 = 1 ]
do
echo `id` >>/data/logs/hpf.log --將日誌輸出到文件,啓動容器的時候作持久化
sleep 1
done
[root@host09 test]#
接下來讓咱們來構建鏡像:
[root@host09 test]# docker build -t hpf:v2 .
Sending build context to Docker daemon 3.072 kB
Step 1 : FROM docker.io/ubuntu:14.04
---> c69811d4e993
Step 2 : MAINTAINER hepengfei
---> Using cache
---> b8401d2eb439
Step 3 : RUN groupadd hpf
---> Using cache
---> 2e0d20802c41
Step 4 : RUN useradd -d /data -g hpf -m hpf
---> Using cache
---> bac36ee97aba
Step 5 : RUN su - hpf -c "mkdir -p /data/scripts"
---> Using cache
---> a92c3f5f8e34
Step 6 : RUN su - hpf -c "mkdir -p /data/logs"
---> Using cache
---> 2e8665da7092
Step 7 : WORKDIR /data/scripts
---> Using cache
---> 7cf84a5a8aca
Step 8 : COPY test.sh /data/scripts/
---> 7e4c24de2096
Removing intermediate container f96358d91c35
Step 9 : RUN chown hpf:hpf test.sh
---> Running in fc9ab290c56c
---> f38afd1ea62c
Removing intermediate container fc9ab290c56c
Step 10 : RUN chmod 755 test.sh
---> Running in a35b507a1527
---> 5b5223249f4c
Removing intermediate container a35b507a1527
Step 11 : ENTRYPOINT su - hpf -c "/data/scripts/test.sh"
---> Running in 1ee7cc7fbec7
---> 26e7d603dbac
Removing intermediate container 1ee7cc7fbec7
Successfully built 26e7d603dbac
[root@host09 test]#
查看所構建的鏡像:
[root@host09 test]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hpf v2 26e7d603dbac 42 minutes ago 188.3 MB
docker.io/ubuntu 14.04 c69811d4e993 3 weeks ago 188 MB
[root@host09 test]#
2、啓動容器:
注意,在啓動容器以前,須要將宿主機上/data/hepf/log目錄的權限,不然容器啓動時,腳本中的日誌將沒有權限寫該目錄,我直接將該目錄權限修改爲777了。
[root@host09 test]# chmod 777 /data/hepf/log
[root@host09 test]# docker run -it -v /data/hepf/log:/data/logs hpf:v2
如今來查看/data/hepf/log目錄中的日誌文件:
[root@host09 log]# pwd
/data/hepf/log
[root@host09 log]# ll
total 12
-rw-rw-r-- 1 1000 1000 10800 Sep 7 08:02 hpf.log
[root@host09 log]# tail -2 hpf.log
uid=1000(hpf) gid=1000(hpf) groups=1000(hpf)
uid=1000(hpf) gid=1000(hpf) groups=1000(hpf)
[root@host09 log]#
能夠看到,該文件的屬主跟容器中建立的hpf用戶是一致的:
hpf@ba688af3f598:~$ id
uid=1000(hpf) gid=1000(hpf) groups=1000(hpf)
hpf@ba688af3f598:~$
若是宿主機上已有其餘用戶跟容器中建立用戶的id同樣的話,宿主機上的日誌文件屬主就會變成該用戶,可是暫時沒有發現什麼問題。
[root@host09 log]# cat /etc/passwd |grep hpf1
hpf1:x:1000:1000::/data1:/bin/bash[root@host09 log]# ll
total 12
-rw-rw-r-- 1 hpf1 hpf1 11250 Sep 7 08:50 hpf.log
[root@host09 log]#
簡單的例子到這裏就結束了。