在容器中运行Jenkins部署主机中的docker应用

2017年05月14日 17:24:36

原来的部署方式

原来我用的部署方案是这样的:

在主机上安装Jenkins,然后在Jenkins的任务中运行docker命令,在主机里部署应用。

基本逻辑如下:

  • Jenkins任务通过git更新代码
  • 运行docker build,从最新的代码中生成一个image
  • 用docker run运行这个image完成一个应用实例的部署

相对来说还是挺简单的。

但是这次整的一个新的服务器,我实在不想再安装Jenkins了,你们懂的,JAVA应用的安装都是很麻烦的。就打算pull一个Jenkins的image来放docker里跑。那么问题来了:如何让一个跑在container里的Jenkins把应用部署到host环境上?总不能在container里创建新的container吧。

解决方案

解决方案就是fabric,本质上是ssh。

方法如下:

  • build一个Jenkins image,在其中加入fabric
  • 运行这个container的时候加入host机
  • 在fabfile.py里加入一个role为host机用户
  • 在fabfile.py用这个用户运行部署脚本
  • 在Jenkins任务里调用这个fabric部署脚本

参考如下Jenkins Dockerfile,用的基础image是alpine版,这个比较小。

repositories里放的是国内镜像源,比原配的源快很多。

这个Dockerfile主要做的事情就是安装fabric。

FROM jenkins:alpine
MAINTAINER raptor<raptor.zh@gmail.com>
USER root
COPY repositories /etc/apk/
RUN apk update && apk add tzdata \
        && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
        && ( echo "Asia/Shanghai" > /etc/timezone ) \
        && apk add python py-pip py-paramiko \
        && pip install --upgrade pip -i https://pypi.doubanio.com/simple \
        && pip install fabric -i https://pypi.doubanio.com/simple
USER jenkins

用如下命令构建并启动Jenkins container,注意其中加入了dockerhost主机:

docker build -t myjenkins .
docker run -d -p 127.0.0.1:8080:8080 -v /var/lib/jenkins:/var/jenkins_home --add-host=dockerhost:`/sbin/ip route | /usr/bin/awk '/docker0/ { print $NF }'` --name=jenkins myjenkins

另外,jenkins_home被映射到了host上的/var/lib/jenkins,这样的话就可以在jenkins任务中把部署代码checkout到这里。

比如:

cd /var/jenkins_home
git checkout git@github.com:yourname/yourproject.git

为了能够登录代码仓库pull代码以及登录host进行部署,需要在/var/lib/jenkins/.ssh里创建ssh key。并且把公钥配置到代码仓库的部署公钥和host的jenkins用户的authorized_keys。

然后SSH到host里运行部署脚本,把这里的代码部署到一个新的image里,再启动成一个container。一个部署任务的fabfile例子如下:

from fabric.api import *

env.roledefs={
    'jenkins': ['jenkins@dockerhost']
}

@roles('jenkins')
def deploy_app():
    with cd('/var/lib/jenkins/yourproject'):
        run('docker build -t yourimage .')
        run('docker run -d --name yourproject yourimage')

这里就是在host机上以jenkins用户运行docker的build/run构建项目image并启动项目container。

需要注意的是,在Jenkins container里,jenkins用户的UID是1000,所以host机上也应该创建一个UID为1000的jenkins用户,否则可能会有访问权限上的问题。当然,把二者都指定一个其它的ID会更好。

另外,host里的这个jenkins用户必须能够通过SSH登录(如果你在sshd_config里限制了只能部分用户登录的情况),而且如前面所说,应该配置ssh key登录,即,把Jenkins container里的jenkins用户的公钥添加到host的jenkins用户的authorized_keys里。

Docker学习总结(13)——从零开始搭建Jenkins+Docker自动化集成环境

本文只简单标记下大概的步骤,具体搭建各个部分的细节,还请自行搜索。第一、二部分只是对Jenkins和Docker的简单介绍,熟悉的同学请直接跳到第三部分。 一、关于Jenkins ...
  • u012562943
  • u012562943
  • 2016年09月05日 10:10
  • 32898

jenkins构建Docker 镜像(基于Jenkins的Docker镜像及Jenkins插件)

前言:jenkins有Docker镜像,而之前我们说过使用jenkins打包Docker镜像,那么可否用jenkins的Docker镜像打包Docker镜像呢?...
  • gsying1474
  • gsying1474
  • 2016年04月11日 22:41
  • 9111

Docker部署Jenkins并发布web服务

工作需要,需要搭建Jenkins,编译java项目,并且打包发布web服务。这样会大大的节省开发人员和测试人员的工作量,也为发布产品提供方便,所以构建了这样的一个系统,相对来说比较简单,只是对于初次接...
  • bxy21cn
  • bxy21cn
  • 2016年08月03日 18:49
  • 3108

基于jenkins构建应用的docker镜像做持续集成和部署

为了做持续的集成和部署,引入了jenkins,利用jenkins来构建应用的docker镜像并push到私有仓库,然后再基于应用的docker镜像来发布项目,这样减少了很多的手动操作,基本能实现持续集...
  • JThink_
  • JThink_
  • 2017年04月27日 10:11
  • 4391

Jenkins

Jenkinsjenkins 一个持续集成和交付的服务器。Docker安装这里使用docker镜像的方式安装,如果不懂docker 请移步[docker.io]。下载如果比较慢请使用国内镜像库。do...
  • pretent
  • pretent
  • 2017年01月02日 13:52
  • 1164

使用jenkins、docker、consul、nginx搭建支持自动化构建部署以及弹性伸缩的集群系统详细教程

一、前言这是我第一篇博文,中间可能存在许多纰漏,所以请大家不吝指教!另外在文中API及原理性的东西仅做简单提及,因为网上有很多,讲的很详细,我尽量将篇幅放在记录过程上,如有疑惑,欢迎评论。1.1 搭建...
  • qq_22152261
  • qq_22152261
  • 2017年07月25日 22:12
  • 1501

Centos7上使用docker部署jenkins

安装docker依次执行下面代码,含义分别是: 安装docker 启动docker服务 查看docker状态(是否启动) yum install Docker service docker start...
  • grape875499765
  • grape875499765
  • 2017年08月31日 20:07
  • 319

jenkins docker springcloud 自动化

由于公司要做微服务所以我对jenkins docker springcloud如何集成起来做自动部署做了一些研究,这里写出来也算是结自己一个总结,同时也希望能帮助到其他人。   我这里环境如下: ...
  • think_xyl
  • think_xyl
  • 2017年09月12日 09:33
  • 1207

使用docker构建jenkins镜像并运行容器

https://my.oschina.net/donhui/blog/470372?p={{currentPage+1}}   摘要: 使用docker构建jenkins镜像并运行容器 目录:...
  • chengly0129
  • chengly0129
  • 2017年04月20日 15:55
  • 2486

把玩jenkins docker镜像遇到的volume权限问题

这两天在玩jenkins,但是在挂在数据卷的时候遇到了权限问题,如下,docker启动命令docker run -d -v /root/jenkins:/var/jenkins_home -P --n...
  • minicto
  • minicto
  • 2017年06月21日 12:41
  • 1293
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在容器中运行Jenkins部署主机中的docker应用
举报原因:
原因补充:

(最多只允许输入30个字)