docker持续集成部署、csphere监控平台【转:http://blog.csdn.net/java_dyq/article/details/51997024】

为什么使用Docker

“

从我个人使用的角度讲的话  部署来的更方便 

只要构建过一次环境 推送到镜像仓库 迁移起来也是分分钟的事情 

虚拟化让集群的管理和控制部署都更方便

hub.docker.com 里面的镜像也很方便 节约了很多自己生成镜像的时间

相当于提高了复用率

”

  

安装Docker

“

 我这里使用 Ubuntu 14.04 系统上安装 

1
curl -s https://get.docker.io/ubuntu/ | sudo sh

Ubuntu 其他版本可能需要先升级一下内核 

详细可参考 这里

 

”

构建持续集成环境(Java)

       下来开始我们今天的主题 构建持续集成与自动部署的Docker集群 

“

持续集成的目的

 让我们每次更新了代码提交到Git仓库后就自动运行测试构建新版本 自动部署到测试或集群 从来提高生产效率 告别重复的劳动

”

持续集成和部署的原理

“

我们用到的所有基础设施我们都将使用Docker 部署

1. 推送到git 仓库   

2. jenkine pull git代码  运行 编译镜像 进行编译  

3. 打包生成的代码 生成一个新版本的镜像 推送到仓库  删除当前容器  重新运行新版本镜像   

4. 监控系统 

5  docker   log 集中管理  LEK

 

本文使用的是Java的构建方式 除了第三步以外 其他工程也都是一样的

”

 

  •  构建Gitlab

  

“

  Gitlab作为代码仓库是我们环节的第一步 (如果使用github 或osc git 可以跳过这个步骤)

 为了方便构建我们先安装一下docker编配工具 Docker-compose 

1
2
3
#使用python 包管理工具pip安装 
apt-get install python-pip python-dev
pip install -U docker-compose

 一般构建依赖关系比较复杂的容器都可以用docker-compose来配置

使用说明可以看一下 这里

我们使用hub.docker.com 的  sameersbn/gitlab 镜像来快速构建 

 docker-compose.yml 文件如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 gitlab:
    image: sameersbn/gitlab
    ports:
      - "22:22"
      - "80:80"
    links: 
      - gitlab-redis:redisio
      - gitlab-postgresql:postgresql
    environment:
      - GITLAB_PORT=80 
      - GITLAB_SSH_PORT=22
      - GITLAB_SECRETS_DB_KEY_BASE=long-and-random-alpha-numeric-string
    restart: always
 
 gitlab-redis:
    image: sameersbn/redis
    restart: always
 
 gitlab-postgresql:
    image: sameersbn/postgresql:9.4-12
    environment:
        - DB_NAME=gitlabhq_production
        - DB_USER=gitlab
        - DB_PASS=password
    restart: always
1
2
#执行如下命令 就可以构建gitlab了 
docker-compose up -d

运行 docker ps 查看一下 可以看到已经启动成功了  

访问一下启动主机的 你映射的端口即可访问 我这里是80

”
  • 构建Docker私有仓库

“

同样我们还需要一个Docker仓库来存放我们发布的镜像版本(使用公有仓库如 docker hub 可以跳过此步骤)

我们采用 官方镜像 registry 运行

运行如下命令即可

1
2
docker run -d  --restart=always --name registry \
 -v  /mnt/docker/registry:/tmp/registry  -p 5000:5000 registry

运行docker ps 即可查看 运行情况

相应命令

1
2
docker pull   仓库ip:仓库端口/项目名     拉取镜像
docker push    仓库ip:仓库端口/项目名    推送镜像

问题 

docker私有仓库 拉取/推送 失败 提示不能使用http 连接   

  •   方法1 设置仓库https 证书即可  推荐 详情可见

  •   方法2 在docker启动参数里面添加 –-insecure-registry  0.0.0.0/0   然后重启docker 

”
  • 构建Jenkins

“

我们使用jenkins 来持续集成 

构建同样十分简单 我们使用的是 hub.docker.com 的  jayqqaa12/jenkins 镜像

执行命令

1
2
3
docker run  docker run  -d  -p 8080:8080 \
--name jenkins  --restart=always -v /mnt/jenkins_home:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock   jayqqaa12/jenkins

参数说明:  

1
2
 -v /mnt/jenkins_home:/var/jenkins_home 
  # 映射到本地磁盘
1
2
-v /var/run/docker.sock:/var/run/docker.sock  
#映射主机的docker到容器里面 这样在容器里面就可以使用主机安装的 docker 了

然后访问8080 端口就可以了

默认用户密码 admin admin 

”
  • Docker-Swarm 集群

“

  我们使用Docker-Swarm 来部署 docker 集群  

  部署同样十分简单

1
2
3
4
5
6
7
8
9
10
#运行这个这个命令后会返回一个token来替换下面命令的<token>
 docker run --rm swarm create 
  
 # 运行节点 管理集群swarm  来管理所有节点 
 docker run -d --name swarm-manage --restart=always -p \
 2376:2375 swarm manage token://<token>
  
 #在节点服务器上运行 添加节点到 集群中  
 docker run -d --restart=always --name swarm-agent swarm \
 join --addr=当前服务器的ip:2375 token://<token>
1
2
3
#查看集群的节点信息 
 
docker -H 管理节点的ip:2376 info

如图可见 当前集群有一个节点 

在集群运行容器 

 同理只要在  添加 -H 管理节点的ip:2376 就可以在集群上运行容器了 

1
2
docker -H 管理节点的ip:2376 run  xxx   #运行容器
docker -H 管理节点的ip:2376 ps  xxx    #查看集群容器运行情况

 

”

 

  • Hello World 

“

 基础的设施我们已经搭建好了 下面我们就可以开始测试一下

1)这里我新建了一个javaEE maven 项目 很简单写了一个 index.html 

2)在 gitlab新建一个docker-hello-world 项目仓库

3) 编写打包镜像的Dockerfile     和部署到集群的 脚本 (放在当前项目里面就可以了)

Dockerfile  

  很简单的步骤 把编译好的war 放入镜像就可以了 

这里使用的是 官方 tomcat 镜像

1
2
3
FROM tomcat:8-jre8
RUN rm -rf /usr/local/tomcat/webapps
ADD ./target/ROOT.war /usr/local/tomcat/webapps/ROOT.war

build.sh  部署使用的脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/bin/bash
 
#build in jenkins 
 
# 你的docker 仓库的地址 
REG_URL=XXX
 
#你的swarm manage 节点的地址
SWARM_MANAGE_URL=xx:2376
 
#根据时间生成版本号
TAG=$REG_URL/$JOB_NAME:`date +%y%m%d-%H-%M`
 
#使用maven 镜像进行编译 打包出 war 文件 (其他语言这里换成其他编译镜像)
docker run --rm --name mvn  -v /mnt/maven:/root/.m2   \
 -v /mnt/jenkins_home/workspace/$JOB_NAME:/usr/src/mvn -w /usr/src/mvn/\
 maven:3.3.3-jdk-8 mvn clean install -Dmaven.test.skip=true
  
#使用我们刚才写好的 放在项目下面的Dockerfile 文件打包 
docker build -t  $TAG  $WORKSPACE/.
docker push   $TAG
docker rmi $TAG
 
 
# 如果有以前运行的版本就删了 
if docker -H $SWARM_MANAGE_URL ps -a| grep -i $JOB_NAME; then
        docker -H $SWARM_MANAGE_URL rm -f  $JOB_NAME
fi
 
#运行到集群
docker -H $SWARM_MANAGE_URL run  -d  -p 80:8080  --name $JOB_NAME  $TAG

 

4)在jenkins 上新建一个docker-hello-world 项目  

选择自由风格即可

 

设置一下git仓库地址

 

设置一下触发器 为了方便起见这里设置 每分钟拉取一下  也可以设置一下  gitlab hook 

同时设置一下 构建要执行的脚本 就执行我们刚才写好的脚本即可

 

5) 那么开始 推送到我们的仓库 

 然后查看jenkins console 就可以看到执行的过程了 已经看到 已经执行成功了 

 

访问一下 已经部署到集群了  (关于集群的负载均衡 部署这里就不讲了)

 

 

6)更新版本

 修改一下index.html 然后 再次推送 

等待2~3分钟后我们就可以看到已经重新部署成功了 就是怎么简单 

 

 

问题1  为什么要把war包打包进容器 而不是挂载新的war包 

解答:docker的理念是一个整体 一个整体的运行环境而不是单纯的war包 更适合整体迁移 

 

问题2:这样镜像不会很大么 下载会不会很不方便

解答:因为docker的镜像是多层依赖的所以 除了第一次下载慢一点以后都会复用之前相同的层 

          所以下载的是不同的 部分 在本实例中只是war包的部分

 

”

 

  • Docker管理监控系统

“

如何管理容器 查看容器运行情况 日志等都不太方便 我们需要搭建一个监控平台

这里我们采用csphere 的docker管理平台、

 在管理节点 执行以下命令就可以安装了 管理程序

1
2
curl -SsL -o /tmp/csphere-install.sh https://csphere.cn/static/csphere-install-v2.sh
sudo env ROLE=controller CSPHERE_VERSION=1.0.1 /bin/sh /tmp/csphere-install.sh

在集群的节点安装Agent

访问controller A主机的1016端口 点击左侧的“主机”菜单,进入主机列表页面,

点击添加主机并复制脚本,在Agent主机安装Agent程序  

然后就可以查看和管理 docker容器了   具体查看文档这里就不多提了

posted @ 2017-02-15 15:13  zipon  阅读(1663)  评论(0)    收藏  举报