从我我的使用的角度讲的话 部署来的更方便 html
只要构建过一次环境 推送到镜像仓库 迁移起来也是分分钟的事情 java
虚拟化让集群的管理和控制部署都更方便python
hub.docker.com 里面的镜像也很方便 节约了不少本身生成镜像的时间git
至关于提升了复用率github
我这里使用 Ubuntu 14.04 系统上安装 web
curl -s https://get.docker.com/ | sudo shUbuntu 其余版本可能须要先升级一下内核 redis
详细可参考 这里sql
下来开始咱们今天的主题 构建持续集成与自动部署的Docker集群 docker
持续集成的目的tomcat
让咱们每次更新了代码提交到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.warbuild.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 安装使用 方式已通过期了 请查看最新的