Jenkins在项目中可以说是CI/DI必不可少的一个工具。关于Jenkins的安装,网上文章很多,但是错讹居多,有不少都没有经过验证。
本文结合网上文章、视频以及个人实操,希望可以作为一个满意的Docker安装Jenkins的文档。
一、版本选择
我们在安装容器时,很多时候都是采用的官方镜像,但是如果看网上的文章,在安装Jenkins时大多不是直接安装的官方推荐的。
1. 检索Jenkins的镜像
docker search jenkins
一般第一个就是官方镜像。
但是安装Jenkins时,大多不会安装这个版本,就连Jenkins官网都推荐安装的是其他版本,具体是什么呢?就是jenkinsci/blueocean。
docker search jenkinsci
通过上图OFFICIAL列的字段可以看出,我们检索的jenkinsci的容器,都不是官方版本的。
查看官网
官网地址:Docker安装Jenkins官网
官网推荐命令:
docker run \
-u root \
--rm \
-d \
-p 8080:8080 \
-p 50000:50000 \
-v jenkins-data:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
jenkinsci/blueocean
我们看最后一行,官网使用的就是jenkinsci/blueocean版本。
最终,我们确定,我们使用的Jenkins版本是jenkinsci/blueocean。
二、安装
我们不采用官方的命令,我们采用最通用的命令。
docker run -u root --name jenkins-blueocean -d \
-p 8080:8080 -p 50000:50000 \
-v /usr/local/jenkins_home:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
--restart=always --privileged=true \
jenkinsci/blueocean
命令解读:
-u root:以root用户创建容器容器,否则容易出现权限问题
–name :指定容器运行后的名字
-d:后台运行容器
-p:端口映射,宿主机:容器
-v:端口映射
–restart=always:跟随Docker自动重启,可以说是必须的
–privileged=true:让当前用户拥有root权限。
需要说明的是,–privileged=true,虽然是拥有了 root 权限,但并不一定是 root 用户身份。
-uroot ,指定了 root 用户身份,但并不是真正拥有 root 权限。
总结:
-uroot:是给了 root 用户身份,但并没有真正的 root 权限
–privileged:真正让当前用户有了 root 权限
这部分参考:docker run 命令详解
所以,我们给出的命令不但有-u root,也有–privileged=true,这就是更合理的。
三、错误示范
一般创建容器时,很少指定-u root命令,大多是使用–privileged=true。这在创建其他容器时一般是没问题的,但是创建Jenkins是有问题的。
docker run --name jenkins -d \
> -p 8080:8080 -p 50000:50000 \
> --restart=always --privileged=true \
> -v /usr/local/jenkins_home:/var/jenkins_home \
> -v /var/run/docker.sock:/var/run/docker.sock \
> jenkinsci/blueocean
我们采用以上命令创建一个名为jenkins的容器,然后查看容器情况:
docker ps
我们看到STATUS为Restarting。
查看容器日志:
docker logs -f --tail 300 jenkins
如果我们搜索错误日志:
touch: cannot touch ‘/var/jenkins_home/copy_reference_file.log’: Permission
给出的解释大体都是一样的:
docker与jenkin默认目录(/var/jenkins_home)的权限问题
具体说就是:
需要修改下目录权限, 因为当映射本地数据卷时,此时的用户权限是root,即/usr/local/docker/jenkins/ 权限为root,但是挂载卷到容器内部,此时jenkins的权限为为1000。
解决方案:
chown -R 1000:1000 /usr/local/docker/jenkins/
这个问题就是在创建Jenkins容器是没有加-u root参数导致的,切记!
四、登陆
浏览器上输入:
http://192.168.222.100:8080/
按道理说是访问http://localhost:8080就可以访问,但是我这里失败了,只好通过访问虚拟机路径访问。
以上地址是我们的虚拟机地址。
创建Jenkins后会自动创建admin用户和对应的密码,密码所在的位置上图已经给出,我们访问该文件即可得到密码:
cat /var/jenkins_home/secrets/initialAdminPassword
得到的密码是:
bc3427450e574797a48fec1866229a9b
也可以访问Jenkins运行日志查看该密码:
docker logs jenkins
上面的jenkins指的是创建的Jenkins的容器名称。
因为Jenkins是用Java编写的,上图就是启动一个java项目的日志。
我们通过上图可以看到密码,以及日志的提示中说,可以访问下面目录得到密码:
/var/jenkins_home/secrets/initialAdminPassword
这和页面上给的提示是一致的。
我们输入密码,点击继续即可登陆成功。
这真的是新手入门!!!
既然是新手入门,那我们就安装推荐的插件即可,这个其实就类似于安装软件时候的默认安装与自定义安装。
邮箱不可少。
保存并完成。
上图就是采用我们刚才创建的用户登陆的界面。
至此,我们通过Docker安装Jenkins已经完成。
唯一的缺憾就是,我们创建完容器后竟然不能使用localhost来访问。这个问题以后再解决。
至于后续的Jenkins操作,我们下一篇文章来介绍,这个就是更深一层的知识了。后续就是项目部署,当然必然少不了流水线部署的。