使用Jenkins构建镜像
步骤1 - 启动Jenkins
在部署了有docker的主机,启动一个容器:
- 分别绑定8080与50000端口
- 映射目录
$ docker run -d -u root --name jenkins \
> -p 8080:8080 -p 50000:50000 \
> -v /root/jenkins_22773:/var/jenkins_home \
> jenkins/jenkins:2.277.3-alpine
Unable to find image 'jenkins/jenkins:2.277.3-alpine' locally
2.277.3-alpine: Pulling from jenkins/jenkins
339de151aab4: Pull complete
3f2c100ec87a: Pull complete
db6bab469f20: Pull complete
eda9addfa47b: Pull complete
c092c8f827e6: Pull complete
a6680d8d161c: Pull complete
db9b4e01fc34: Pull complete
9b787e33f839: Pull complete
d10d3008be39: Pull complete
2aa47f96718a: Pull complete
ba5b5e674cf0: Pull complete
e6cbc4f99054: Pull complete
ca84433b8cee: Pull complete
01ed7fde834c: Pull complete
Digest: sha256:0010e7b78300c9825b81d9dc5f5079b5d6df8772d4000707e33bda3db02fb1d6
Status: Downloaded newer image for jenkins/jenkins:2.277.3-alpine
e0cd4d3d5b5f0514fdbb4f9cbda41f02af394ef434a58f389c0bd663568d3cb6
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e0cd4d3d5b5f jenkins/jenkins:2.277.3-alpine "/sbin/tini -- /usr/…" 24 seconds ago Up 23 seconds 0.0.0.0:8080->8080/tcp, 0.0.0.0:50000->50000/tcp jenkins
$
使用浏览器访问8080端口,首先会让我们输入管理员密码
按照提示,密码可以在容器的/var/jenkins_home/secrets/initialAdminPassword文件中找到
$ docker exec -it jenkins cat /var/jenkins_home/secrets/initialAdminPassword
72c9b57faade4f6296835d1b1168e636
将这个密码粘贴单网页中,点击Continue,提示安装插件,
选择安装建议安装的插件进行安装,
随后提示创建管理员,我们选择跳过该步骤,
设置访问URL
点击保存完成,显示完成
至此,Jenkins已初始化完毕。
步骤2 - 配置Docker插件
在Dashboard里,Manage Jenkins→ Manage Plugins→ 点击Available→ 搜索Docker,选择并安装
安装成功。
步骤3 - 添加Docker Agent
以上步骤完成了插件的安装,现在我们来配置启动Docker Container。
同样地,在Dashboard里,Manage Jenkins→ Configure System→ 在Configure Clouds下拉菜单中选择Docker
→ 将Docker Host URI配置为tcp://172.17.0.44:2345,然后点击Test Connection测试连通性。
→ Docker Agent templates→ Add Docker Template→ 设置agent的label为docker-agent→ Docker Image为benhall/dind-jenkins-agent:v2→ 在Container Settings下设置Volumes为/var/run/docker.sock:/var/run/docker.sock→ 设置Connect Method为Connect with SSH→ 最后确保是Enabled的,点击保存。
步骤4 - 创建构建项目
在Dashboard里,Create Item→ 输入名称“Thesre Jenkins Demo” → 点击Freestyle project并点击OK→ 选择label为docker-agent
配置构建shell命令
点击保存。
步骤5 - 构建项目
上图可以看到提示(pending—‘Jenkins’ doesn’t have label ‘docker-agent’)。这是因为在后台,Jenkins在启动容器,并通过SSH连接它。这需要耗些时间。回到命令行查看容器的启动状态
$ docker logs --tail=10 jenkins
2021-04-26 12:37:37.409+0000 [id=300] INFO hudson.model.AsyncPeriodicWork#lambda$doRun$0: Finished DockerContainerWatchdog Asynchronous Periodic Work. 201 ms
2021-04-26 12:38:07.980+0000 [id=307] INFO c.n.j.plugins.docker.DockerCloud#canAddProvisionedAgent: Provisioning 'benhall/dind-jenkins-agent:v2' on 'docker'; Total containers: 0 (of 100)
2021-04-26 12:38:07.980+0000 [id=307] INFO c.n.j.plugins.docker.DockerCloud#provision: Will provision 'benhall/dind-jenkins-agent:v2', for label: 'docker-agent', in cloud: 'docker'
2021-04-26 12:38:07.986+0000 [id=307] INFO h.s.NodeProvisioner$StandardStrategyImpl#apply: Started provisioning Image of benhall/dind-jenkins-agent:v2 from docker with 1 executors. Remaining excess workload: 0
2021-04-26 12:38:07.992+0000 [id=309] INFO c.n.j.p.docker.DockerTemplate#pullImage: Pulling image 'benhall/dind-jenkins-agent:v2'. This may take awhile...
2021-04-26 12:38:07.996+0000 [id=309] INFO i.j.docker.client.DockerAPI#getOrMakeClient: Cached connection io.jenkins.docker.client.DockerAPI$SharableDockerClient@27a75718 to DockerClientParameters{dockerUri=tcp://172.17.0.86:2345, credentialsId=null, readTimeoutInMsOrNull=300000, connectTimeoutInMsOrNull=60000}
2021-04-26 12:38:09.384+0000 [id=309] INFO c.n.j.p.docker.DockerTemplate#pullImage: Finished pulling image 'benhall/dind-jenkins-agent:v2', took 1391 ms
2021-04-26 12:38:09.539+0000 [id=309] INFO c.n.j.p.docker.DockerTemplate#doProvisionNode: Trying to run container for image "benhall/dind-jenkins-agent:v2"
2021-04-26 12:38:09.579+0000 [id=309] INFO c.n.j.p.docker.DockerTemplate#doProvisionNode: Trying to run container for node docker-00006h094xelp from image: benhall/dind-jenkins-agent:v2
2021-04-26 12:38:10.723+0000 [id=309] INFO c.n.j.p.docker.DockerTemplate#doProvisionNode: Started container ID 299f49ded9eb8063f67394c87fc3c76965454b6cb41c87b36dc41491ccb27cc9 for node docker-00006h094xelp from image: benhall/dind-jenkins-agent:v2
$
等待10分钟发现构建完成了,查看构建好的镜像thesre/jenkins-demo:1
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
thesre/jenkins-demo 1 a3ac0ccaff85 4 seconds ago 5.81MB
katacoda/jenkins-demo latest a3ac0ccaff85 4 seconds ago 5.81MB
jenkins/jenkins 2.277.3-alpine a1eefa9056ae 5 days ago 364MB
benhall/dind-jenkins-agent v2 8f582645af33 3 years ago 1.14GB
jenkinsci/blueocean 1.4.2 38822be1d491 3 years ago 447MB
tomcat 9.0 ea872b677dfa 3 years ago 678MB
openjdk 8-jdk 891c9734d5ab 3 years ago 726MB
jenkins/jenkins 2.112-alpine 481b49e06417 3 years ago 223MB
microsoft/dotnet 2.1-sdk-alpine d19f9b663c61 3 years ago 1.54GB
microsoft/dotnet 2.1-runtime-alpine c0aab70b7f6c 3 years ago 87.5MB
node 8-alpine adc4b0f5bc53 3 years ago 68.1MB
tomcat 8.0 7aa9e977bdb9 3 years ago 456MB
tomcat 7.0 b6002d3fc5ab 3 years ago 456MB
redis latest 4760dc956b2d 3 years ago 107MB
ubuntu latest f975c5035748 3 years ago 112MB
alpine latest 3fd9065eaf02 3 years ago 4.14MB
jenkins/jenkins 2.92 cf8d6668ff13 3 years ago 813MB
microsoft/dotnet 1.1.1-sdk a97efbca0c48 3 years ago 879MB
microsoft/dotnet 1.1.1-runtime 76280f7f53f6 3 years ago 251MB
jenkins 2.46.1 51c5d6c8e9a2 4 years ago 713MB
jenkins 1.651.1-alpine 8a3f0ec8fe3a 4 years ago 254MB
benhall/dind-jenkins-agent latest d97d6673e8f9 5 years ago 659MB
步骤6 - 使用刚刚构建的镜像启动容器
$ docker run -d -p 80:80 thesre/jenkins-demo:1
899c965888d530d472d5f6513008317670015973095339b839b994236c83fbcb
$
$ curl host01 #访问网站获得输出,说明容器正确启动。
<h1>This request was processed by host: 899c965888d5</h1>
$