第四十三章 微服务CICD(5)- gitlab + jenkins + docker + dockerregsitry
一、总体流程
部署:
- 开发机(mac)
- ip:11.11.11.11
- docker:1.12.1
- 部署机(centos7)
- ip:10.211.55.4
- docker:1.12.3
- 生产机(centos7)
- ip:10.211.55.3
- docker:1.10.3(装k8s1.4的时候自带安装的版本)
总体流程:
- 在开发机开发代码后提交到gitlab
- 之后通过webhook插件触发jenkins进行构建,jenkins将代码打成docker镜像,push到docker-registry,
- 之后将该镜像推到生产机。(之后引入k8s,会将该镜像推到云上,云自己分配机器)
- 这一步这里不做了,之后引入k8s后再做
二、gitlab安装
三、jenkins安装
- 第四十章 jenkins(2016-11-01 10:25)
四、gitlab通知jenkins进行构建
- 第四十一章 jenkins + gitlab + webhooks + publish-over-ssh(1)
- 第四十二章 jenkins + gitlab + webhooks + publish-over-ssh(2)
五、docker-registry安装
1、部署机(下载镜像,启动镜像)
- docker pull hub.c.163.com/library/registry:latest
- docker tag 0bb8b1006103 registry
- docker run -d -p 5000:5000 -v /opt/registry:/var/lib/registry registry
- 默认的存储目录:/var/lib/registry
2、开发机
- 先设置--insecure-registry(这里介绍三种情况)
- 之后push镜像到registry
2.1、mac:
说明:设置insecure registry如上,否则有https的问题,导致无法push和pull,之后"apply restart"就好了。
- docker push 10.211.55.4:5000/zhaojigang/jdk8:c7_j8
- ps -ef | grep docker 看看docker进程的options设置成功没有
2.2、docker1.10.3
在/etc/sysconfig/docker中修改OPTIONS='--selinux-enabled=false --insecure-registry=10.211.55.4:5000'
修改后
- systemctl daemon-reload
- systemctl restart docker
- ps -ef | grep docker 看看docker进程的options设置成功没有
2.3、docker1.12.3
在/lib/systemd/system/docker.service中修改ExecStart=/usr/bin/dockerd --insecure-registry=10.211.55.4:5000
- systemctl daemon-reload
- systemctl restart docker
- ps -ef | grep dockerd 看看docker进程的options设置成功没有
3、生产机
如果需要从registry拉取pull镜像,也需要像上边那样设置,之后才可以拉取。
六、gitlab
- 创建项目 myservice1-docker
- 设置该项目的webhook:第四十一章 jenkins + gitlab + webhooks + publish-over-ssh(1)
七、jenkins
1、"系统管理"->"系统设置"(已经设置过了):第四十一章 jenkins + gitlab + webhooks + publish-over-ssh(1)
2、项目配置:
2.1、general
项目名称:myservice1-docker(其实就是项目的artifactid)
2.2、源码管理
2.3、构建触发器
2.4、Build
- package:打成jar包
- docker:build:打成镜像
- docker:push:将镜像推到私服
八、本地开发代码
1、pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.xxx</groupId> <artifactId>myservice1-docker</artifactId> <version>1.0-SNAPSHOT</version> <properties> <java.version>1.8</java.version><!-- 官方推荐 --> <docker.registry>10.211.55.4:5000</docker.registry> <push.image>true</push.image> </properties> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.3.5.RELEASE</version> </parent> <!-- 引入实际依赖 --> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>0.4.13</version> <configuration> <imageName>${docker.registry}/${project.groupId}/${project.artifactId}:${project.version}</imageName> <dockerDirectory>${basedir}/src/main/docker</dockerDirectory> <pushImage>${push.image}</pushImage> <resources> <resource> <!-- ${project.build.directory},项目构建输出目录,默认为target/ --> <directory>${project.build.directory}</directory> <!-- ${project.build.finalName},打包出来的jar名称,默认为${project.artifactId}-${project.version} --> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin> </plugins> </build> </project>
说明:第三十八章 springboot+docker(maven)
2、Dockerfile
FROM 10.211.55.4:5000/zhaojigang/jdk8:c7_j8 ADD myservice1-docker-1.0-SNAPSHOT.jar app.jar ENV JAVA_HOME /opt/jdk ENV PATH $PATH:$JAVA_HOME/bin CMD ["java","-jar","app.jar"]
说明:基础镜像是本地开发好的一个镜像,需要之后推到远程registry:docker push 10.211.55.4:5000/zhaojigang/jdk8:c7_j8
注意:实际上
FROM 10.211.55.4:5000/zhaojigang/jdk8:c7_j8 ADD myservice1-docker-1.0-SNAPSHOT.jar app.jar
不应该硬编码,应该写作
FROM @docker.registry@/zhaojigang/jdk8:c7_j8 ADD @project.build.finalName@.jar app.jar
但是暂时没成功!!!
3、HelloDockerController.java
package com.xxx.docker.myservice1.web; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/docker") public class HelloDockerController { @RequestMapping("/hello") public String helloDocker(){ return "hello docker12!!!"; } }
九、git提交代码
- git add --all
- git commit -m"xxx"
- git push origin HEAD:dev
之后,查看jenkins编译console,可以看到,会先打镜像,最后将镜像push到远程的registry中,供将来的机器去pull。
十、从开发机或者生产机pull镜像并且运行测试
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; color: #f5f5f5; background-color: #000000 }
span.s1 { }
span.s2 { color: #c33720 }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; color: #f5f5f5; background-color: #000000 }
span.s1 { color: #c33720 }
span.s2 { }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; color: #f5f5f5; background-color: #000000 }
span.s1 { color: #c33720 }
span.s2 { }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; color: #f5f5f5; background-color: #000000 }
span.s1 { }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; color: #f5f5f5; background-color: #000000 }
span.s1 { }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; color: #f5f5f5; background-color: #000000 }
span.s1 { }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; color: #f5f5f5; background-color: #000000 }
span.s1 { }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; color: #f5f5f5; background-color: #000000 }
span.s1 { }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; color: #f5f5f5; background-color: #000000 }
span.s1 { }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; color: #f5f5f5; background-color: #000000 }
span.s1 { }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; color: #f5f5f5; background-color: #000000 }
span.s1 { }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; color: #f5f5f5; background-color: #000000 }
span.s1 { }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Monaco }
第四十三章 微服务CICD(5)- gitlab + jenkins + docker + dockerregsitry的更多相关文章
- 第四十四章 微服务CICD(6)- gitlab + jenkins + docker + k8s
总体流程: 在开发机开发代码后提交到gitlab 之后通过webhook插件触发jenkins进行构建,jenkins将代码打成docker镜像,push到docker-registry 之后将在k8 ...
- 第四十二章 微服务CICD(4)- jenkins + gitlab + webhooks + publish-over-ssh(2)
上一节完成了"当git客户端push代码到gitlab后,jenkins会立即去gitlab拉取代码并构建". 目的:本节完成jenkins自动构建之后,自动的将jar包部署到应用 ...
- 第三十九章 微服务CICD(1)- gitlab搭建与使用(docker版)
一.下载docker镜像 前提:docker引擎已经安装好. docker pull gitlab/gitlab-ce gitlab是8.13.1版本. 二.启动应用 docker run -d -h ...
- 第四十一章 微服务CICD(3)- jenkins + gitlab + webhooks + publish-over-ssh(1)
一.作用 使用webhooks来实现当git客户端push代码到gitlab后,jenkins会立即去gitlab拉取代码并构建. 二.步骤 1.安装插件 ruby_runtime(Hook插件依赖于 ...
- Gradle 1.12用户指南翻译——第四十三章. 构建公告插件
本文由CSDN博客貌似掉线翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...
- JHipster生成微服务架构的应用栈(四)- 网关微服务示例
本系列文章演示如何用JHipster生成一个微服务架构风格的应用栈. 环境需求:安装好JHipster开发环境的CentOS 7.4(参考这里) 应用栈名称:appstack 认证微服务: uaa 业 ...
- “全栈2019”Java第四十三章:封装
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- 庐山真面目之十微服务架构 Net Core 基于 Docker 容器部署 Nginx 集群
庐山真面目之十微服务架构 Net Core 基于 Docker 容器部署 Nginx 集群 一.简介 前面的两篇文章,我们已经介绍了Net Core项目基于Docker容器部署在Linux服 ...
- Taurus.MVC 微服务框架 入门开发教程:项目部署:4、微服务应用程序发布到Docker部署(上)。
系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 开源地址:https://github.com/cyq1162/Taurus.MVC 本系列第一篇:Tauru ...
随机推荐
- Python体验(08)-图形界面之工具栏和状态栏
# coding=utf-8 import wx # 导入必须的Python包 class MenuForm(wx.Frame): def OnQuit(self,event): self.Close ...
- js解决IE不支持数组的indexOf()方法
if (!Array.indexOf) { Array.indexOf = function (obj) { ...
- gulp和grunt的区别
1. Grunt -> Gulp 早些年提到构建工具,难免会让人联想到历史比较悠久的Make,Ant,以及后来为了更方便的构建结构类似的Java项目而出现的Maven.Node催生了一批自动化工 ...
- Spark Streaming资源动态申请和动态控制消费速率剖析
本期内容 : Spark Streaming资源动态分配 Spark Streaming动态控制消费速率 为什么需要动态处理 : Spark 属于粗粒度资源分配,也就是在默认情况下是先分配好资源然后再 ...
- CNC系统实时性分析
该系统有哪些强实时功能需求?需要对哪些实时事件进行实时响应,对允许的实时延迟的数量级进行估计. 答:数控系统中控制装置与现场设备通信的实时性要求,数控系统要快速而有效的对复杂而庞大的操作任务进行处理. ...
- js复制
JS实现各种复制到剪贴板 一.实现点击按钮,复制文本框中的的内容 <script type="text/javascript" ...
- Tomcat日志切割
下载并解压缩 cronolog # tar zxvf cronolog-1.6.2.tar.gz 2.进入cronolog安装文件所在目录 # cd cronolog-1.6.2 3.运行安装 # ...
- java上传xls文件
using System; using System.Collections.Generic; using System.Web; using System.Web.UI; using System. ...
- xml ---DOM操作
package day03.xml; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; ...
- yii + elasticsearch 手册
https://zhuowenji1.gitbooks.io/elasticsearch/content/an_zhuang_yii2.html