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代碼或其他可以自行對指令碼進行修改,可以根據需求定義多個參數靈活使用。