摘要:實踐四環境容器化最近把公司的環境做了容器化,目前達到的效果是代碼提交到,觸發將代碼部署到測試服務器,然后就可以根據前后端不同的分支組合的域名來訪問,從而省去了每次前后端代碼都合并到分支才能測試的環節。
Docker 實踐(四): Beta 環境容器化
最近把公司的 beta 環境做了容器化,目前達到的效果是代碼提交到 gitlab,觸發 webhook 將代碼部署到測試服務器,然后就可以根據前后端不同的分支組合的域名來訪問,從而省去了每次前后端代碼都合并到 master 分支才能測試的環節。
系統架構 域名路由nginx-proxy 是一個 Docker 容器, 是實現本文解決方案的神器,只需簡單的配置,便可實現為多個容器路由的功能。
1. 在服務器上安裝并運行docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy2. 泛域名解析
假設有域名 foo.bar, 使用泛域名解析將 *.foo.bar解析到當前服務器即可。
3. 啟動下游容器假設有一個運行 web 服務的容器,只需要在啟動的時候加上 -e VIRTUAL_HOST=web.foo.bar,就可以實現對該容器的訪問了。
docker run -e VIRTUAL_HOST=web.foo.bar ...
可視化管理注意:如果使用 docker-compose 管理多個容器的時候,docker-compose 會為這些容器創建一個網橋,這樣會使得后來手動創建的容器沒法被路由,所以這里不建議使用 docker-compose 來管理。
ui-for-docker 是一個基于 docker remote api 實現的 web 管理界面,雖然界面不怎么樣,但是基本上常用的功能已經實現了,前端使用 angular 實現,可以根據自己的需求作修改。
修改方法clone 代碼
npm install && bower install
grunt run (更多操作可參看 gruntFile.js 文件)
代碼部署使用 Gitlab 提供的 webhook 功能完成自動部署代碼,期間遇到一些問題:
文件寫入權限通過 webhook 的請求執行用戶是 www-data,如果要在 hook 腳本中進行文件的寫入操作是總會遇到權限問題,最暴力的辦法就是給目錄全部 777 或者在 Dockerfile 中將 www-data 用戶加入 sudo 組,并且無需輸入密碼。
echo " data-www ALL=NOPASSWD: ALL" >> /etc/sudoers
當然,正式的環境中需要對權限做嚴格控制,做到最小權限原則。
hook 響應超時Gitlab 觸發 hook 請求之后會一直等待服務器返回 HTTP 200 的狀態碼,如果沒收到,會重復觸發 hook,如果 hook 腳本執行時間過長會導致 HTTP 請求超時,或者一次代碼提交觸發多次部署請求,所以最后我選擇用異步的方式,hook 腳本只需要接受上線指令,寫入隊列,上線過程交給另外一個腳本來完成。
為了減少環境配置的麻煩,可以使用文件隊列,php 可參考 Filefifo.php。
可將隊列目錄掛載到 webhook 容器上,即可實現容器內部寫入,主機讀取隊列(可使用supervisor 來管理該進程),完成代碼部署的過程。
日志回顯使用 supervisor 管理上線腳本進程,需要把日志回顯到 web 界面,首先在 supervisor 的配置文件中配置好日志路徑,然后創建一個 websocket 容器,將日志目錄掛載到容器中,再tail 讀取日志文件,實時顯示在 web 界面。
可參考 websocket。
socket.io
node-tail
下游容器下游容器將前后端環境做了分離,降低耦合度,在使用過程中會減少一些麻煩。分離時會遇到瀏覽器同源策略的問題,可將前后端容器做互聯,然后后端容器反向代理到前端容器。
前端容器參考: frontend
后端容器參考: backend
在部署代碼的時候可根據不同的分支將代碼部署到不同的目錄,然后創建容器的時候把不同的分支目錄掛載到不同的容器中,即可實現開發分支的隨意搭配。
精簡鏡像對于一些服務,有時候只需要一個非常簡單的 web 容器就可以,比如上面的前端容器,但是如果使用 ubuntu + nginx 的配置的時候會發現鏡像要幾百兆,很不劃算,所以考慮精簡鏡像。
受這篇文章的啟發,打算自己用 go 實現一個簡單的 web 服務器,這樣 build 好的鏡像基本上只有十幾兆,但是因沒有做相關的測試,所以還不敢放在線上。
最后選擇了使用 alpine + nginx 的策略,build 之后的鏡像之后幾十兆,已經減少了很多冗余的東西,具體可參考simple-nginx。
結語經過無數次踩坑和不停的折騰,終于可以勉強使用了,當然還存在一些瑕疵,之后會慢慢修復。
感謝期間幫助過我的每一位同事。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/26697.html
摘要:此刻的后手指依舊飛速地敲打鍵盤,絲毫沒有要停不下來意思。閱讀本期技術周刊,你不光能弄明白什么是,使用的意義何在,還將被傳授秘籍,以達的境界。周刊篩選的每篇內容,是作者的獨到見解,踩坑總結和經驗分享。 showImg(https://segmentfault.com/img/bVC5qJ?w=900&h=385); 啪嗒啪嗒,啪嗒啪嗒,聽到后排動感十足的清脆鍵盤響,我就能猜到公司程序員定...
摘要:使用有一段時間了,打算把自己實踐過程中的一些理解和感悟記錄下來。目錄實踐一了解架構實踐二使用教程實踐三下構建開發環境實踐四環境容器化實踐五生產環境容器化實踐六容器監控實踐七提升幸福感實踐八構建開發環境實踐九生產環境優化參考源碼分析系列文章 使用 docker 有一段時間了,打算把自己實踐過程中的一些理解和感悟記錄下來。 系列文章發布在 SegmentFault 上我的專欄 Tairy,...
摘要:雖然可以使用相同的方式部署應用到云端,使用外部負載均衡器,但動態添加或者減少負載均衡節點依舊是痛點。這對使用外部負載均衡器幫助巨大。 數人云今天帶來的本篇文章將分享Docker在應用程序生命周期每個階段中所扮演的角色,以及遷移到Swarm集群時需要考慮的問題。 利用Docker來開發 Docker讓工作更輕松。如需要一個部署安裝MySQL數據庫,或者安裝Ghost,又或者Redis數據...
摘要:系列文章第五篇中介紹了線上生產環境使用集群,這篇文章對原來的架構進行了優化,同時使用了最新的一些特性,記錄一些流水賬。配置文件鑒于上次搭建時配置文件管理混亂,這次做了統一規劃為每個環境創建不同的配置文件,可以以環境名后綴。刪除無用的容器。 系列文章第五篇中介紹了線上生產環境使用 Docker 集群,這篇文章對原來的架構進行了優化,同時使用了 Docker 最新的一些特性,記錄一些流水賬...
摘要:數人云容器助力產品迭代力沙龍干貨分享實錄持續上新,今天是來自人人貸高級運維工程師杜天鵬的分享,與我們細數了人人貸容器化實踐過程中遇到的問題以及解決方法。 數人云容器助力產品迭代力MAX沙龍干貨分享實錄持續上新,今天是來自人人貸高級運維工程師杜天鵬的分享,與我們細數了人人貸容器化實踐過程中遇到的問題以及解決方法。 很高興站在這里和大家一起交流容器技術,我叫杜天鵬,是人人貸的運維工程師。人...
閱讀 2975·2021-09-22 15:18
閱讀 3397·2019-08-30 15:54
閱讀 3276·2019-08-30 15:53
閱讀 592·2019-08-30 14:12
閱讀 819·2019-08-29 17:01
閱讀 2204·2019-08-29 14:04
閱讀 1390·2019-08-29 13:09
閱讀 867·2019-08-26 17:40