Docker+Jenkins+GIT+Tomcat實戰持續化整合,dockerjenkins

來源:互聯網
上載者:User

Docker+Jenkins+GIT+Tomcat實戰持續化整合,dockerjenkins

一、Nginx的應用概述

Nginx作為一款高效能的http伺服器/反向 Proxy伺服器以及電子郵件(IMAP/POP3)Proxy 伺服器。

1、http伺服器

Nginx是一個http服務可以獨立提供http服務

2、虛擬機器主機
可以實現在一台伺服器虛擬出多個網站。例如個人網站使用的虛擬機器主機。

3、反向 Proxy,負載平衡
當網站的訪問量達到一定程度後,單台伺服器不能滿足使用者的請求時,需要用多台伺服器叢集可以使用nginx做反向 Proxy。並且多台伺服器可以平均分擔負載,不會因為某台伺服器負載高宕機而某台伺服器閑置的情況。

二、什麼是虛擬機器主機

虛擬機器主機技術是互連網伺服器採用的節省伺服器硬體成本的技術,虛擬機器主機技術主要應用於HTTP(Hypertext Transfer Protocol,超文字傳輸通訊協定 (HTTP))服務,將一台伺服器的某項或者全部服務內容邏輯劃分為多個服務單位,對外表現為多個伺服器,從而充分利用伺服器硬體資源。


虛擬機器主機是使用特殊的軟硬體技術,把一台真實的物理伺服器主機分割成多個邏輯儲存單元。每個邏輯單元都沒有物理實體,但是每一個邏輯單元都能像真實的物理主機一樣在網路上工作,具有單獨的IP地址(或共用的IP地址)、獨立的網域名稱以及完整的Internet伺服器(支援WWW、FTP、E-mail等)功能。

虛擬機器主機的關鍵技術在於,即使在同一台硬體、同一個作業系統上,運行著為多個使用者開啟的不同的伺服器程式,也互不干擾。而各個使用者擁有自己的一部分系統資源(IP地址、文檔儲存空間、記憶體、CPU等)。各個虛擬機器主機之間完全獨立,在外界看來,每一台虛擬機器主機和一台單獨的主機的表現完全相同。所以這種被虛擬化的邏輯主機被形象地稱為“虛擬機器主機”。

三、Nginx基於主機名稱虛擬機器主機配置

Nginx.conf 系統預設配置參數

#user  nobody;worker_processes  1;#error_log  logs/error.log;#error_log  logs/error.log  notice;#error_log  logs/error.log  info;#pid        logs/nginx.pid;events {    worker_connections  1024;}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"';    #access_log  logs/access.log  main;    sendfile        on;    #tcp_nopush     on;    #keepalive_timeout  0;    keepalive_timeout  65;    #gzip  on;    server {        listen       80;        server_name  localhost;        #charset koi8-r;        #access_log  logs/host.access.log  main;        location / {            root   html;            index  index.html index.htm;        }        #error_page  404              /404.html;        # redirect server error pages to the static page /50x.html        #        error_page   500 502 503 504  /50x.html;        location = /50x.html {            root   html;        }        # proxy the PHP scripts to Apache listening on 127.0.0.1:80        #        #location ~ \.php$ {        #    proxy_pass   http://127.0.0.1;        #}        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000        #        #location ~ \.php$ {        #    root           html;        #    fastcgi_pass   127.0.0.1:9000;        #    fastcgi_index  index.php;        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;        #    include        fastcgi_params;        #}        # deny access to .htaccess files, if Apache's document root        # concurs with nginx's one        #        #location ~ /\.ht {        #    deny  all;        #}    }    # another virtual host using mix of IP-, name-, and port-based configuration    #    #server {    #    listen       8000;    #    listen       somename:8080;    #    server_name  somename  alias  another.alias;    #    location / {    #        root   html;    #        index  index.html index.htm;    #    }    #}    # HTTPS server    #    #server {    #    listen       443 ssl;    #    server_name  localhost;    #    ssl_certificate      cert.pem;    #    ssl_certificate_key  cert.key;    #    ssl_session_cache    shared:SSL:1m;    #    ssl_session_timeout  5m;    #    ssl_ciphers  HIGH:!aNULL:!MD5;    #    ssl_prefer_server_ciphers  on;    #    location / {    #        root   html;    #        index  index.html index.htm;    #    }    #}}
基於不同網域名稱的虛擬機器主機
server {        listen       80;        server_name www.aaa.com;        location / {                root  html/aaa;                index index.html index.htm;        }    }    server {        listen       80;        server_name  www.bbb.com;        #charset koi8-r;        #access_log  logs/host.access.log  main;        location / {            root   html;            index  index.html index.htm;        }

修改完成後在html目錄下建立aaa目錄寫入測試頁如下:

訪問測試如下:

一、概要

開發將源碼上傳到github倉庫,通過jenkins持續整合引擎結合git工具,將源碼拉取到jenkins伺服器,通過工具maven在本地講源碼編譯打包成war包,在ssh到Docker宿主機,通過執行指令碼產生製作自訂的Dockerfile,最終執行產生images,並啟動container,即啟動了包含war包的tomcat,即可實現對外提供web服務。

二、環境部署
主機名稱 IP地址 作用
Docker-server 172.20.6.20 Docker宿主機
Jenkins-server 172.20.6.22 Jenkins伺服器
2.1 Jenkins伺服器配置

Jenkins的安裝及配置Jenkins伺服器的相關工具(maven、git、ssh)配置,詳細步驟可參考jenkins筆記(1)的相關工具的安裝及配置。

2.2 Docker宿主機配置

Docker的基礎命令可參考容器Docker詳解,需要在Docker宿主機pull下tomcat的基礎環境以及jenkins伺服器通過docker使用者登入Docker宿主機,講war包發布到制定目錄,執行特定指令碼來產生Dockerfile,最終根據Dockerfile產生images,並啟動基於包含war包的container,從而實現對外提供WEB服務。

建立ssh發布使用者及目錄

useradd dockerecho "docker:docker" |chpasswd      #為docker使用者佈建密碼mkdir -pv /data/dockerfiles/scripts

上傳指令碼

將指令碼上傳到 /data/dockerfiles/scripts,命名為devops,此名稱可自訂,但是之後在配置jenkins執行ssh命令時候的指令碼名稱需要一致。由於指令碼內部的分發路徑是寫的絕對路徑,所以需要講目錄為固定,也可以根據實際修改。此指令碼author:junsansi,可以參考其進行修改。

cat >/data/dockerfiles/scripts/devops.sh< ${DOCKER_FILE}echo 'MAINTAINER junsansi "junsansi@sina.com"' >> ${DOCKER_FILE}echo "ADD *.war /usr/local/tomcat/webapps/${PROJECT_NAME}.war" >> ${DOCKER_FILE}echo "EXPOSE 8080" >> ${DOCKER_FILE}echo "CMD /usr/local/tomcat/bin/startup.sh && tail -f /usr/local/tomcat/logs/catalina.out" >> ${DOCKER_FILE}cat ${DOCKER_FILE}echo "**Init dockerfile end."# Build dockerfilecd ${DOCKER_FILE_DIR}rm *.war -rfmv /data/dockerfiles/war/${DOCKER_NAME}/*.war ./echo ""echo "##Build dockerfile for "${DOCKER_NAME}/usr/bin/docker build -t ${DOCKER_NAME}:${PROJ_VERSION} . # Run docker containerecho ""echo "##Running docker container: "${DOCKER_NAME}/usr/bin/docker run --name ${DOCKER_NAME}_d1 -d -p ${SPORT}:${DPORT} ${DOCKER_NAME}:${PROJ_VERSION}EOFchmod +x  /data/dockerfiles/scripts/devops.shchown docker.docker /data/dockerfiles -R

Docker宿主機擷取tomcat鏡像

docker pull docker.io/tomcat
使用docker images查看tomcat鏡像

此時Docker宿主機就已經配置完畢。

三、Jenkins配置

登入Jenkins的WEB介面

3.1 配置Docker宿主機的ssh資訊

系統管理---系統設定---Publish over SSH---增加SSH Server
添加SSH Server可以使用密鑰形式添加,也可以直接使用使用者名稱密碼, 此處使用使用者名稱密碼,選擇
Use password authentication, or use a different key,即docker使用者的密碼,進行登入發布,之前已經講/data/dockerfiles目錄的屬主屬組更改為docker,確認Jenkins伺服器使用docker使用者可以正常在此目錄下進行後續操作。

3.2 構建一個maven項目一般設定


為保證Jenkins伺服器的磁碟有充足的空間,在選中丟棄舊的構建->保持構建的最大個數為10個

在真實開發環境中,成員直接相互協助,GIT是多分支的,考慮到分支管理,需在此選中參數化構建->選擇Git Parameter->定義名稱為release_branch,因此選擇參數類型為Branch:如果自己發現devops指令碼可以看到裡面是調用了此參數進行選擇構建的分支。
同時建立考慮到建立Docker的名稱,此時需要給後續建立的docker images以項目的名稱命名。

源碼管理

源碼管理選擇git,填入倉庫url:git@github.com:redhatxl/zrlog.git

此時發現會出現報錯資訊,因為此倉庫為我的私人倉庫,需要配置Credentials,點開add, Add Credentials的 Kind選擇SSH Username with private key,Username選擇之前在github上傳的公開金鑰使用者的使用者名稱,此次為root,Private Key為jenkins伺服器登入github的本地私密金鑰,查看私密金鑰cat /root/.ssh/id_rsa 複製粘貼到Key地區,完成添加。此時可以發現報錯已經消失。

在Branches to build模組需要填寫之前我們參數話的變數,在此引用$release_branch

環境構建

在build的Goals and options添加maven構建參考及命令:clean install -D maven.test.skip=true

增加構建後操作

增加構建後步驟---選擇Send build artifacts over SSH
SSH-Server name選擇Docker宿主機
Transfers中填寫Source files:target/*.war

Remove prefix:target/
Remote directory:/war/projectname,即在遠端/data/dockerfiles下的war目錄(/data/dockerfiles/war/docker01?tomcat?zrlog)Execcommand:/data/dockerfiles/scripts/devop.shprojectname,即在遠端/data/dockerfiles下的war目錄(/data/dockerfiles/war/docker01?tomcat?zrlog)Execcommand:/data/dockerfiles/scripts/devop.shproject_name zrlog $release_branch 8888 8080
即jenkins伺服器ssh到docker宿主機之後執行的指令碼命令,執行/data/dockerfiles/scripts/devop.sh指令碼,此指令碼需要傳入5個參考,
project_name:項目名稱,即docker產生images的名稱
zrlog:即項目名稱
release_branch:在git上提交的分支,此處我們只有master分支
兩個連接埠,前一個連接埠及宿主機的監聽連接埠,後一個連接埠及映射到docker容器內部的連接埠,在此處使用的為tomcat,預設的為8080連接埠。

注意:再次可以添加多個server,即實現叢集,可以講web伺服器為無狀態,將記錄檔掛載到本地物理磁碟以實現日誌監控即資料持久化儲存。

添加增加構建後操作,選擇Editable Email Notification,利用外掛程式郵件來發送通知。
可以根據需求自訂郵件主題與內容,此處添加資訊接受人,由於全域配置了always,在進階設定內,填寫接受人郵箱。

建立完畢後點擊應用並儲存。

3.3 執行構建

選擇Build with Parameters,然後在右邊release_branch內選擇需要執行的github上的分支,此處為master,同理選擇 project_name,為docker images的name可以選擇自己添加自訂的名字,點擊開始構建

查看Console Output


查看郵件通知

登入docker宿主機查看images與container

網頁測試

至此利用jenkins簡單的實現了講github上的源碼拉去到jenkins伺服器本地,利用maven編譯產生war包並分發到docker宿主機,執行指令碼產生dockerfile,並啟動容器,最終郵件通知。

四、啟動多個容器

在配置jenkins的ssh後的命令我們可以添加多個server從而實現分布式,同時我們也可以對在一台主機上通過區分連接埠號碼來產生多個images並啟動多個不通連接埠的container
在General的參數化構建過程中增加第三個參數proxy_port可以設定為docker宿主機的本地監聽連接埠從而實現多連接埠多執行個體

在ssh命令中調用

在構建開始時可以定義不同的images對應不通的連接埠

查看啟動後的容器

注意:如果有特殊需求,例如發布php代碼或其他可以自行對指令碼進行修改,可以根據需求定義多個參數靈活使用。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.