在容器中运行Jenkins部署主机中的docker应用
2017-05-14 17:24
876 查看
原来的部署方式
原来我用的部署方案是这样的:在主机上安装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 registry部署(容器化运行,ssl证书生成,nginx配置)
- 使用docker构建jenkins镜像并运行容器
- 在 Docker 中运行 MySQL:多主机网络下 Docker Swarm 模式的容器管理
- 基于jenkins构建应用的docker镜像做持续集成和部署
- docker应用-5(使用overlay 网络进行容器间跨物理主机通信)
- 使用docker构建jenkins镜像并运行容器
- 使用docker构建jenkins镜像并运行容器
- 云主机Docker部署第一个应用helloworld
- docker应用-5(使用overlay 网络进行容器间跨物理主机通信)
- docker学习2|在容器中部署nginx并保存、运行容器
- NET Core Web 应用部署到 Docker 中运行
- docker web应用多容器开发环境部署
- docker 集群(单主机)部署web 应用入门(Nginx)
- 将Spring-boot应用部署到Docker容器
- 实现lamp docker数据容器(mysql)与应用容器(apache+php)独立运行
- 立足Docker运行MySQL:多主机网络下Docker Swarm模式的容器管理
- Docker实践 - 使用maven插件自动部署web应用至Docker容器的tomcat
- docker应用-5(使用overlay 网络进行容器间跨物理主机通信)
- 使用maven插件自动部署web应用至Docker容器的tomcat
- 在docker宿主机上查找指定容器内运行的所有进程的PID