先安装配置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使用docker制作镜像 jenkins部署docker镜像_docker

创建挂载用的工作目录(打算把数据保存在~/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连接各节点,把各项目指派到对应的节点去部署。这个图反应了任务和节点的关系:

jenkins使用docker制作镜像 jenkins部署docker镜像_docker_02

所以,要在Docker所在主机部署,可以直接把主机配置为Jenkins的某个节点:

  1. 配置主机作为Jenkins的一个节点:(对于docker中的Jenkins环境,我们就让它是master节点,不给它分配任务就行了)
  2. 配置项目,指定对应的标签或节点名字即可:(用标签可以对应多个节点,注意不要有多余空格)

在Docker所在主机部署大概就这样。

称Jenkins所在主机为A,如果想到其他机器(比如服务器B)部署项目(比如项目C),也不需要在B中安装Jenkins,只要在A的Jenkins控制台新建节点就行了,配置好B的地址(ip/url)和ssh密钥,然后在A的Jenkins控制台新建项目C,限制在B对应的节点执行。 (注意:密钥用户要有部署项目的操作权限)



(默认Jenkins自身所在的环境是master节点)

  • master节点的执行者数量设为0可以禁用它,其他节点也可以设为0禁用,而不需要删除,这样可以保留配置