
1 Docker+Jenkins+Nginx+Spring Boot 自动化部署项目
写在前面
Docker通过linux的namespace实现资源隔离、cgroups实现资源控制,通过写时复制机制(copy-on-write)实现了高效的文件操作,在实际开发中可用于提供一次性的环境、微服务架构的搭建、统一环境的部署。
安装JDK 安装Maven 安装git 安装Jenkins(该步骤之前的可参考Jenkins安装并部署Java项目完整流程)如有权限问题可将/etc/sysconfig/jenkins文件JENKINS_USER修改为root或手动赋权 Centos安装Docker 安装DockerCompose
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.0/docker-compose-$(uname -s)-$(uname -m)" -o usr/local/bin/docker-composesudo chmod +x usr/local/bin/docker-composesudo ln -s usr/local/bin/docker-compose usr/bin/docker-composedocker-compose --version
FROM java:8MAINTAINER WilsonENV TZ=Asia/ShanghaiRUN ln -snf usr/share/zoneinfo/$TZ etc/localtime && echo $TZ > etc/timezone#这里的 tmp 目录就会在运行时自动挂载为匿名卷,任何向 tmp 中写入的信息都不会记录进容器存储层VOLUME /ecs-application-dockerRUN mkdir appWORKDIR /app#复制target/spring-boot-web-demo.jar到容器里WORKDIR下COPY target/ecs-application.jar ecs-application.jarEXPOSE 9090ENTRYPOINT ["java","-jar","ecs-application.jar"]
version: '3.7'services:app:restart: alwaysbuild: ./hostname: docker-spring-bootcontainer_name: docker-spring-bootimage: docker-spring-boot/latest# 不对外开放端口,只能通过容器访问# ports:# - 8080:8080volumes:- ./volumes/app:/appnginx:depends_on:- appcontainer_name: docker-nginxhostname: docker-nginximage: nginx:1.17.6environment:TZ: Asia/Shanghairestart: alwaysexpose:- 80ports:- 80:80links:- appvolumes:- ./volumes/nginx/nginx.conf:/etc/nginx/nginx.conf- ./volumes/nginx/conf.d:/etc/nginx/conf.d- ./volumes/nginx/logs:/var/log/nginx
./volumes/nginx/nginx.conf
user nginx;worker_processes 2; #设置值和CPU核心数一致error_log /etc/nginx/error.log crit; #日志位置和日志级别pid /etc/nginx/nginx.pid;events{use epoll;worker_connections 65535;}http{include mime.types;default_type application/octet-stream;log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for" "$http_cookie"';access_log /var/log/nginx/access.log main;#charset utf8;server_names_hash_bucket_size 128;client_header_buffer_size 32k;large_client_header_buffers 4 32k;client_max_body_size 8m;sendfile on;tcp_nopush on;keepalive_timeout 60;tcp_nodelay on;fastcgi_connect_timeout 300;fastcgi_send_timeout 300;fastcgi_read_timeout 300;fastcgi_buffer_size 64k;fastcgi_buffers 4 64k;fastcgi_busy_buffers_size 128k;fastcgi_temp_file_write_size 128k;gzip on;gzip_min_length 1k;gzip_buffers 4 16k;gzip_http_version 1.0;gzip_comp_level 2;gzip_types text/plain application/x-javascript text/css application/xml;gzip_vary on;#limit_zone crawler $binary_remote_addr 10m;#server虚拟主机的配置include /etc/nginx/conf.d/*.conf;}
upstream application {server docker-spring-boot:8080;}server{listen 80;#监听端口server_name localhost;#域名access_log /var/log/nginx/nginx-spring-boot.log;location / {proxy_pass http://application;proxy_set_header Host $host:$server_port;proxy_set_header X-Real-IP $remote_addr;proxy_set_header REMOTE-HOST $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}}
cd /var/lib/jenkins/workspace/docker-spring-boot/spring-boot-nginx-docker-demomvn clean packageif [ -e "./volumes/app/docker-spring-boot.jar" ]then rm -f ./volumes/app/docker-spring-boot.jar \&& cp ./target/docker-spring-boot.jar ./volumes/app/docker-spring-boot.jar \&& docker restart docker-spring-boot \&& echo "update restart success"else mkdir volumes/app -p \&& cp ./target/docker-spring-boot.jar ./volumes/app/docker-spring-boot.jar \&& docker-compose -p docker-spring-boot up -d \&& echo "first start"fi


Nginx容器运行结果查看:

version: '3.7'services:app:restart: alwaysbuild: ./hostname: docker-spring-bootcontainer_name: docker-spring-bootimage: docker-spring-boot/latestvolumes:- ./volumes/app/docker-spring-boot.jar:/app/docker-spring-boot.jar- ./volumes/app/logs:/app/logsapp-bak:restart: alwaysbuild: ./hostname: docker-spring-bootcontainer_name: docker-spring-boot-bakimage: docker-spring-boot/latestvolumes:- ./volumes/app/docker-spring-boot.jar:/app/docker-spring-boot.jar- ./volumes/app/logs-bak:/app/logsnginx:depends_on:- appcontainer_name: docker-nginxhostname: docker-nginximage: nginx:1.17.6environment:TZ: Asia/Shanghairestart: alwaysexpose:- 80ports:- 80:80links:- app- app-bakvolumes:- ./volumes/nginx/nginx.conf:/etc/nginx/nginx.conf- ./volumes/nginx/conf.d:/etc/nginx/conf.d- ./volumes/nginx/logs:/var/log/nginxnginx更改default.conf的upstream,添加冗余容器配置upstream application {server docker-spring-boot:8080 fail_timeout=2s max_fails=2 weight=1;server docker-spring-boot-bak:8080 fail_timeout=2s max_fails=2 weight=1;}server{listen 80;#监听端口server_name localhost;#域名access_log /var/log/nginx/nginx-spring-boot.log;location / {proxy_pass http://application;proxy_connect_timeout 2s;proxy_set_header Host $host:$server_port;proxy_set_header X-Real-IP $remote_addr;proxy_set_header REMOTE-HOST $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}}Jenkins添加冗余容器重启脚本BUILD_ID=DONTKILLMEcd /var/lib/jenkins/workspace/docker-spring-boot/spring-boot-nginx-docker-demomvn clean packageif [ -e "./volumes/app/docker-spring-boot.jar" ]then rm -f ./volumes/app/docker-spring-boot.jar \&& cp ./target/docker-spring-boot.jar ./volumes/app/docker-spring-boot.jar \&& docker-compose -p docker-spring-boot up -d \&& docker restart docker-spring-boot \&& docker restart docker-spring-boot-bak \&& docker restart docker-nginx \&& echo "update restart success"else mkdir volumes/app -p \&& cp ./target/docker-spring-boot.jar ./volumes/app/docker-spring-boot.jar \&& docker-compose -p docker-spring-boot up -d \&& echo "first start"fi
volumes/app放置了不同容器的日志,如该例子的logs、logs-bak
停止任一SpringBoot容器docker stop docker-spring-boot,仍可通过url/api通过Nginx访问
可以看出容器配置集群的以下优点:
安全性高,每一个应用都只属一个容器,通过特定配置才可与主机、其它容器交互
统一配置文件,简单粗暴的方式解决端口、路径、版本等配置问题,如该项目即使运行了2个8080端口的SpringBoot容器而不需担心端口的冲突、暴露问题,一切都在容器内解决
省略手动应用安装,易于迁移,由于版本、配置、环境等都已配置在Docker的配置文件中,所以不用担心更换机器后出现的各种配置、环境问题,且通过镜像拉取与容器运行可以省略如Nginx、Redis、Mysql等应用的安装与配置

如有收获请划至底部
点击“在看”支持,谢谢!
关注马士兵
每天分享技术干货
点赞是最大的支持
文章转载自马士兵,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。








