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

使用Docker构建持续集成与自动部署的Docker集群的更多相关文章

  1. Jenkins+Svn+Docker搭建持续集成环境 自动部署

    一.准备工作: 两台服务器:192.168.206.212,192.168.206.213 自己新建一个maven项目 其中两台机子做下面的软件配置 212机子: 安装expect并配置: 安装jen ...

  2. 利用Travis CI+GitHub实现持续集成和自动部署

    前言 如果你手动部署过项目,一定会深感持续集成的必要性,因为手动部署实在又繁琐又耗时,虽然部署流程基本固定,依然容易出错. 如果你很熟悉持续集成,一定会同意这样的观点:"使用它已经成为一种标 ...

  3. Jenkins+Maven+Svn搭建持续集成环境持续集成和自动部署

    Jenkins和Hudson有很深的渊源,Jenkins目前更新频繁,目前选用Jenkins为持续集成工具和自动部署 Jenkins的使用有很多的介绍,主要记录如下要点: 192.168.1.240: ...

  4. gitlab持续集成,自动部署

    写这篇文章的目的是,实现提交代码到gitlab上的一个项目时,自动打包,并将包发布到另一台服务器上,重启tomat.如有问题,可以联系本人QQ:409838567 gitlab-ci,是基于gitla ...

  5. 使用 svn+maven+jenkins(hudson)+Publish Over SSH plugins 构建持续集成及自动远程发布体系(转)

    1.安装jenkins 2.浏览器访问jenkins主页 http://192.168.0.1:8080/,点击“系统管理” 3.在插件管理中,安装Publish Over SSH插件 4.在系统设置 ...

  6. 基于TeamCity的asp.net mvc/core,Vue 持续集成与自动部署

    一 Web Server(Windows)端的配置 1.配置IIS,重要的是管理服务 1.1 配置FTP(前端NPM项目需要) 该步骤略,如果是在阿里云ESC上,需要开启端口21(用来FTP认证握手) ...

  7. 阿里云 持续集成环境自动部署cordova项目热更新脚本

    linux脚本: #!/bin/sh rm -rf /home/tomcat/xiecang_hybird_web/xiecang_hybird_web.zip rm -rf /home/tomcat ...

  8. 使用gitlab构建基于docker的持续集成(三)

    使用gitlab构建基于docker的持续集成(三) gitlab docker aspnetcore 持续集成 构建发布思路: aspnetcore 下的dockerfile编写 发布docker- ...

  9. 使用gitlab构建基于docker的持续集成(一)

    使用gitlab构建基于docker的持续集成(一) gitlab docker aspnetcore 持续集成 开篇 整体环境规划 准备工作 CA证书 虚拟机系统:安装Centos7.3 3.设置C ...

随机推荐

  1. Android UI高级交互设计Demo

    首先:是google的新标准 Google Material design 开源项目 1.直接拿来用!十大Material Design开源项目 2.收集android上开源的酷炫的交互动画和视觉效果 ...

  2. ASP.NET MVC+Entity Framework 4.1访问数据库

    Entity Framework 4.1支持代码优先(code first)编程模式:即可以先创建模型类,然后通过配置在EF4.1下动态生成数据库. 下面演示两种情形: 1.代码优先模式下,asp.n ...

  3. oracle 导入txt

    没有Oraclehoume的情况下,执行下环境变量文件 sqlldr userid= DM/DM control = /home/oracle/libc/load.ctl load data infi ...

  4. dedecms导入编辑器

    <?php GetEditor("info","",450,"Diy"); ?>

  5. poj3162 Walking Race

    题目大意:给一个树形图n个点(n-1条边),XXX要练习竞走,每次选定一个点k作为开始点,每次走从k开始能走的最长的一条路径(不要重边).要求出最长的连续的这样的k,假设连续有kx个,前提:这样kx条 ...

  6. Spark源码学习2

    转自:http://www.cnblogs.com/hseagle/p/3673123.html 在源码阅读时,需要重点把握以下两大主线. 静态view 即 RDD, transformation a ...

  7. C#学习日志 day 1 ------ hello C# !

    首先是C#的编译器的安装.这里用vs2013.我用的是Windows 8.1系统,所以安装起来并不难. 双击vs_ultimate.exe 逐步安装就好.这里用校园邮箱在dream spark 上进行 ...

  8. 快排 quicksort 快速排序

    首先看这个 http://www.cnblogs.com/morewindows/archive/2011/08/13/2137415.html 看完后就没有什么不理解的了... PS 注意 凡是在一 ...

  9. Linux同平台Oracle数据库整体物理迁移

    Linux同平台数据库整体物理迁移需求:A机器不再使用,要将A机器的Oracle迁移到B机器.之前写过类似需求的文章: http://www.linuxidc.com/Linux/2015-05/11 ...

  10. 激活工具 – Microsoft Toolkit 2.4.7

    Microsoft Toolkit是一款很出名的Windows/Office激活工具,最早是因为激活Office 2010出名的,想必不少人也用过吧?Microsoft Toolkit从2.4.1版本 ...