1 Docker+Jenkins+Nginx+Spring Boot 自动化部署项目
写在前面
Docker通过linux的namespace实现资源隔离、cgroups实现资源控制,通过写时复制机制(copy-on-write)实现了高效的文件操作,在实际开发中可用于提供一次性的环境、微服务架构的搭建、统一环境的部署。
sudo curl -L 'https://github.com/docker/compose/releases/download/1.25.0/docker-compose-$(uname -s)-$(uname -m)' -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
docker-compose --version
FROM java:8
MAINTAINER Wilson
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
#这里的 /tmp 目录就会在运行时自动挂载为匿名卷,任何向 /tmp 中写入的信息都不会记录进容器存储层
VOLUME /ecs-application-docker
RUN mkdir /app
WORKDIR /app
#复制target/spring-boot-web-demo.jar到容器里WORKDIR下
COPY target/ecs-application.jar ecs-application.jar
EXPOSE 9090
ENTRYPOINT ['java','-jar','ecs-application.jar']
version: '3.7'
services:
app:
restart: always
build: ./
hostname: docker-spring-boot
container_name: docker-spring-boot
image: docker-spring-boot/latest
# 不对外开放端口,只能通过容器访问
# ports:
# - 8080:8080
volumes:
- ./volumes/app:/app
nginx:
depends_on:
- app
container_name: docker-nginx
hostname: docker-nginx
image: nginx:1.17.6
environment:
TZ: Asia/Shanghai
restart: always
expose:
- 80
ports:
- 80:80
links:
- app
volumes:
- ./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-demo
mvn clean package
if [ -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: always
build: ./
hostname: docker-spring-boot
container_name: docker-spring-boot
image: docker-spring-boot/latest
volumes:
- ./volumes/app/docker-spring-boot.jar:/app/docker-spring-boot.jar
- ./volumes/app/logs:/app/logs
app-bak:
restart: always
build: ./
hostname: docker-spring-boot
container_name: docker-spring-boot-bak
image: docker-spring-boot/latest
volumes:
- ./volumes/app/docker-spring-boot.jar:/app/docker-spring-boot.jar
- ./volumes/app/logs-bak:/app/logs
nginx:
depends_on:
- app
container_name: docker-nginx
hostname: docker-nginx
image: nginx:1.17.6
environment:
TZ: Asia/Shanghai
restart: always
expose:
- 80
ports:
- 80:80
links:
- app
- app-bak
volumes:
- ./volumes/nginx/nginx.conf:/etc/nginx/nginx.conf
- ./volumes/nginx/conf.d:/etc/nginx/conf.d
- ./volumes/nginx/logs:/var/log/nginx
nginx更改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=DONTKILLME
cd /var/lib/jenkins/workspace/docker-spring-boot/spring-boot-nginx-docker-demo
mvn clean package
if [ -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等应用的安装与配置
参考来源:toutiao.com/i6779098800825827852/
联系客服