一、总体流程
部署:
- 开发机(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
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 4 5 <modelVersion>4.0.0</modelVersion> 6 7 <groupId>com.xxx</groupId> 8 <artifactId>myservice1-docker</artifactId> 9 <version>1.0-SNAPSHOT</version> 10 11 <properties> 12 <java.version>1.8</java.version><!-- 官方推荐 --> 13 <docker.registry>10.211.55.4:5000</docker.registry> 14 <push.image>true</push.image> 15 </properties> 16 17 <parent> 18 <groupId>org.springframework.boot</groupId> 19 <artifactId>spring-boot-starter-parent</artifactId> 20 <version>1.3.5.RELEASE</version> 21 </parent> 22 23 <!-- 引入实际依赖 --> 24 <dependencies> 25 <dependency> 26 <groupId>org.springframework.boot</groupId> 27 <artifactId>spring-boot-starter-web</artifactId> 28 </dependency> 29 <dependency> 30 <groupId>org.springframework.boot</groupId> 31 <artifactId>spring-boot-starter-actuator</artifactId> 32 </dependency> 33 </dependencies> 34 35 <build> 36 <plugins> 37 <plugin> 38 <groupId>org.springframework.boot</groupId> 39 <artifactId>spring-boot-maven-plugin</artifactId> 40 </plugin> 41 <plugin> 42 <groupId>com.spotify</groupId> 43 <artifactId>docker-maven-plugin</artifactId> 44 <version>0.4.13</version> 45 <configuration> 46 <imageName>${docker.registry}/${project.groupId}/${project.artifactId}:${project.version}</imageName> 47 <dockerDirectory>${basedir}/src/main/docker</dockerDirectory> 48 <pushImage>${push.image}</pushImage> 49 <resources> 50 <resource> 51 <!-- ${project.build.directory},项目构建输出目录,默认为target/ --> 52 <directory>${project.build.directory}</directory> 53 <!-- ${project.build.finalName},打包出来的jar名称,默认为${project.artifactId}-${project.version} --> 54 <include>${project.build.finalName}.jar</include> 55 </resource> 56 </resources> 57 </configuration> 58 </plugin> 59 </plugins> 60 </build> 61 </project>
说明:第三十八章 springboot+docker(maven)
2、Dockerfile
1 FROM 10.211.55.4:5000/zhaojigang/jdk8:c7_j8 2 3 ADD myservice1-docker-1.0-SNAPSHOT.jar app.jar 4 5 ENV JAVA_HOME /opt/jdk 6 ENV PATH $PATH:$JAVA_HOME/bin 7 8 CMD ["java","-jar","app.jar"]
说明:基础镜像是本地开发好的一个镜像,需要之后推到远程registry:docker push 10.211.55.4:5000/zhaojigang/jdk8:c7_j8
注意:实际上
1 FROM 10.211.55.4:5000/zhaojigang/jdk8:c7_j8 2 ADD myservice1-docker-1.0-SNAPSHOT.jar app.jar
不应该硬编码,应该写作
1 FROM @[email protected]/zhaojigang/jdk8:c7_j8 2 ADD @[email protected] app.jar
但是暂时没成功!!!
3、HelloDockerController.java
1 package com.xxx.docker.myservice1.web; 2 3 import org.springframework.web.bind.annotation.RequestMapping; 4 import org.springframework.web.bind.annotation.RestController; 5 6 @RestController 7 @RequestMapping("/docker") 8 public class HelloDockerController { 9 @RequestMapping("/hello") 10 public String helloDocker(){ 11 return "hello docker12!!!"; 12 } 13 }
九、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 }