文档章节

使用Docker构建持续集成与自动部署的Docker集群

12叔
 12叔
发布于 2016/03/09 15:15
字数 2233
阅读 15171
收藏 392

为什么使用Docker

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

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

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

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

相当于提高了复用率

  

安装Docker

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

curl -s https://get.docker.com/ | 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 

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

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

使用说明可以看一下 这里

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

 docker-compose.yml 文件如下

 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
#执行如下命令 就可以构建gitlab了 
docker-compose up -d

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

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

  • 构建Docker私有仓库

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

我们采用 官方镜像 registry 运行

运行如下命令即可

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

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

相应命令

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 镜像

执行命令

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

参数说明:  

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

然后访问8080 端口就可以了

默认用户密码 admin admin 

  • Docker-Swarm 集群

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

  部署同样十分简单

#运行这个这个命令后会返回一个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>
#查看集群的节点信息 

docker -H 管理节点的ip:2376 info

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

在集群运行容器 

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

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

 

 

问题

查看节点发现无法连接  请在节点 docker配置文件  /etc/init/docker.conf 里面 找到如下一行 添加启动参数

 --insecure-registry 0.0.0.0/0 # 设置仓库为http访问  -H unix:///var/run/docker.sock  -H 0.0.0.0:2375 #打开节点对外通信接口 --label label_name=docker-1 # 设置一下label 方便区分

 

 

 

  • Hello World 

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

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

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

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

Dockerfile  

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

这里使用的是 官方 tomcat 镜像

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

build.sh  部署使用的脚本

#!/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管理平台、

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

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容器了   具体查看文档这里就不多提了

 

  • 更多

日志统一管理平台 ELK

docker集群动态伸缩

等等...

且听我们下回分解  

 

  • 其他

注意 本文的docker swarm 安装使用 方式已经过期了 请查看最新的

docker-hello-world 项目代码

© 著作权归作者所有

共有 人打赏支持
12叔

12叔

粉丝 148
博文 27
码字总数 55075
作品 3
杭州
程序员
私信 提问
加载中

评论(29)

筷子eason
筷子eason
docker-compose.yml 文件 运行后 数据库有权限问题 到底咋回事 这个应该不是你当时使用的代码吧
筷子eason
筷子eason
docker-compose.yml 文件 运行有权限问题 到底咋回事 这个应该不是你当时使用的代码吧
lzxianren
lzxianren
用了你的方案,发现还是需要安装jdk。但是你的linux版本好像是apline的,jenkins 下载了jdk8之后不能运行。不知道这个该怎么办?
具体异常就是:
Cannot run program "/var/jenkins_home/tools/hudson.model.JDK/jdk8/bin/java" (in directory "/var/jenkins_home/workspace/entermanager"): error=2, No such file or directory
12叔
12叔

引用来自“无敌大金金”的评论

这东西看着不错 好是好但是本地测试每次打WAR包效率慢 生产环境 不敢这样发布~ 这样做的目的是什么呢?为了用软件而用软件么? 我是小白勿喷~:octocat:
1.分布式环境分发
2.软件安装环境的隔离 做到真正的一次部署 到处运行

另外 本地测试用不用无所谓 生产环境才有必要性
无敌大金金
无敌大金金
这东西看着不错 好是好但是本地测试每次打WAR包效率慢 生产环境 不敢这样发布~ 这样做的目的是什么呢?为了用软件而用软件么? 我是小白勿喷~:octocat:
1
15A
提供的jenkins好像不支持1.12最新docker的swarm命令----docker -H $SWARM_MANAGE_URL service create --publish 80:8080 --name $JOB_NAME $TAG(build.sh脚本中),jenkins console报错:docker: 'service' is not a docker command.。。。。这个build.sh脚本里面的命令是不是jenkins从新过滤了一下,然后一句句的执行了。。docker的命令交给了jenkins的宿主机执行了???我才折腾docker和jenkins这些东西,不是特别清楚,,求指教
3
332812749
m
v
viviju
mark
pengqiuyuanfj
pengqiuyuanfj
先mark下,楼主 jayqqaa12/jenkins 镜像的Dockerfile 可否方便参考一下 https://hub.docker.com/r/jayqqaa12/jenkins/
A
Ace_Xiong
mark
Docker学习路线图 (持续更新中)

Docker学习路线图 最近很多阿里内部的同学和客户私信来咨询如何学习 Docker 技术。为此,我们列了一个路线图供大家学习Docker和阿里云容器服务。这个列表包含了一些社区的优秀资料和我们的原...

易立
2016/05/09
0
0
Jenkins X将自动化管道引入Kubernetes

Jenkins持续集成服务器一直是DevOps浪潮中的重要组成部分。作为持续集成与持续部署环境中自动化任务的中央协调服务器,全球的开发和运营团队已经积极接纳Jenkins,并为之构建了多种扩展及构建...

Docker
04/14
0
0
【技术干货】Docker精华学习资料集锦,老司机快上车

【技术干货】Docker精华学习资料集锦,老司机快上车 Docker是一个开源的应用容器引擎,提供了一种在安全、可重复的环境中自动部署软件的方式,允许开发者将他们的应用和依赖包打包到一个可移...

阿里云官方博客
2017/03/16
188
2
3 天烧脑式基于Docker的CI/CD实战训练营 | 北京站

持续集成(Continuous integration)是一种软件开发实践。 它倡导团队开发成员必须经常集成他们的工作,甚至每天都可能发生多次集成。 与持续集成相关的,还有两个概念,分别是持续交付(Con...

DockOne
2017/07/25
1
0
Docker技术浅谈:私有化部署的优势以及在顶象内部的应用实践

顶象全景式业务安全风控体系基于新一代风控体系构建,并采用Docker技术进行私有云和公有云部署。本文主要和大家分享下Docker容器技术和顶象风控系统私有化部署的优势以及Docker容器技术在顶象...

顶象技术
2017/11/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Docker的架构与自制镜像的发布

一. docker 是什么 大家都知道虚拟机吧,windows 上装个 linux 虚拟机是大部分程序员的常用方案。公司生产环境大多也是虚拟机,虚拟机将物理硬件资源虚拟化,按需分配和使用,虚拟机使用起来...

程序猿拿Q
13分钟前
0
0
ubuntu下pycharm调用Hanlp实践分享

前几天看了大快的举办的大数据论坛峰会的现场直播,惊喜的是hanlp2.0版本发布。Hanlp2.0版本将会支持任意多的语种,感觉还是挺好的!不过更多关于hanlp2.0的信息,可能还需要过一段时间才能看...

左手的倒影
21分钟前
1
0
Python监控服务器实现邮件微信报警[未测试]

本文中笔者暂时实现的只有cpu和内存的监控,python可以监控许多的主机信息,网络,硬盘,机器状态等,以下是代码的实现,代码可以实现windows和linux的监控。 实验环境:Ubuntu16.04和windo...

dragon_tech
26分钟前
1
0
Spring Boot 返回 JSON 数据,一分钟搞定!

在 WEB 项目中返回 JSON 数据是常见的交互形式,在 Spring Boot 中这一切都变得十分简单。So easy!!! 你所需具备的基础 什么是 Spring Boot? Spring Boot 核心配置文件详解 Spring Boot 开启...

Java技术栈
32分钟前
2
0
保护Hadoop集群三大方法

大约在两年前,开源数据库解决方案MongoDB以及Hadoop曾遭受过大量恶意攻击,这些攻击后被统称为“勒索软件”,因为其攻击者会擦除或加密数据,然后向被攻击者索要资金以恢复数据。自今年以来...

linuxCool
38分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部