一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Docker Jenkins Nginx Spring Boot 自動化部署項目

 鷹兔牛熊眼 2020-04-27

1 Docker+Jenkins+Nginx+Spring Boot 自動化部署項目

寫在前面

Docker通過linux的namespace實現(xiàn)資源隔離、cgroups實現(xiàn)資源控制,通過寫時復(fù)制機制(copy-on-write)實現(xiàn)了高效的文件操作,在實際開發(fā)中可用于提供一次性的環(huán)境、微服務(wù)架構(gòu)的搭建、統(tǒng)一環(huán)境的部署。

雖然Docker已經(jīng)是風(fēng)靡全球的容器技術(shù)了,統(tǒng)一環(huán)境避免環(huán)境問題上是Docker的主要吸引點之一,但使用時詳細(xì)還是會遇到不少問題的,比如個人搭建時曾思考過這些問題:
Jenkins官網(wǎng)既然有Docker上安裝Jenkins的流程了,那我該怎么使用Jenkins容器呢?
如果使用Jenkins容器,我該怎么通過Jenkins容器部署SpringBoot項目?是通過Jenkins容器與SpringBoot容器中的文件交互進(jìn)行項目部署嗎?這能做到嗎?又或是把SpringBoot項目放到Jenkins容器中管理,那Jenkins中又要安裝git、maven等一堆東西,這一點都不方便。
使用IDEA Docker插件都可以直接本地連接到服務(wù)器的Docker創(chuàng)建鏡像并運行容器了,為什么還需要Jenkins?
個人在實際搭建部署中也找到了與上相對應(yīng)的答案:
如果使用Jenkins容器,這將使得部署更加麻煩,因Jenkins往往需要配置Maven、git等一系列變量,應(yīng)另尋出路。
Jenkins既然是一款腳本CI工具,而Docker也有自己的腳本,我應(yīng)該將Docker腳本集成到Docker中這方面考慮。
在實際開發(fā)中,Jenkins可能不僅需要項目的部署,還需要進(jìn)行開發(fā)人員的鑒權(quán),如開發(fā)人員A只能查看部署指定項目,管理員可以查看部署所有項目,但Docker主要用于鏡像構(gòu)建與容器運行,無法像Jenkins一樣獲取github/gitlab代碼,也無法進(jìn)行開發(fā)人員的鑒權(quán),所以Docker可以在Jenkins中只扮演簡化部署過程的一個角色。
雖然IDEA插件可以直接把本地打包成功的項目部署服務(wù)器Dcoker并創(chuàng)建鏡像運行容器,但為了安全還需要創(chuàng)建Docker CA認(rèn)證下載到本地再進(jìn)行服務(wù)器上的Docker連接,十分不便捷。
當(dāng)探索到自我提問的答案時,便確定了各組件的主要職責(zé):
Jenkins:接收項目更新信息并進(jìn)行項目打包與Docker腳本的執(zhí)行
Docker:安裝所需應(yīng)用鏡像與運行容器
git:項目信息同步
搭建環(huán)境流程:
  1. 安裝JDK
  2. 安裝Maven
  3. 安裝git
  4. 安裝Jenkins(該步驟之前的可參考Jenkins安裝并部署Java項目完整流程)如有權(quán)限問題可將/etc/sysconfig/jenkins文件JENKINS_USER修改為root或手動賦權(quán)
  5. Centos安裝Docker
  6. 安裝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
使用DockerCompose可省去容器增多時需多次執(zhí)行docker run的麻煩
配置文件
1. SpringBoot項目Dockerfile
















FROM java:8MAINTAINER Wilson
ENV TZ=Asia/ShanghaiRUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
#這里的 /tmp 目錄就會在運行時自動掛載為匿名卷,任何向 /tmp 中寫入的信息都不會記錄進(jìn)容器存儲層VOLUME /ecs-application-dockerRUN mkdir /appWORKDIR /app
#復(fù)制target/spring-boot-web-demo.jar到容器里WORKDIR下COPY target/ecs-application.jar ecs-application.jarEXPOSE 9090
ENTRYPOINT ['java','-jar','ecs-application.jar']
2. 配置docker-compose.yml
































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
3. Nginx
  • ./volumes/nginx/nginx.conf

















































user nginx;worker_processes 2; #設(shè)置值和CPU核心數(shù)一致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;
}
./volumes/nginx/conf.d目錄下的default.conf















upstream application {   server docker-spring-boot:8080;}server{  listen 80;#監(jiān)聽端口  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;  }}
Jenkins部署執(zhí)行流程
maven打包Spring Boot項目為project.jar,根據(jù)是否以第一次項目部署執(zhí)行以下不同的流程:
如當(dāng)前掛載卷已含項目jar(即非第一次運行),則運行以下步驟:拷貝project.jar覆蓋掛載卷中的project.jar重新運行SpringBoot項目容器
如當(dāng)前掛載卷不含項目jar(即非第一次運行),則運行以下步驟:創(chuàng)建掛載卷目錄拷貝project.jar到掛載卷中通過docker-compose讀取docker-compose.yml配置創(chuàng)建鏡像啟動容器
Jenkins腳本(如果Nginx配置更改較多也可添加Nginx容器重啟指令):












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
docker-compose up指令可以進(jìn)行鏡像的安裝,所以也省去了只用docker指令時需要提前準(zhǔn)備好鏡像相關(guān)指令的麻煩。
查看容器是否皆已啟動:docker ps

SpringBoot容器運行結(jié)果查看:
如容器開放了8080端口則可通過http://url:8080/swagger-ui.html測試,也可通過查看Jenkins工作空間下/volumes/app的SpringBoot日志校驗結(jié)果(SpringBoot日志的路徑配置個人設(shè)置為app/logs目錄下,前文已把容器中的app目錄掛載到當(dāng)前項目的volumes/app目錄下)

Nginx容器運行結(jié)果查看:

訪問http://url/swagger-ui.html測試是否Nginx容器已成功連通SpringBoot容器并進(jìn)行了反向代理,也可通過查看Jenkins工作空間下/volumes/nginx/logs的Nginx日志校驗結(jié)果

添加或刪除controller接口再進(jìn)行推到git,查看更改的接口是否可訪問
如需將SpringBoot通過容器集群搭建,只需進(jìn)行以下更改:
docker-compose.yml添加SpringBoot項目冗余,更改冗余容器名,區(qū)分日志掛載路徑,冗余項目更改容器名












































































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/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;#監(jiān)聽端口  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訪問

可以看出容器配置集群的以下優(yōu)點:

  • 安全性高,每一個應(yīng)用都只屬一個容器,通過特定配置才可與主機、其它容器交互

  • 統(tǒng)一配置文件,簡單粗暴的方式解決端口、路徑、版本等配置問題,如該項目即使運行了2個8080端口的SpringBoot容器而不需擔(dān)心端口的沖突、暴露問題,一切都在容器內(nèi)解決

  • 省略手動應(yīng)用安裝,易于遷移,由于版本、配置、環(huán)境等都已配置在Docker的配置文件中,所以不用擔(dān)心更換機器后出現(xiàn)的各種配置、環(huán)境問題,且通過鏡像拉取與容器運行可以省略如Nginx、Redis、Mysql等應(yīng)用的安裝與配置


參考來源:toutiao.com/i6779098800825827852/

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    免费福利午夜在线观看| 成人免费视频免费观看| 国产肥妇一区二区熟女精品| 国产一二三区不卡视频| 欧美中文日韩一区久久| 欧美一级黄片欧美精品| 国产不卡在线免费观看视频| 日本午夜免费福利视频| 国产免费操美女逼视频| 国产精品夜色一区二区三区不卡| 黑丝袜美女老师的小逼逼| 九九热最新视频免费观看| 久久精品偷拍视频观看| 亚洲午夜av一区二区| 日韩欧美中文字幕av| 麻豆果冻传媒一二三区| 久久永久免费一区二区| 国产精品视频一区二区秋霞| 日本免费一本一二区三区| 99热九九在线中文字幕| 日韩性生活视频免费在线观看| 欧美日韩少妇精品专区性色| 富婆又大又白又丰满又紧又硬 | 一区二区欧美另类稀缺| 亚洲欧美精品伊人久久| 国产又猛又黄又粗又爽无遮挡| 中文文精品字幕一区二区| 老鸭窝老鸭窝一区二区| 九九热精品视频免费在线播放| 久久热这里只有精品视频| 色综合伊人天天综合网中文| 老司机这里只有精品视频| 欧美不卡午夜中文字幕| 厕所偷拍一区二区三区视频| 成年人黄片大全在线观看| 亚洲中文在线观看小视频| 国产精品成人一区二区在线 | 欧美中文日韩一区久久| 成人精品一级特黄大片| 日韩中文字幕免费在线视频| 青青操精品视频在线观看|