Ubuntu下Jenkins+Docker自动化部署spring cloud项目
环境说明:
- 操作系统:Ubuntu 18.04 64位(阿里云服务器)
- Jenkins:2.235.1
- Docker:19.03.12
说明:
默认你的服务器已经安装了docker、Jenkins环境(没装的可以参考我上一篇),spring cloud项目代码已经提交到仓库。
下面进行Jenkins的配置以及项目中docker相关配置文件说明。
1.项目中Dockerfile,以及docker-compose.yml文件说明
聚合项目的每个子模块下都创建一个Dockerfile,用于后续构建docker image。
FROM java:8 #VOLUME /tmp ADD target/api-gateway-1.0.0-SNAPSHOT.jar app.jar ENTRYPOINT ["java","-jar","app.jar"] EXPOSE 5555
每个子模块的Dockerfile可以参考上面的代码,jar包名称需要根据你的项目进行调整。
然后整个项目的根目录下创建docker-compose.yml,用于后续利用docker compose进行多容器的管理。
version: "3" services: eureka-server : image: eureka-server ports: - "1111:1111" # volumes: # - /usr/local/cloud/logs/eureka-server:/logs networks: - my-cloud feign-consumer: image: feign-consumer ports: - "9002:9002" # volumes: # - /usr/local/cloud/logs/provider:/logs networks: - my-cloud depends_on: - eureka-server api-gateway: image: api-gateway ports: - "5555:5555" # volumes: # - /usr/local/cloud/logs/consumer:/logs networks: - my-cloud depends_on: - eureka-server booking-service: image: booking-service ports: - "8080:8080" # volumes: # - /usr/local/cloud/logs/consumer:/logs networks: - my-cloud depends_on: - eureka-server mysql: image: mysql ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: databaseName volumes: - /home/Booking-Center/mysqlData:/var/lib/mysql networks: - my-cloud networks: my-cloud: driver: bridge
2.服务器docker compose的安装:
root@Colin:~# sudo curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 617 100 617 0 0 695 0 --:--:-- --:--:-- --:--:-- 694 100 16.3M 100 16.3M 0 0 113k 0 0:02:27 0:02:27 --:--:-- 368k sudo chmod +x /usr/local/bin/docker-compose root@Colin:~# docker-compose --version docker-compose version 1.25.4, build 8d51620a
3.Jenkins相关配置:
安装maven插件
点击左边Manage Jenkins --> Manage Plugins --> available 上面搜索maven,选择然后install without restart,我这里已经安装过了
选择安装maven版本
点击左边Manage Jenkins --> Global Tool Configuration,拉到页面最下方,名字随意,然后save
新建一个maven项目
Post Steps增加构建步骤,shell脚本:Add post-build step -> execute shell
在command中添加以下shell脚本:
#docker运行服务URL #操作/项目路径(Dockerfile存放的路劲) BASE_PATH=/var/lib/jenkins/workspace # 源项目工作空间 #SOURCE_PATH=/var/lib/jenkins/workspace #docker 镜像路径,也是父项目路径 PARENT_PATH=Booking-Center #docker 镜像/容器/项目名字或者jar名字数组 这里都使用项目名命名 PROJECT_NAMES=("eureka-server" "feign-consumer" "api-gateway" "booking-service") #项目版本号/docker 容器tag,使用项目版本号来做tag,版本号要与项目数组PROJECT_NAMES一一对应 PROJECT_VERSIONS=("1.0.0-SNAPSHOT" "1.0.0-SNAPSHOT" "1.0.0-SNAPSHOT" "1.0.0-SNAPSHOT") #docker容器暴露的端口,端口号要与项目数组PROJECT_NAMES一一对应,这里为了简化,docker容器端口与宿主机端口配置成一样的。 EXPOSE_PORTS=("1111" "9002" "5555" "8080") ##############以下内容不用修改 DATE=`date +%Y%m%d%H%M` #创建项目环境目录 function projectDir(){ for (( i = 0 ; i < ${#PROJECT_NAMES[@]} ; i++ )) do if [ ! -e $BASE_PATH/$PARENT_PATH/${PROJECT_NAMES[$i]} ] && [ ! -d $BASE_PATH/$PARENT_PATH/${PROJECT_NAMES[$i]} ]; then mkdir -p $BASE_PATH/$PARENT_PATH/${PROJECT_NAMES[$i]} echo "Create Dir: $BASE_PATH/$PARENT_PATH/${PROJECT_NAMES[$i]}" fi done } # 构建docker镜像 function build(){ for (( i = 0 ; i < ${#PROJECT_NAMES[@]} ; i++ )) do #镜像id IID=$(docker images | grep "${PROJECT_NAMES[$i]}" | awk '{print $3}') if [ -n "$IID" ]; then echo "存在${PROJECT_NAMES[$i]}镜像,IID=$IID" echo "删除${PROJECT_NAMES[$i]}镜像..." docker rmi $IID echo "重新构建镜像" cd $BASE_PATH/$PARENT_PATH/${PROJECT_NAMES[$i]} docker build -t ${PROJECT_NAMES[$i]} . else echo "不存在${PROJECT_NAMES[$i]}镜像,开始构建镜像" cd $BASE_PATH/$PARENT_PATH/${PROJECT_NAMES[$i]} docker build -t ${PROJECT_NAMES[$i]} . fi done } function delContainer(){ for (( i = 0 ; i < ${#PROJECT_NAMES[@]} ; i++ )) do #容器id CID=$(docker ps -a | grep "${PROJECT_NAMES[$i]}" | awk '{print $1}') if [ -n "$CID" ]; then echo "存在${PROJECT_NAMES[$i]}容器,CID=$CID,停止并删除docker容器 ..." docker rm -f $CID echo "${PROJECT_NAMES[$i]}容器停止删除完成" else echo "不存在${PROJECT_NAMES[$i]}容器" fi done } # 运行docker容器 function run(){ projectDir delContainer build #启动容器,我们采用docker compose来编排docker容器,解决docker容器之间网络访问的问题 #先编写docker-compose.yml文件后,放入项目路径下 cd $BASE_PATH/$PARENT_PATH docker-compose up -d } #入口 run
save之后开始构建,查看控制台输出:
4.设置能够远程登录docker中的MySQL:
docker exec -it [mysql] /bin/bash mysql -u root -p ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root'; flush privileges; exit;
参考过的博客:
微服务架构持续集成:(四)通过jenkins + docker 部署spring cloud微服务