docker容器启动执行脚本(在docker容器中使用非root用户执行脚本操作)
docker容器启动执行脚本
在docker容器中使用非root用户执行脚本操作应用容器化之后,在docker容器启动时,默认使用的是root用户执行命令,因此容器中的应用默认都是使用root用户来运行的,存在很高的安全风险,那么如何能够使用非root的业务用户来运行应用呢,
下面我将举一个简单的例子来说明。
该例子是在容器中使用自建的用户来运行一个简单的shell脚本,并将脚本输出日志持久到容器外部。接下来让我们来看从制作镜像到容器运行的全过程吧。
1、构建镜像:
我将会使用dockerfile的方式来构建镜像,基础镜像使用ubuntu 14.04(需要先拉取该镜像,docker pullubuntu:14.04)。dockerfile内容如下
[root@host09 test]# cat Dockerfile FROMdocker.io/ubuntu:14.04 MAINTAINER hepengfei RUN groupadd hpf --创建用户组 RUN useradd -d /data -g hpf -mhpf --创建用户 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]# cattest.sh while [ 1 = 1 ] do echo `id`>>/data/logs/hpf.log --将日志输出到文件,启动容器的时候做持久化 sleep 1 done [root@host09 test]#
接下来让我们来构建镜像:
[root@host09 test]# dockerbuild -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 IMAGEID CREATED SIZE hpf v2 26e7d603dbac 42 minutesago 188.3 MB docker.io/ubuntu 14.04 c69811d4e993 3 weeksago 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 10800Sep 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:50hpf.log [root@host09 log]#
简单的例子到这里就结束了。
补充知识:docker默认存放以及docker 非root用户
方法1
sudo docker info | grep “Docker Root Dir”
首先停掉Docker服务:
systemctl restart docker
或者
service docker stop
然后移动整个/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 -H fd://
如果是 Ubuntu 则添加下面这行(因为 Ubuntu 默认没开启 selinux):
OPTIONS=–graph=”/root/data/docker” -H fd://
或者
DOCKER_OPTS=”-g /root/data/docker”
1、 首先创建docker用户组,如果docker用户组存在可以忽略
sudo groupadd docker
2、把用户添加进docker组中
sudo gpasswd -a ${USER} docker
3、重启docker
sudo service docker restart
4、如果普通用户执行docker命令,如果提示get …… dial unix /var/run/docker.sock权限不够,则修改/var/run/docker.sock权限
使用root用户执行如下命令,即可
sudo chmod a+rw /var/run/docker.sock
以上这篇在docker容器中使用非root用户执行脚本操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持开心学习网。
- docker管理工具选择(Docker可视化管理工具DockerUI的使用)
- rocketmq安装linux(docker安装rocketMQ教程最详细)
- docker网络通信(Google和Facebook不使用Docker的原理解析)
- elasticsearchwindows分词器配置(docker 部署 Elasticsearch kibana及ik分词器详解)
- docker运行环境centos(如何在centos的docker里安装jupyter并开放端口)
- nginx代理docker容器(Docker Nginx容器制作部署实现方法)
- docker目录映射不起作用(关于dockerfile build过程中报/bin/sh: pip: command not found的解决方法)
- docker修改镜像配置文件(Docker配置本地镜像与容器的存储位置)
- 运行docker时提示端口已被占用(docker 突然不能被外网访问的解决方案)
- docker默认网桥设置(Docker默认网段修改实现方法解析)
- docker部署golang(如何使用Docker部署Go Web应用的实现)
- docker shell教学(docker安装rockerChat设置聊天室的详细步骤)
- docker容器的创建启动和停止操作(docker版es、milvus、minio启动命令详解)
- docker镜像简介(详解使用阿里云镜像仓库构建国外Docker镜像)
- docker搭建编译开发环境(Shell脚本构建Docker 半自动化编译打包发布应用操作)
- docker配置和启动(Docker的安装与配置命令代码实例)
- 挑战新国标电自天花板,九号机械师MMAX 110P深度体验(挑战新国标电自天花板)
- 《满江红》不要只当电影看,学生应该这样做(满江红不要只当电影看)
- 电影《民间怪谈录之走阴人》定档8月5日,开启一场中式惊悚之旅(电影民间怪谈录之走阴人定档8月5日)
- 原创图画书,以儿童视角讲述中国故事(以儿童视角讲述中国故事)
- 八月再见 愿你岁月不扰,余生静好(八月再见愿你岁月不扰)
- 赏读 八月再见,九月你好(赏读八月再见九月你好)
热门推荐
- ftp服务器包括哪些(FTP服务器和Web服务器知多少)
- css的水滴效果(CSS制作各种样式的彩虹效果)
- vmware vcenter怎么用安全(关于Vmware vcenter未授权任意文件上传漏洞CVE-2021-21972的问题)
- phpstudy服务器怎么设置(PHPStudy打开网页很慢的原因及解决方案)
- linux下如何启动phpstudy面板(详解phpstudy linux web面板小皮面板V0.2版本正式发布)
- navicat15激活页面不显示(Navicat for MySQL 15注册激活详细教程)
- vueweb端聊天(Vue实现聊天界面)
- laravel api接口开发版本控制(Laravel 创建可以传递参数 Console服务的例子)
- 用php递归函数实现阶乘的计算(php求斐波那契数的两种实现方式递归与递推)
- css中三角标(使用css实现三角符号效果)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9