为什么使用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持续集成部署、csphere监控平台【转:http://blog.csdn.net/java_dyq/article/details/51997024】的更多相关文章

  1. docker 进程监控 Dumb-Init进程信号处理 --转自https://blog.csdn.net/tiger435/article/details/54971929

    随着docker及Kubernetes技术发展的越来越成熟稳定,越来越多的公司开始将docker用于生产环境的部署,相比起物理机上直接部署,多了一层docker容器的环境,这就带来一个问题:进程信号接 ...

  2. linux进程监控和简单的重启&服务的创建 参考自http://blog.csdn.net/lockheed_hong/article/details/73549837

    脚本文件 该脚本实现了一个检测进程是否存在,不存在的情况下重启进程并且记录日志. #! /bin/sh proc_name="console/queue/gift.php" # 进 ...

  3. jenkins+Docker持续化部署(笔记)

    参考资料:https://www.cnblogs.com/leolztang/p/6934694.html (Jenkins(Docker容器内)使用宿主机的docker命令) https://con ...

  4. 私有化轻量级持续集成部署方案--03-部署web服务(下)

    提示:本系列笔记全部存在于 Github, 可以直接在 Github 查看全部笔记 配置接口代理 前后端分离情况下,前端请求后端接口最常用的一种方式就是使用反向代理,反向代理会让浏览器认为是同源路径, ...

  5. Devops 开发运维高级篇之Jenkins+Docker+SpringCloud微服务持续集成——部署方案优化

    Devops 开发运维高级篇之Jenkins+Docker+SpringCloud微服务持续集成--部署方案优化 之前我们做的方案部署都是只能选择一个微服务部署并只有一台生产服务器,每个微服务只有一个 ...

  6. 最佳实战Docker持续集成图文详解

    最佳实战Docker持续集成图文详解 这是一种真正的容器级的实现,这个带来的好处,不仅仅是效率的提升,更是一种变革:开发人员第一次真正为自己的代码负责——终于可以跳过运维和测试部门,自主维护运行环境( ...

  7. [dotnet core]落地微服务特色的DevOps管道,持续集成/部署到kubernetes。

    目录 前言 目标 工具 - 最小的学习成本 方案 - 愿景 1. 持续集成 - CI 2. 持续部署 - CD 部署环境 1. 部署gitlab-runner 2. 注册gitlab-runner 搭 ...

  8. 使用Jenkins与Docker持续集成与发布NetCore项目(实操篇)

    使用Jenkins与Docker持续集成与发布NetCore项目(教程一) 原文地址:https://www.cnblogs.com/Jackyye/p/12588182.html 基本环境 该教程的 ...

  9. Centos7.4简单安装使用gitlab+maven+jenkins实现java代码的持续集成部署

    1.工具的简单介绍 gitlab--源代码版本管理控制工具 maven--java代码编译构建工具 jenkins--基于java开发的自动化持续集成部署工具 sonar--代码质量管理工具 2.gi ...

随机推荐

  1. EmitMapper系列之二:EmitMapper的使用小结

    EmitMapper的入门 EmitMapper引用 EmitMapper案例 最近公司开发项目前端使用一个js框架,后端使用ef,js前台读取的json采用实体的dto来进行生成. 在网上看到了Em ...

  2. Oracle 十大SQL语句

    oracle数据库十大SQL语句             操作对象(object) /*创建对象 table,view,procedure,trigger*/ create object object ...

  3. Java格式规范及注释的用法

    /* 需求:演示一个Hello World的Java小程序 思路: 1.定义一个类.因为Java程序都是定义在类中,Java程序都是以类的形式存在的,类的形式其实就是字节码的最终体现 2.定义一个主函 ...

  4. windows 下防火墙安全加固,配置规则

    netsh advfirewall firewall: 显示关于防火墙操作的常见命令的帮助信息 netsh advfirewall firewall show rule name=all dir=in ...

  5. 四次元新浪微博客户端Android源码

    四次元新浪微博客户端Android源码 源码下载:http://code.662p.com/list/11_1.html [/td][td] [/td][td] [/td][td] 详细说明:http ...

  6. nginx 安全配置文档

    1.配置文档中有多处明确写出了nginx的配置文件路径,该路径是测试环境中的路径,线上系统的nginx配置文件与文档中所写的路径可能不一样,在进行相关配置时,应以线上配置文件的实际路径为准. 线上系统 ...

  7. python day two

    今日内容: 1.常用数据类型及内置方法 2.文件处理 3.函数 列表类型: 定义: 在[]内,可以存放多个任意类型的值,并以逗号隔开. 一般用于存放学生的爱好,课堂的周期等等... 优先掌握的操作: ...

  8. 剑指offer8 旋转数组的最小数字

    一种错误写法: class Solution { public: int minNumberInRotateArray(vector<int> rotateArray) { int len ...

  9. JavaEE-05 分页与文件上传

    学习要点 新闻分页显示数据 新闻图片上传 JSP分页显示数据 分页 数据信息较多的的时候一般采用列表显示,方便展示信息: 数据量较大的时候一般采用列表加分页的方式显示,便于阅读. 分页方式:集合或者s ...

  10. 第1节 flume:7、flume的监控文件夹,实现数据收集到hdfs上

    1.2.2 采集案例 1.采集目录到HDFS 需求分析 结构示意图: 采集需求:某服务器的某特定目录下,会不断产生新的文件,每当有新文件出现,就需要把文件采集到HDFS中去 根据需求,首先定义以下3大 ...