先安装配置docker
安装不说了,注意非root用户执行docker会报docker.sock访问权限错误,需要把自己加到docker组。
然后因为国内访问dockerhub速度太慢,所以需要配置国内dockerhub镜像。这里用中科大的镜像:
sudo vim /etc/docker/daemon.json
内容如下(dns设置可有可无):
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn/"],
"dns": ["8.8.8.8", "8.8.4.4"]
}
然后重启dockerd:
sudo systemctl restart docker
拉取并运行Jenkins
docker pull jenkins/jenkins:lts-alpine
(我直接root了,你们注意安全)
创建挂载用的工作目录(打算把数据保存在~/jenkins/data
)
cd
mkdir -p jenkins/data
sudo chown 1000:1000 jenkins -R # jenkins镜像默认是用1000这个用户执行,不修改所有会无法创建文件
然后我们写个启动脚本,参考(jenkinsci官方github)[https://github.com/jenkinsci/docker/blob/master/README.md]即可:
cd ~/jenkins
vim init.sh
# 内容如下:
cd `dirname $0` && echo "PWD: "$(pwd)
docker run -d --name myjenkins \
--net=host \
-v `pwd`/data:/var/jenkins_home \
--restart=always \
-e TZ="Asia/Shanghai" \
--env JAVA_OPTS="-Djava.util.logging.config.file=/var/jenkins_home/log.properties" \
--add-host=dockerhost:172.17.0.1 \
jenkins/jenkins:lts-alpine
# -p 8080:8080 \
# -p 50000:50000 \
然后创建容器并运行:
cd ~/jenkins && bash init.sh
然后访问8080端口初始化Jenkins,再设置项目就行了。如果要备份还原项目,直接备份还原data文件夹就行了。(data就是主机直接安装Jenkins时的/var/lib/jenkins目录)
如何使用Docker内的Jenkins
接下来的问题就是如何使用Jenkins在主机或其他容器部署项目了。(我猜你也不会想把项目和Jenkins部署在同一个容器的)
一开始我挺疑惑Docker中的Jenkins怎么调用主机的程序,查了资料还发现了 使用fabric进行ssh 的操作,感觉这还挺麻烦的。
其实一番鼓捣下来发现Jenkins是可以配置节点的,而且Jenkins直接就可以ssh连接各节点,把各项目指派到对应的节点去部署。这个图反应了任务和节点的关系:
所以,要在Docker所在主机部署,可以直接把主机配置为Jenkins的某个节点:
- 配置主机作为Jenkins的一个节点:(对于docker中的Jenkins环境,我们就让它是master节点,不给它分配任务就行了)
- 配置项目,指定对应的标签或节点名字即可:(用标签可以对应多个节点,注意不要有多余空格)
在Docker所在主机部署大概就这样。
称Jenkins所在主机为A,如果想到其他机器(比如服务器B)部署项目(比如项目C),也不需要在B中安装Jenkins,只要在A的Jenkins控制台新建节点就行了,配置好B的地址(ip/url)和ssh密钥,然后在A的Jenkins控制台新建项目C,限制在B对应的节点执行。 (注意:密钥用户要有部署项目的操作权限)
(默认Jenkins自身所在的环境是master节点)
- master节点的执行者数量设为0可以禁用它,其他节点也可以设为0禁用,而不需要删除,这样可以保留配置