本文主要介绍利用docker+jenkins+gitlab构建可持续发布python的架构,jenkins,gitlab并没有使用传统安装方法,全部为容器运行。docker的安装这里就不再赘述了,可以参考docker官方文档
首先我们要有一个代码库统一管理代码,个人比较喜欢git,所以使用gitlab去管理。怎么利用docker安装gitlab呢。其实很简单啦!
docker pull gitlab/gitlab-ce
mkdir -p /chenxf/gitlab/config
mkdir -p /chenxf/gitlab/logs
mkdir -p /chenxf/gitlab/data
sudo docker run --detach \
--hostname gitlab.example.com \
--publish 4431:443 --publish 8090:80 --publish 223:22 \
--name gitlab \
--restart always \
--volume /chenxf/gitlab/config:/etc/gitlab \
--volume /chenxf/gitlab/logs:/var/log/gitlab \
--volume /chenxf/gitlab/data:/var/opt/gitlab \
gitlab/gitlab-ce:latest
docker logs -f gitlab
查看容器日志,运行成功,就可以http://ip:8090登录了,初始会设置初始密码,登录进去之后就可以创建项目了。
git init
初始化git 仓库,然后git add .
,git commit
提交到本地仓库,对了,如果你有些文件不想提交到git上怎么办,创建个.gitignore文件,将你不希望提交的文件写进去即可。 git remote add db http://10.15.1.33:8090/root/myproject.git
这里仓库地址就是我们刚刚复制的地址,对了!,因为gitlab默认端口为80,而我在运行容器时做了映射,所以这里要加上端口号,不然可是连接不上我们的git的。 git add db master
然后输入用户名密码即可。登录gitlab查看代码仓库,可以看到代码推送过来了。 jenkins同样我们利用docker来运行:
拉取镜像
docker pull jenkins/jenkins:lts
接下来该做啥了?运行容器?wait on,这里我们先停下,思考一个问题,
怎么在jenkins容器里使用docker命令去build镜像,推送镜像,运行容器呢??
哦,你可能会说,那简单,在jenkins里安装个docker不就完了么???好吧,这个也是我考虑过的,可是这个方法也太那啥了吧,而且官方也不推荐运行docker in docker的方式,这里我们换个思路,可以用 ssh解决?的确可以,但是,等等。我们有万能的python啊。为什么不能用python调用我们要部署的远程主机上的docker呢??这样只要运行python脚本就好了啊,啊哈哈,这倒是个好方法哈,ok,想好就干。
首先在主机上开放docker远程端口,因为我这是内网环境所以可以这样搞,要是外网环境可就得多想想了,这样等同于把你主机暴露在外了(连密码都不需要!!)
怎么利用python调用docker呢,官方已经有API给我们使用了。
我们只需要安装个库:
pip install docker
开放docker端口:
vim /etc/docker/daemon.json
systemctl daemon-reload
systemctl restart docker
现在我们试下:
[root@chenxf ~]#python
>>>import docker
>>>client = docker.DockerClient("tcp://10.15.1.33:2376")
>>>client.containers.list()
>>>[, 897d64703b>]
说明ok了,接下来该做什么?那么我们得有个build.py脚本去build镜像,运行容器。
现在开始编写脚本:
import docker
container_name = 'myproject' #容器名
image_name = 'myproject:v1'#镜像名
port = {'8005/tcp': 8008}#要暴露的端口 -p 8008:8005
client = docker.DockerClient('tcp://10.15.1.33:2376')
myproject_container_id = client.containers.list(all=True, filters={'name':container_name})
for container in myproject_container_id: #先把以前的容器删除如果有
container.remove(force=True)
client.images.build(path='./', tag=image_name)# build镜像,成功后你也可以推送到镜像仓库
client.containers.run(image=image_name, name=container_name, ports=port, detach=True)#运行镜像
我们刚刚拉下来的jenkins镜像里可没有docker库,所以我们要在jenkins镜像基础之上构建一个含有docker库的新镜像。下面是我的Dockerfile:
FROM jenkins/jenkins:lts
MAINTAINER chenxf@chinaskycloud.com
USER 0 # 使用root用户不然没法进行下面操作。
RUN echo deb http://mirrors.163.com/debian/ jessie main non-free contrib \
deb http://mirrors.163.com/debian/ jessie-updates main non-free contrib \
deb http://mirrors.163.com/debian/ jessie-backports main non-free contrib \
deb-src http://mirrors.163.com/debian/ jessie main non-free contrib \
deb-src http://mirrors.163.com/debian/ jessie-updates main non-free contrib \
deb-src http://mirrors.163.com/debian/ jessie-backports main non-free contrib \
deb http://mirrors.163.com/debian-security/ jessie/updates main non-free contrib \
deb-src http://mirrors.163.com/debian-security/ jessie/updates main non-free contrib > /etc/apt/sources.list && \
apt-get update -y && apt-get install -y python-pip && apt-get clean && pip install -i https://pypi.douban.com/simple docker
构建镜像:
docker build -t $IMAGENAME:$TAG .
好了,接下来就可以运行jenkins了。现在本地创建一个jenkins用户,
然后mkdir -p /opt/jenkins_home
用来存放jenkins数据。将这个目录所属用户改为jenkinschown -lR jenkins /opt/jenkins_home
然后id jenkins
得到jenkins用户id
运行jenkins:
docker run -d -v /opt/jenkins_home:/var/jenkins_home -p 8088:8080 \
-p 50002:50000 --name jenkins -u $jenkinsId $IMAGENAME:$TAG
然后查看日志,我们会看到一个jenkins密码这个复制下来接下来会有用:
初始启动需要点时间,耐心等待
docker logs -f jenkins
登录http://ip:8088/输入刚刚密码,创建用户密码配置插件等安装完插件就可以登录到主页了。
配置项目