centos7 下docker安装jenkins

docker环境搭建完成后

1、启动docker,获取镜像

docker pull jenkins  

感觉下载了好大体积的东西啊!发现最开始的helloword镜像都要一百多m。

大致查了一下思考了一下,开始有点明白docker和虚拟机的区别了:以下描述可能不够严谨。

docker镜像更像是为每一个程序都单独配置程序运行依赖的内容。比如helloworld镜像,这里面可能就涉及到centos系统用来完成echo指令的相关内容。

而虚拟更像是把大部分基础功能的环境集成起来了。

好比:

docker :一个食品加工厂只生产一种食品,那么工厂准备的所有物资人力,都只是为了生产这一种食品。缺少任何内容都会导致食品生产出问题。

虚拟机:一个餐厅,集合了各种各样的食材,初始和做菜工具,这样子的话,当有不同的人要点不同的菜时,可以选择指定食材和厨师进行制作。可以满足不同的生产需要

2、镜像下载完成后。运行jenkins

docker run -d -p 8080:8080 --name myjenkins -v $PWD/jenkins:/var/jenkins_home -t jenkins

-d  表示后台运行

-p 8080:8080:将容器的80端口映射到主机的80端口

-name jenkins :将容器命名为jenkins

-v: $PWD/jenkins:/var/jenkins_home  : 将主机中当前目录下的jenkins挂载到容器的/var/jenkins_home

-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用; 

docker run的具体参数可以参考菜鸟教程-docker run 命令

运行后却发现没有启动成功,查看输出留后发现:没有权限把本地目录挂载

[root@centos71 ~]# docker logs myjenkins
touch: cannot touch '/var/jenkins_home/copy_reference_file.log': Permission denied
Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?
解决方法:参考 谈谈 Docker Volume 之权限管理(一)

用ls -la命令查看了下,发现当前目录下的jenkins的拥有者是root

[root@centos71 ~]# ls -la
drwxr-xr-x.  2 root root    6 3月  11 00:04 jenkins

通过下面命令查看当前jenkins容器的用户:发现容器里的用户是jenkins

[root@centos71 ~]# docker run -ti --rm --entrypoint="/bin/bash" jenkins -c "ls -la /var/jenkins_home"
total 12
drwxr-xr-x. 2 jenkins jenkins   57 Mar 10 16:28 .
drwxr-xr-x. 1 root    root      37 Feb 15 17:16 ..
-rw-r--r--. 1 jenkins jenkins  220 May 15  2017 .bash_logout
-rw-r--r--. 1 jenkins jenkins 3526 May 15  2017 .bashrc
-rw-r--r--. 1 jenkins jenkins  675 May 15  2017 .profile

给centos 添加jenkins用户组和用户

[root@centos71 ~]# groupadd jenkins 
[root@centos71 ~]# useradd -g jenkins jenkins  

用户的uid是: 1000

[root@centos71 ~]#  docker run -ti --rm --entrypoint="/bin/bash" jenkins -c "whoami && id"
jenkins
uid=1000(jenkins) gid=1000(jenkins) groups=1000(jenkins)

参考文章:使用Docker运行jenkins

解决方法:把当前目录下的jenkins的拥有者和组别都改成jenkins

[root@centos71 ~]#  chown -R jenkins jenkins/
[root@centos71 ~]#  chgrp -R jenkins jenkins/  

3、再次启动jenkins ,发现由于前面的操作,myjenkins这个容器名称已经被占用了。通过docker ps -a    可以看出当前有哪些容器以及被定义。

[root@centos71 ~]# docker run -d -p 8080:8080 --name myjenkins -v $PWD/jenkins:/var/jenkins_home -t jenkins
/usr/bin/docker-current: Error response from daemon: Conflict. The container name "/myjenkins" is already in use by container 06ecf6381b6b76354d9e8ed077b5067baed09462fceba46e5840c849352ad048. You have to remove (or rename) that container to be able to reuse that name..
See '/usr/bin/docker-current run --help'.

解决方法:把指定终止状态的容器删除 ,加上-f可以强制删除运行中的容器

[root@centos71 ~]#  docker container rm  myjenkins

要清除所有终止的容器的话,可以使用下面命令

[root@centos71 ~]# docker container prune

现在再次运行启动jenkins的命令

docker run -d -p 8080:8080 --name myjenkins -v $PWD/jenkins:/var/jenkins_home -t jenkins

还是报上面的错误。再查了下资料,有以下说法:

   问题原因及解决办法

   原因是CentOS7中的安全模块selinux把权限禁掉了,至少有以下三种方式解决挂载的目录没有权限的问题:
   1.在运行容器的时候,给容器加特权,及加上 --privileged=true 参数:
   2.临时关闭selinux:
   setenforce 0
   3.添加selinux规则,改变要挂载的目录的安全性文本

用了第一种方法,失败

第二种方法,成功!终于好了!



猜你喜欢

转载自blog.csdn.net/qq_16979575/article/details/79513204