前言
前面使用Jenkins+docker+shell脚本可以方便的实现单体应用部署,但如果是微服务架构,工程包较多,若是为每一个服务都建一个Jenkins job 会变得很繁琐,这个时候就需要用到docker-compose 容器编排工具,它可以只需一行命令就能帮我们完成多个服务的构建、推送、重启。
考虑到如果有多个服务需要部署到多台服务器,如果每台服务器都采用发送jar包再构建镜像的方式会产生许多重复工作,因此这种情况应该使用jenkins构建镜像->推送到私库->服务器拉取->docker-compose启动 如此流程来完成部署。
准备工作
需要安装如下软件:
Jenkins (包括git/svn、publish over ssh 这个插件,jenkins安装教程很多此处不再赘述)
docker
Node JS (可选,仅部署前端vue项目时需要安装)
docker compose
准备工作指路:
jenkins: https://www.jenkins.io/download/ 直接启动war包或者使用docker安装
docker: Install Docker Desktop on Linux
Node Js:Node.js
docker compose: GitHub - docker/compose: Define and run multi-container applications with Docker
或者直接使用curl下载安装,以CentOs为例执行如下代码:
1 | 1、下载docker-compose |
安装docker私库
为了使服务一次打包多次部署,需要安装docker私库来保存镜像
首先建好映射目录的文件夹:
1 | mkdir /data/registry |
执行docker命令启动私库镜像:
1 | docker run -itd -v /data/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:latest |
添加docker配置:
注意:如果是通过内网访问就配内网IP否则 配公网IP
vi /etc/docker/daemon.json
添加如下:
1 | "insecure-registries": ["192.168.2.200:5000"] |
如果需要设置账号密码:
1 | docker run --rm --entrypoint htpasswd httpd:2 -Bbn yourUserName yourPwd >> ./auth/htpasswd |
一般在内网环境部署私库,拉取推送也是全程内网,所以可装可不装
默认私库无法删除镜像,执行如下命令添加配置:
1 | sudo docker exec -it registry /bin/sh |
SpringBoot项目自动部署
编写 dockerfile
首先需要编写Dockerfile,在项目根目录新建Dockerfile文件,告诉docker-compose如何构建镜像:
1 | FROM openjdk:8 |
注意修改spring-boot-1.1.0.jar为项目中实际的jar文件名,环境变量在maven打包阶段就要设置好,而不是通过启动命令spring.profiles.active=dev 这样来设置。
编写docker-compose.yml
同样在项目根目录新建docker-compose.yml文件,粘入如下内容:
1 | version: '2' |
以上是单个项目的部署配置,且其它的如redis、mysql、kafka等依赖服务已存在的情况下,仅配置一个即可,如果希望一行命令将后台服务、mysql、redis等全部一并创建并启动,则配置如下:
1 | version: '2' |
以上是完整的配置,如需要构建自己的镜像,则配置build.context,并编写dockerfile,如使用官方镜像直接启动,则配置image: 镜像名 即可。
配置jenkins
安装插件(可选)
首先确保安装了publish over ssh插件,安装方法为jenkins主页->左边菜单Manage Jenkins -> Manage Plugins->点击可选插件->搜索:Publish Over SSH -> 安装此插件
新建Jenkins job
1、配置源码管理,比如这里使用的是svn,点击subversion ,填入svn地址和账号密码
2、Build 项,Root POM填写pom.xml,如不在根目录,填写完整目录,Goals and options填写maven打包命令,如:clean package -Dmaven.test.skip=true -e -Ptest
3、Post Steps选择Run only if build succeeds or is unstable (构建成功则继续执行)
4、点击Add post build step,选择Execute shell,填写如下代码:
1 | cd manage-system |
首先cd进入项目的根目录(也是docker-compose.yml的目录),执行构建命令,然后使用push命令将镜像推送到私库
如果需要直接在本机部署则直接填写如下即可:
1 | cd manage-system |
如直接部署在本机,配置到此就已经结束了,直接运行Jenkins Build Now即可,如是部署在其它服务器,则需要增加一步
5、如部署在其它服务器,则在构建后操作下点击Add post build step,选择Send files or execute commands over SSH,SSH Server Name一栏选择要部署的服务器,服务器连接配置在Manage Jenkins-> Configure System -> 找到SSH Servers ,配置远程连接服务器的信息。
回到jenkins job配置,Transfer Set Source files填写要发送到远程服务器的文件,这里可将docker-compose.yml发送过去,如填写:manage-system/docker-compose.yml
Exec command填写内容如下:
1 | docker pull 192.168.1.199:5000/project/manage-system:latest |
–no-build 表示不构建,因为我们已经构建了该镜像并推送到私库了
至此spring boot项目的自动部署配置完成!
VUE前端项目部署
在项目根目录编写Dockerfile文件:
1 | FROM nginx |
修改其中的ip为实际项目的ip和地址
配置jenkins
老样子,新建jenkins job ,源码管理填写git或svn地址,
Build Steps点击新增Excute Shell,填写构建命令:
1 | npm run build |
执行构建命令,再执行docker打包命令,docker会自动查找当前目前的Dockerfile文件并构建镜像。
如果是直接本机部署,则填写如下:
1 | npm run build |
本机部署配置到此结束,如需要发送到远程服务部署,则再增加一步。
构建后操作新增Send build artifacts over SSH,选择要部署的服务器,Transfer Set
Source files可填写docker-compose.yml文件的路径
前端项目的docker-compose.yml可参照springboot项目中的配置,这里我直接手动命令启动了,Exec command填写如下 :
1 | docker pull 192.168.1.199:5000/web/manage-system-front:latest |
结束!
一些常用镜像快速启动命令示例
docker容器管理界面
1 | docker run -d -p 9000:9000 --restart=always \ |
docker私库管理页面
1 | docker run -d -p 7001:8080 --name registry-web --restart=always --link registry:registry -e registry_url=http://registry:5000/v2 -e registry_name=localhost:5000 hyper/docker-registry-web:latest |
kafka
1 | docker run -d --name kafka -p 9092:9092 -p 9093:9093 --link zookeeper --network networks -e ALLOW_PLAINTEXT_LISTENER=yes -e KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181 -e KAFKA_CFG_LISTENERS=CLIENT://:9092,EXTERNAL://:9093 -e KAFKA_CFG_ADVERTISED_LISTENERS=CLIENT://kafka:9092,EXTERNAL://192.168.1.199:9093 -e KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CLIENT:PLAINTEXT,EXTERNAL:PLAINTEXT -e KAFKA_CFG_INTER_BROKER_LISTENER_NAME=CLIENT bitnami/kafka:3.4 |
kafka特别说明:
此配置在容器内部访问时使用kafka:9092或者内部ip:9092,外部访问时使用ip:9093,记得暴露9093
关于kafka lisner 说明可参考: https://rmoff.net/2018/08/02/kafka-listeners-explained/
kafka ui页面
1 | docker run --name=kafka-ui -d --network networks -e KAFKA_CLUSTERS_0_NAME=local-kafka -e KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS=kafka:9092 -p 7002:8080 provectuslabs/kafka-ui:latest |
jenkins
1 | docker run -u root -d -p 7000:8080 -p 50000:50000 --name jenkins -v jenkins-data:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock jenkins/jenkins |
redis
1 | docker run --restart=always -p 6379:6379 --name redis --network networks -v /home/redis/conf/redis.conf:/etc/redis/redis.conf -v /home/redis/conf/data:/data -d hub.c.163.com/library/redis /etc/redis/redis.conf --appendonly yes --requirepass 123456 |
补充:如连接redis时报no route host,执行如下:
1 | firewall-cmd --permanent --zone=public --add-rich-rule='rule family=ipv4 source address=172.18.0.0/16 accept' && firewall-cmd --reload |
elasticsearch7
1 | docker run -d -p 9200:9200 -p 9300:9300 --name elasticsearch --network networks -e ES_JAVA_OPTS="-Xms512m -Xmx512m" -e "discovery.type=single-node" elasticsearch:7.17.9 |
mysql8
1 | docker run -v /data/mysql:/var/lib/mysql -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root123456 -d mysql |
pluemelog
1 | docker run -d -p8891:8891 --link kafka:kafka -e plumelog.model=kafka -e plumelog.es.esHosts=elasticsearch:9200 -e plumelog.kafka.kafkaHosts=kafka:9092 -e login.username=admin -e login.password=123456 --volume=/data/plumelog-server:/plumelog-server --network=networks --name=plumelog ylyue/plumelog:v3.5.1 |
注意各个容器想要相互互通需要容器在同一个虚拟网络(network),使用--network=networks
指定,处于同一虚拟网络才能通过容器名+端口访问
- 本文作者: reiner
- 本文链接: https://reiner.host/posts/12ac9414.html
- 版权声明: 转载请注明出处,并附上原文链接