1.制作2個jar-srpingboot demo包
這里我分享現(xiàn)成的jar包
2. 編寫Dockerfile
FROM java:alpine
RUN mkdir -p /app
WORKDIR /app
EXPOSE 8080
ENV LANG en_US.UTF-8
#RUN apk add --update --no-cache ttf-dejavu fontconfig && rm -rf /var/cache/apk/*
ADD demo.jar ./demo.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app/demo.jar"]
3.構(gòu)建鏡像
docker build -t demo:v1.0 .
4.運行容器
docker container run -dit -p:8080 -m 1G -e "SPRING_PROFILES_ACTIVE=test" -e "SERVICE_IP=內(nèi)/外網(wǎng)IP" -e "SERVICE_CHECK_HTTP=/actuator/health/" --name demo demo:v1.0 /bin/bash
5.檢測consul注冊服務(wù)情況
image.png
6.瀏覽器輸入域名
輪詢獲取2個jar輸出內(nèi)容
image.png
再刷新就只獲取jar包2 因為jar包1停了 掂恕,那么在jar包1停的時候程序自動更換獲取到j(luò)ar包2的過程并沒有發(fā)生客戶端異常就說明滾動無感更新成功
image.png
nginx配置如下:
upstream demoapi {
server 127.0.0.1:2365;
upsync 127.0.0.1:8500/v1/catalog/service/demo upsync_timeout=20m upsync_interval=500ms upsync_type=consul_services strong_dependency=off;
upsync_dump_path /etc/nginx/servers/www.demo.com.conf;
check interval=3000 rise=2 fall=5 timeout=10000;
keepalive 20000;
}
server {
listen 80;
server_name demo.xxx.com;
large_client_header_buffers 4 128k;
location / {
client_body_buffer_size 1024k;
client_max_body_size 0;
proxy_connect_timeout 300s;
proxy_send_timeout 900;
proxy_read_timeout 900;
proxy_buffer_size 64k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_redirect off;
proxy_hide_header Vary;
proxy_set_header Accept-Encoding '';
proxy_set_header Host $host;
proxy_set_header Referer $http_referer;
proxy_set_header Cookie $http_cookie;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_buffering off;
proxy_headers_hash_max_size 51200;
proxy_headers_hash_bucket_size 6400;
proxy_temp_file_write_size 64k;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_pass http://demoapi/;
}
}
jenkins pipeline流水線版本化發(fā)布更新 ----后續(xù)可以把打好的包傳到指定多臺服務(wù)器上然后依次主機上去docker run容器 更新發(fā)布從而實現(xiàn)無感發(fā)布更新 -可以通過ansible 或者 shell腳本 或者pipeline自帶
image.png
node {
// 拉取代碼
stage('Prepare Stage') {
echo "1.GIT Prepare Stage"
branches: [[name: '${tag}']]
git branch: 'test', credentialsId: 'xxx-xx-4', url: 'git@git.code.tencent.com:gzlle-biz-api/xxx-xxx.git'
}
// 代碼編譯
stage('Gradle Build') {
sh '''
cd /www/code/imagine-bms/ && git branch -a && git pull && gradle bootJar &&
mv /www/imagine-bms/imagine-bms.jar /www/imagine-bms/imagine-bms.jar.old &&
mv /www/code/imagine-bms/build/libs/imagine-bms-1.0.1.jar /www/imagine-bms/imagine-bms.jar
'''
}
// 項目打包到鏡像并推送到鏡像倉庫
stage('Build and Push Image') {
sh '''
cd /www/imagine-bms/ && pwd
REPOSITORY=10.0.1.15/library/imagine-bms:${tag}
cat > Dockerfile << EOF
FROM 10.0.1.15/library/java:alpine
#RUN apk add -U tzdata
#RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN mkdir -p /app
WORKDIR /app
EXPOSE 7010
ENV LANG en_US.UTF-8
#RUN apk add --update --no-cache ttf-dejavu fontconfig && rm -rf /var/cache/apk/*
ADD imagine-bms.jar /app/imagine-bms.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app/imagine-bms.jar"]
EOF
docker build -t $REPOSITORY .
docker login 10.0.1.15
docker push $REPOSITORY
'''
}
// 部署到Docker主機
stage('Deploy to Docker') {
sh '''
REPOSITORY=10.0.1.15/library/imagine-bms:${tag}
docker rm -f imagine-bms |true
docker rmi -f 10.0.1.15/library/imagine-bms:v1.0 |true
docker container run -dit -p:7010 -m 1G -e "SPRING_PROFILES_ACTIVE=test" -e "SERVICE_IP=10.0.1.9" -e "SERVICE_CHECK_HTTP=/actuator/health/" --name imagine-bms $REPOSITORY /bin/bash
'''
}
}
image.png