jenkins+docker自动化部署思路与问题

之后的文章我不会去将一整个流程的实现步骤和代码记录,更多的是记录一些想法和心得

问题一:为什么要用jenkins+docker自动化部署?

主要是去减少手动运维的工作量。

问题二:为什么要去选择jenkins+docker?

这是比较流行的一套,文档比较多;并不是说去中意这些框架而是中意这套解决方案带来的效应和功能。

实现思路

分为俩大部分,jenkins与docker

jenkins

jenkins在这一套里面担任很重要的角色,甚至在没有docker的情况,通过jenkinsfile都能实现自动化部署

jenkins安装

docker下jenkins的安装:

https://www.cnblogs.com/fuzongle/p/12834080.html

jenkins优势

引用公司大牛跟我所说,jenkins最大的优点就是他的组件,组件很多对各个平台的兼容也就很大。

构建方案

我选择的构建方案是 本地push->git仓库-> jenkins发现push开始构建 ->推送至目标服务器。还有什么隔1小时推送一次的都可以看看,看是否适合。

jenkins对docker的支持

借用网上一位大哥的图。

image-20210705000800701

我目前并未去使用这些组件,我直接用脚本构建docker,这个可以往后安排。

Docker

优点

环境解耦,分离。

环境环境环境,优势就是环境以及快速部署。

在传统的操作下,环境一致性,环境不同之间迁移问题非常让人头疼,而这docker就很大程度的解决了这些问题。

缺点

对服务器内存有要求,并且微服务下更加。

Docker与jenkins的交互

完整的交互如图

image-20210705001732779

参考。

https://blog.csdn.net/xiaoxiangzi520/article/details/88842200

这样jenkins一次构建后,目标服务器只需要拉取镜像生成容器即可。

8.1更新

方案更新

git推送->jenkins依靠dockerFile构建docker镜像、将docker镜像推送至镜像仓库、依靠docker-compose文件对微服务同意docker-compose down并docker-compose up -d、更新前端文件夹

这样比之前的步骤少了很多,能交给应用执行的就可以应用执行;并且是把jenkins放到了本地,因为目前就个人使用;使用了这套流程快半个月了,很稳定;

这个镜像仓库我用的是阿里云的个人版,目前够用,这个镜像仓库就把他当成github那样的代码库一样,他也有类似github的应用,这个搭建成本大我就没有去搭建了不适合;

问题

我目前是有俩个docker-compose文件、一个是所有微服务的每次推送都会重启的,一个是环境的docker-compose;

我就只放微服务的给个参考了

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
version: '3.8'
services:

eureka-server:
image: registry.cn-zhangjiakou.aliyuncs.com/zhaoyuan_image/eureka-server:latest
container_name: eureka-server
environment:
- JVM_OPTS=-Xms56m -Xmx56m
restart: always
ports:
- 8880:8880
networks:
netName:
ipv4_address: 192.20.0.11


config-server:
image: registry.cn-zhangjiakou.aliyuncs.com/zhaoyuan_image/config-server:latest
environment:
- JVM_OPTS=-Xms300m -Xmx300m
restart: always
container_name: config-server
ports:
- 30870:8870
networks:
netName:
ipv4_address: 192.20.0.5


libary-auth:
image: registry.cn-zhangjiakou.aliyuncs.com/zhaoyuan_image/libary-auth:latest
environment:
- JVM_OPTS=-Xms512m -Xmx512m
container_name: libary-auth
ports:
- 30100:8100
networks:
netName:
ipv4_address: 192.20.0.6
restart: always


# libary-gateway:
# image: registry.cn-zhangjiakou.aliyuncs.com/zhaoyuan_image/libary-gateway:latest
# environment:
# - JVM_OPTS=-Xms300m -Xmx300m
# container_name: libary-gateway
# ports:
# - 80:9000
# networks:
# netName:
# ipv4_address: 192.20.0.7
# restart: always


libary-eureka-device:
image: registry.cn-zhangjiakou.aliyuncs.com/zhaoyuan_image/libary-eureka-device:latest
environment:
- JVM_OPTS=-Xms512m -Xmx512m
container_name: libary-eureka-device
ports:
- 30083:8083
networks:
netName:
ipv4_address: 192.20.0.8
restart: always


# libary-eureka-material:
# image: registry.cn-zhangjiakou.aliyuncs.com/zhaoyuan_image/libary-eureka-material:latest
# environment:
# - JVM_OPTS=-Xms300m -Xmx300m
# container_name: libary-eureka-material
# ports:
# - 30082:8082
# networks:
# netName:
# ipv4_address: 192.20.0.9
# restart: always
# deploy:
# resources:
# limits:
# cpus: '0.5'
# memory: 800m
# reservations:
# cpus: '0.2'
# memory: 200M

libary-eureka-user:
image: registry.cn-zhangjiakou.aliyuncs.com/zhaoyuan_image/libary-eureka-user:latest
environment:
- JVM_OPTS=-Xms512m -Xmx512m
container_name: libary-eureka-user
ports:
- 30081:8081
networks:
netName:
ipv4_address: 192.20.0.10
restart: always

networks:
netName:
driver: bridge
ipam:
driver: default
config:
- subnet: 192.20.0.0/16

容器内微服务网络问题

微服务间免不了有相互的通讯,这个时候就牵扯到一个网络问题。当你每个微服务的网络都是独立的,你又不想每个微服务都给个公共端口提供的话,就得将这些微服务集合到一起:

定义网关:

1
2
3
4
5
6
7
networks:
netName:
driver: bridge ##网关类型
ipam:
driver: default
config:
- subnet: 192.20.0.0/16

指定网络

1
2
3
4
5
6
7
8
9
10
11
libary-eureka-user:
image: registry.cn-zhangjiakou.aliyuncs.com/zhaoyuan_image/libary-eureka-user:latest ##镜像地址
environment:
- JVM_OPTS=-Xms512m -Xmx512m
container_name: libary-eureka-user
ports:
- 30081:8081 ##端口映射
networks:
netName: ##指定自定义网关
ipv4_address: 192.20.0.10 ##自定义docker容器内ip地址
restart: always

这样的话微服务间通讯就没有问题了

docker内存高占用

我的7到8个微服务一启动,测试机8g内存基本就会过百分之50的占用,之前开端口被病毒占了百分之40,我i的微服务通过docker-compose启动直接服务killed,原因是内存不足;

使用docker命令查看了一下占用,好家伙 eurekaserver注册中心都需要500m+ 按理来说应该200m差不多了;

这里我出厂服务器后,直接用nginx转发,弃用gateway,勉强救急去解决了。

正确的解决方式:

​ 代办:

​ 内存控制: 分俩端 一边是jdk占用、一边是指定容器的占用;

可参考

https://www.jdon.com/51409

https://www.cnblogs.com/shunzi115/p/14173015.html

最佳的解决应该是升级jdk11,通过dockerfile 指定容器占用内存和jdk占用内存生成镜像;