摘要:從到到的部署經驗工作中,除了開發功能,還負責系統的部署工作。我從頻繁的部署工作中,逐漸找到了一些偷懶的方法。同時在構建成功后執行我們輸入的命令,來達到自動化部署的工作。缺點也是有的,很難保證對方部署的環境是最新的。
從Docker 到Jenkins 到Ansible的部署經驗
工作中,除了開發功能,還負責系統的部署工作。我從頻繁的部署工作中,逐漸找到了一些偷懶的方法。從傳統的Java -jar命令啟動服務,到通過Docker 容器構建部署服務,再后來通過自動化部署工具Jenkins來完成部署,最后再結合Ansible完成遠程部署。一步步的進步極大的減少部署工作,提高了工作效率(增加了許多劃水時間)。
Docker 簡介Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然后發布到任何流行的Linux機器上,也可以實現虛擬化,容器是完全使用沙箱機制,相互之間不會有任何接口。
Docker給我的印象很深,沒有什么環境是docker pull 解決不了的,
常用命令docker ps , docker ps 默認顯示運行中的容器,-a 顯示所有,-l顯示近期創建的容器 docker start xxx , 啟動xxx容器 docker restart xxx , 重啟xxx容器 docker run xxx , 創建并運行xxx容器 docker build -t xxx . ,使用 Dockerfile 創建鏡像 docker stop xxx , 關閉容器 docker rm xxx , 刪除容器 docker images , 查看所有鏡像 docker rmi xxx , 刪除xxx鏡像 docker exec -it xxx sh , 進入xxx容器中,用quit退出 docker logs -f xxx --tail 500 , 查看xxx容器的日志,顯示最后500行,常用命令 docker inspect xxxx , 查看容器配置信息 docker-compose -f app.yml up -d , 按照app.yml文件配置以debug形式啟動 docker-compose -f app.yml down , 按照app.yml文件配置形式關閉使用場景
第一步:在gradle項目加入docker插件,即在gradle.build 文件中加入以下代碼。需要注意的有插件的版本,項目打包后的名稱,Dockerfile文件目錄
dependencies { classpath("se.transmode.gradle:gradle-docker:1.2") } apply plugin: "docker" task buildDocker(type: Docker, dependsOn: build) { push = false applicationName = "項目名" dockerfile = file("src/main/docker/Dockerfile文件目錄") doFirst { copy { from jar into stageDir } } }
第二步:創建Dockerfile文件,文件目錄要和第一步中設置的保持一致。需要配置jdk鏡像和基本的啟動參數
FROM frolvlad/alpine-oraclejdk8:slim VOLUME /tmp ADD 項目jar名稱.jar app.jar RUN sh -c "touch /app.jar" ENV JAVA_OPTS="" ENV PORT="6666" ENV DB_CONNECTION="jdbc:mysql://ip:port/database" ENV DB_USER="user" ENV DB_PASSWORD="password" ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar --spring.datasource.url=$DB_CONNECTION --spring.datasource.usernam=$DB_USER --spring.datasource.password=$DB_PASSWORD --port=$PORT"]
第三步:將jar拷貝到服務器上,然后執行編譯,運行的docker命令
一)、通過gradle的bootJar,將項目打包。同時需要把引入的第三方jar也要一起打入到項目jar中。
二)、Windows系統中可以通過Xftp將jar和Dockerfile文件拷貝同一個目錄下。Linux系統可以通過scp命令上傳文件。
三)、執行docker ps,查看當前運行的容器,執行docker stop和docker rm 關閉和刪除之前舊版本的容器
四)、找到jar的目錄,并在當前目錄下,執行 docker build -t 鏡像名稱 . 的命令編譯項目,注意后面的點不要漏了。
五)、編譯成功后執行 docker run --name 容器名 -v /tmp:/tmp -p 對外開發的端口:項目啟動的端口 鏡像名:latest 。啟動容器
六)、執行docker ps,查看容器啟動是否正常啟動。同時執行docker logs -f 容器名 --tail 500,查看容器啟動日志,檢查是否有異常
七)、最后瀏覽器訪問一下,已確保部署成功。
全稱大概需要幾分鐘的時間,雖然不算麻煩。可次數多了,就很麻煩了。有沒有什么好的工具幫助我們完成這一系列操作呢?答案是肯定的。
Jenkins 簡介The leading open source automation server, Jenkins provides hundreds of plugins to support building, deploying and automating any project.
Jenkins 的logo是一個管家的形象,很貼切。對它的理解比較膚淺。他通過管理Git上的項目,來確保每次打包的jar都是最新的。同時在構建成功后執行我們輸入的shell命令,來達到自動化部署的工作。
使用場景第一步:創建一個負責編譯的Jenkins項目,
在Jenkins控制臺頁面,點擊頁面左上角的“新建”按鈕。再輸入項目名后,可以選擇創建一個空項目,也可以在頁面最下面選擇copy from 其他項目。不管如何創建,我們需要Jenkins管理項目的源碼,構建和構建后的操作。
第二步:創建一個負責運行的Jenkins項目
以同樣的方式創建項目,在構建觸發器上,選擇第一步創建的項目,構建的Shell命令是先刪除之前的容器,然后在重新運行容器。若之前的容器不存在,則會構建失敗。所以第一次構建的時候把第一行命令刪掉。解決方案傻乎乎的,只是因為沒有花時間去處理。
第三步:選擇編譯項目,點擊立即構建,當第一個項目構成成功后,會自動觸發運行項目。等待兩個項目都成功后,就可以訪問瀏覽器,檢查功能。
有了Jenkins,一切變得輕松很多。但他也有一個較大的弊端,就是使用前必須要先安裝。特別是在客戶的服務器上,也許別人就只跑這一個服務,你給別人整了一個Jenkins,似乎有點大材小用了。有沒有好的解決方法?答案是肯定的。
Ansible 簡介Ansible is an IT automation tool. It can configure systems, deploy software, and orchestrate more advanced IT tasks such as continuous deployments or zero downtime rolling updates.
從接觸到使用Ansible大概有一天的時間,對它的理解也是比較膚淺。我單純的認為,他可以幫助我們在服務器之間傳輸文件,同時還可以執行一些shell命令。抱著這樣的想法,我們可以通過Jenkins完成自動化編譯,再通過Ansible傳輸資源文件到部署的環境中,同時執行啟動Shell命令。
使用場景第一步:修改Jenkins運行項目的構建Shell,將之前的docker run改成
ansible-playbook ansible命令文件路徑/app.yaml
第二步:創建Ansible腳本文件app.yaml,目錄和第一步中設置的保存一致,模版大致如下
- hosts: "需要部署的遠程服務ip" tasks: - name: "關閉舊版本的容器" shell: docker stop xxx ignore_errors: true - name: "刪除舊版本的容器" shell: docker rm xxx ignore_errors: true - name: "刪除之前的舊文件" shell: rm -rf /舊文件路徑/* - name: "傳輸Dockerfile文件" copy: src=/文件目錄/Dockerfile dest=/遠程服務指定目錄 - name: "傳輸Jar文件" copy: src=/jar目錄/xxx.jar dest=/遠程服務指定目錄 - name: "構建docker 鏡像" shell: chdir=/jar所在目錄 nohup docker build -t 鏡像名 . - name: "啟動容器" shell: nohup docker run --name 容器名 -v /掛載路徑/:/掛載路徑/ -p 對外端口:服務端口 -d 鏡像名:latest
第三步:在Jenkins上構建編譯項目。
前后端項目的部署到這里,三種部署的流程就完成了。如果你熟悉Docker的方式構建,再用Jenkins和Ansible的時候,就會簡單很多。我在實際開發中,項目是前后端分離的。公司做了兩個方案,
第一種:前后端分開部署,即Jenkins上有四個項目。前端和后端各兩個項目。這樣的好處就是前后端互不影響。不會因為對方的錯誤而從新編譯。缺點也是有的,很難保證對方部署的環境是最新的。
第二種:把前后端放在一個項目中,一次構建完成兩個項目的打包部署。缺點是構建慢,優點就是保證兩端的代碼都是最新的,適合發布到預發布環境和正式環境。
那么,針對前后端一起部署的需求,Jenkins和Ansible同樣也需要簡單的修改。其思路就是Jenkins負責編譯項目,將資源文件壓縮,再通過Ansible上傳到其他服務器上。執行解壓,構建,啟動的命令。
看起來視乎很簡單,但有一個坑希望你們跨過去。前端打包需要npm或者其他工具,但是你的服務器上沒有安裝。此時請務必通過Jenkins控制臺,或者用Jenkins帳號登錄服務器安裝這些工具。筆者就是通過root帳號登錄服務器安裝的npm,通過Jenkins編譯時提示沒有權限。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/27578.html
摘要:目前我們正采取措施,通過逐步改善現有過程來實現持續部署。在這篇文章中,我們將看看如何使用和來改善此設計。通過使用,在未來我們可以輕松地將構建和部署任務集成起來,從而得到額外的好處。月日,北京海航萬豪酒店,容器技術大會即將舉行。 在這一系列文章的第一篇中,我們分享了只用Docker時我們開發的初步的工作流,如何創建一個基礎的構建和部署流水線。容器的部署方式不再是在登陸server的時候從...
摘要:當面臨這些挑戰在短短半天的時間里,使用和現有的主機,我們已經將部署好并成功運行。使用來創建應用并定義服務。 在這一部分,我們將一步步的走進Rancher,細致的探討Rancher將如何解決在部署與容器管理時出現的種種的問題。回顧教程的第二部分,你會發現我們已經將應用的部署遷移至Docker Compose,并且已經建立了一系列工作步驟來部署我們的應用。這將使得開發人員能夠輕松的對他們的...
摘要:行業內各巨頭的自動化運維架構都各種功能各種酷炫,如下圖,讓人可望不可及。面對這么多問題,我就想啊,如何在低成本情況下實現自動化運維。自動擴縮容通過配置告警規則,調用相應就可以實現實戰以上就是筆者關于自動化運維的一些實踐。 行業內各巨頭的自動化運維架構都各種功能各種酷炫,如下圖,讓人可望不可及。現在最終的樣子大家都知道了,但問題是如何根據自己團隊當前的情況一步步向那個目標演進?筆者所在團隊,三...
摘要:工程師選擇了環境中的一臺當前沒有在負載均衡器中被激活的主機。工程師登陸到這臺主機并從注冊表中獲取新的版本。在生產維護窗口中,更新負載均衡器使其指向更新過的主機。然而將部署代碼化的問題仍然存在。 這篇文章是一系列文章的第一篇,在這一系列文章中,我們想要分享我們如何使用Docker、Docker-Compose和Rancher完成容器部署工作流的故事。我們想帶你從頭開始走過pipeline...
閱讀 786·2021-11-11 16:54
閱讀 1517·2021-08-24 10:01
閱讀 1911·2019-08-30 15:54
閱讀 3296·2019-08-29 14:02
閱讀 3129·2019-08-28 18:22
閱讀 2244·2019-08-28 18:09
閱讀 3698·2019-08-26 10:26
閱讀 2664·2019-08-23 18:23