使用Docker构建持续集成与自动部署的Docker集群
为什么使用Docker
“
从我个人使用的角度讲的话 部署来的更方便
只要构建过一次环境 推送到镜像仓库 迁移起来也是分分钟的事情
虚拟化让集群的管理和控制部署都更方便
hub.docker.com 里面的镜像也很方便 节约了很多自己生成镜像的时间
相当于提高了复用率
”
安装Docker
“
我这里使用 Ubuntu 14.04 系统上安装
1curl -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
123#使用python 包管理工具pip安装
apt-get
install
python-pip python-dev
pip
install
-U docker-compose
一般构建依赖关系比较复杂的容器都可以用docker-compose来配置
使用说明可以看一下 这里
我们使用hub.docker.com 的 sameersbn/gitlab 镜像来快速构建
docker-compose.yml 文件如下
12345678910111213141516171819202122232425
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
12#执行如下命令 就可以构建gitlab了
docker-compose up -d
运行 docker ps 查看一下 可以看到已经启动成功了
访问一下启动主机的 你映射的端口即可访问 我这里是80
”
构建Docker私有仓库
“
同样我们还需要一个Docker仓库来存放我们发布的镜像版本(使用公有仓库如 docker hub 可以跳过此步骤)
我们采用 官方镜像 registry 运行
运行如下命令即可
12docker run -d --restart=always --name registry \
-
v
/mnt/docker/registry
:
/tmp/registry
-p 5000:5000 registry
运行docker ps 即可查看 运行情况
相应命令
12docker 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 镜像
执行命令
123docker 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
参数说明:
12
-
v
/mnt/jenkins_home
:
/var/jenkins_home
# 映射到本地磁盘
12-
v
/var/run/docker
.sock:
/var/run/docker
.sock
#映射主机的docker到容器里面 这样在容器里面就可以使用主机安装的 docker 了
然后访问8080 端口就可以了
默认用户密码 admin admin
”
Docker-Swarm 集群
“
我们使用Docker-Swarm 来部署 docker 集群
部署同样十分简单
12345678910#运行这个这个命令后会返回一个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>
123#查看集群的节点信息
docker -H 管理节点的ip:2376 info
如图可见 当前集群有一个节点
在集群运行容器
同理只要在 添加 -H 管理节点的ip:2376 就可以在集群上运行容器了
12docker -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 镜像
123FROM tomcat:8-jre8
RUN
rm
-rf
/usr/local/tomcat/webapps
ADD .
/target/ROOT
.war
/usr/local/tomcat/webapps/ROOT
.war
build.sh 部署使用的脚本
12345678910111213141516171819202122232425262728293031#!/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管理平台、
在管理节点 执行以下命令就可以安装了 管理程序
12curl -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集群的更多相关文章
- Jenkins+Svn+Docker搭建持续集成环境 自动部署
一.准备工作: 两台服务器:192.168.206.212,192.168.206.213 自己新建一个maven项目 其中两台机子做下面的软件配置 212机子: 安装expect并配置: 安装jen ...
- 利用Travis CI+GitHub实现持续集成和自动部署
前言 如果你手动部署过项目,一定会深感持续集成的必要性,因为手动部署实在又繁琐又耗时,虽然部署流程基本固定,依然容易出错. 如果你很熟悉持续集成,一定会同意这样的观点:"使用它已经成为一种标 ...
- Jenkins+Maven+Svn搭建持续集成环境持续集成和自动部署
Jenkins和Hudson有很深的渊源,Jenkins目前更新频繁,目前选用Jenkins为持续集成工具和自动部署 Jenkins的使用有很多的介绍,主要记录如下要点: 192.168.1.240: ...
- gitlab持续集成,自动部署
写这篇文章的目的是,实现提交代码到gitlab上的一个项目时,自动打包,并将包发布到另一台服务器上,重启tomat.如有问题,可以联系本人QQ:409838567 gitlab-ci,是基于gitla ...
- 使用 svn+maven+jenkins(hudson)+Publish Over SSH plugins 构建持续集成及自动远程发布体系(转)
1.安装jenkins 2.浏览器访问jenkins主页 http://192.168.0.1:8080/,点击“系统管理” 3.在插件管理中,安装Publish Over SSH插件 4.在系统设置 ...
- 基于TeamCity的asp.net mvc/core,Vue 持续集成与自动部署
一 Web Server(Windows)端的配置 1.配置IIS,重要的是管理服务 1.1 配置FTP(前端NPM项目需要) 该步骤略,如果是在阿里云ESC上,需要开启端口21(用来FTP认证握手) ...
- 阿里云 持续集成环境自动部署cordova项目热更新脚本
linux脚本: #!/bin/sh rm -rf /home/tomcat/xiecang_hybird_web/xiecang_hybird_web.zip rm -rf /home/tomcat ...
- 使用gitlab构建基于docker的持续集成(三)
使用gitlab构建基于docker的持续集成(三) gitlab docker aspnetcore 持续集成 构建发布思路: aspnetcore 下的dockerfile编写 发布docker- ...
- 使用gitlab构建基于docker的持续集成(一)
使用gitlab构建基于docker的持续集成(一) gitlab docker aspnetcore 持续集成 开篇 整体环境规划 准备工作 CA证书 虚拟机系统:安装Centos7.3 3.设置C ...
随机推荐
- 桦仔 笔记4-徐 模仿灾难发生时还原adventurework数据库 示例 stopat
1 --模仿灾难发生时还原adventurework数据库 示例 stopat 2 3 BACKUP DATABASE AdventureWorks 4 TO DISK= 'D:\MSSQL\Data ...
- sql server 2008 设计时 不允许保存更改
什么 都不说了 上图
- ViEmu for VS2013-3.2.1 破解(转)
ViEmuVS2013-3.2.1 破解 VS升级到2013后,作为一个Vimer,自然需要更新最新的ViEmu插件,因为现在离了Vim,写代码已经寸步难行了. ViEmu 3.2.1的破解其实和 ...
- 155Min Stack
题目地址:155Min Stack 最近为了提高数据结构和算法能力,保证每天一到leetcode的题目.从easy开始,感觉这道题目还蛮好,记录一下. 题目大意:就是维护一个栈,获得栈中元素的的最小值 ...
- c# json处理(转)
一.C#处理简单json数据 json数据:{"result":"0","res_info":"ok","qu ...
- GUI练习——列出指定目录内容
需求: 一个窗体里.在文本框输入路径后,摁回车键或者点击"转到"按钮后: 若路径合法,程序会自动在文本域里显示该路径下的文件目录:若路径非法,则弹出对话框,告之你路径非法.点击&q ...
- 使用mobile jQuery 动态给select下拉添加数据,选中项默认不显示的解决方法。
getaddress(); function getaddress(type=0,parent='') { var tid=1; $.ajax({ type: "post", ur ...
- linux杂记(四)热键[Tab],[ctrl]-c,[ctrl]-d,在线求助man page/info page
[Tab]按键 他具有[命令补全](接在一串指令的第一个字后面)与[档案补齐](接在第一串指令的第二字以后时)的功能.如 [KANO@kelvin ~]$ ca[tab][tab] cabextrac ...
- java中三种常见内存溢出错误的处理方法
更多 10 相信有一定java开发经验的人或多或少都会遇到OutOfMemoryError的问题,这个问题曾困扰了我很长时间,随着解决各类问题经验的积累以及对问题根源的探索,终于有了一个比较深入的 ...
- xsoup,Jsoup
Xsoup 0.2.0 Xsoup 的详细介绍:请点这里 Xsoup 的下载地址:请点这里 https://github.com/code4craft/xsoup http://www.oschina ...