836
技術社區[雲棲]
輕鬆玩轉應用容器化(一)- 初識容器遷移工具Derrick
前言
2017年是容器領域交戰非常激烈的一年,容器編排領域逐漸形成一超多強的局麵,各種容器解決方案變得越來越成熟,傳統的中間件(監控、日誌、報警)對容器化場景支持逐漸完善。到了今年,如果一家公司還沒有開始對Docker進行關注,真的不好意思說是在互聯網的圈子裏了。
越來越多的企業開始在生產環境中使用容器技術進行架構,在各種互聯網大會上,也有越來越多的嘉賓開始分享他們在使用容器上的心得。但是選擇容器技術進行整體的技術架構轉型實際上需要極大勇氣的,在幾年前,容器的解決方案還不完善,第一批吃螃蟹的企業和開發者都頭破血流的搭建容器的集群、修改可選項不多的開源工具、適應著整個流程的變更。今天,容器架構的技術債務已經基本還清,k8s、swarm、prometheus、grafana等等一係列容器相關的開源工具都被越來越多的企業與開發者證明他們的穩定,選擇容器化已經沒有那麼痛苦。但是,我們發現依舊有很多大型的企業在進行容器化轉型前有所猶豫,那麼大家的猶豫的點在什麼。
Derrick助力企業容器化轉型
很多大型企業對容器的認知是清晰的,容器能夠帶來的好處是顯而易見的,但是同樣也會帶來一些成本。如果投入和產出的邊際效益並不可觀,那麼會讓很多企業沒有動力使用容器。總結起來這些根本的因素並不是架構的變更帶來的技術成本,而是使用容器後對於現有流程的衝擊,而這個衝擊並不是指技術的投入,真正的衝擊是對人的衝擊,是使用容器後對於人的學習成本與習慣成本的衝擊。如果使用容器需要讓所有的開發者都成為Docker的專家,這樣的成本我想大部分的公司都無法接受。容器技術或者容器平台缺乏一個橋梁,可以無縫將提供的服務與開發者的本地代碼連接起來,這個才是對於容器化而言的最大痛點。
於是基於這一點,在今年的杭州雲棲大會上,阿裏雲容器團隊開源了阿裏雲容器遷移工具Derrick。Derrick的idea在早在去年3月就開始醞釀,當時mesos、k8s、swarm還在群雄割據,使用容器的開發者的關注點還在到底該選用哪個編排工具以及相應的上下遊的解決方案支持。很多時候當一個大型企業下定決心選擇了容器編排工具以及上下遊方案後發現團隊中大部分開發人員連完整的Dockerfile都沒有辦法完整寫出來,更別提如何進行容器化架構改造帶來的其他技術成本了。為了解決這個問題,我們為客戶編寫了大量的Dockerfile,包括Java、Python、C++、NodeJs等常見語言、常見框架的都做了支持。在支持客戶的過程中發現大部分的Dockerfile的編寫工作是由運維人員或者開發Team中的極少數人編寫的,大部分的開發者傾向於對Docker是無感知的,而是通過Jenkins或者自動化流程來進行自動部署。從中我們可以發現三件事情:1.一個公司應用編程框架是可複製的,一個Dockerfile可以在多個團隊間共享。2.使用容器的公司或者團隊一定會有少數幾個人員會成為Docker的專家。3.直接在測試環境容器化驗證會導致持續集成的流程變得更長,更難排查問題。
為了解決這個問題我們萌發了構建一個自動化工具的想法,通過自動化工具將一些預定好的Dockerfile挖坑,通過探測或者開發者填寫信息,然後轉變為Dockerfile。最開始的思路比較簡單,隻需要一個類似yeoman的工具,可以將不同的語言或者框架定義成模板,然後開發者自己填寫參數進而進行預定的Dockerfile以及相關文件的渲染,再通過封裝Docker命令屏蔽開發者本地驗證的學習成本。按照這個想法做出了雛形之後,我們發現真實的情況是有所出入的,一個從零開始的項目會能夠快速的進行容器化流程開發,但是對於大部分企業而言如何遷移一個應用是更常見的場景。因此,就按照這個想法借鑒Buildpack的思維,構建了現在的Derrick,目前支持NodeJs與Java兩種語言,通過代碼的探測、分析可以在幾秒鍾內完成一個應用高質量的容器化過程。
Derrick一鍵實現容器化
Derrick是一個Python語言的本地工具,目前支持NodeJs、Python、Java,開發者可以通過pip在本地進行安裝
# 不常使用Python的開發者建議先執行 sudo pip install --ignore-installed six 升級six包
sudo pip install python-derrick
下麵我們通過一個簡單的NodeJs進行舉例
# 下載NodeJs demo項目
git clone git@github.com:ringtail/derrick-nodejs-demo.git
# 進入項目目錄
cd derrick-nodejs-demo
# 運行Derrick 輸入想要構建的鏡像與版本例如: nodejs-demo:0.1
derrick init
# 本地驗證容器化結果
derrick up
首次執行derrick init
的結果如下
8888888b. d8b 888
888 "Y88b Y8P 888
888 888 888
888 888 .d88b. 888d888888d888888 .d8888b888 888
888 888d8P Y8b888P" 888P" 888d88P" 888 .88P
888 88888888888888 888 888888 888888K
888 .d88PY8b. 888 888 888Y88b. 888 "88b
8888888P" "Y8888 888 888 888 "Y8888P888 888
===================================================
Derrick is a scaffold tool to migrate applications
You can use Derrick to migrate your project simply.
===================================================
This is the first time to run Derrick.
Successfully create DERRICK_HOME in /Users/zhongweilzw/.derrick
Derrick detect your platform is NodeJs and compile successfully.
此時在項目的根目錄下已經生成了Dockerfile、docker-compose.yml等文件了,而這些配置文件則會成為後續整個DevOps流程的基礎配置信息,此時執行derrick up
的結果如下。
Building web
Step 1/14 : FROM registry.cn-beijing.aliyuncs.com/codepipeline/node:6 AS base
---> c0cea7b613ca
Step 2/14 : WORKDIR /app
---> Using cache
---> c8c07dfd8dc9
Step 3/14 : COPY package.json .
---> Using cache
---> 055581ce2b5c
Step 4/14 : RUN npm set progress=false && npm config set depth 0
---> Using cache
---> 623f6b32520b
Step 5/14 : RUN npm install --only=production --registry=https://registry.npm.taobao.org
---> Using cache
---> f69ea9289d5c
Step 6/14 : RUN cp -R node_modules prod_node_modules
---> Using cache
---> 53ac8e86e88b
Step 7/14 : RUN npm install --registry=https://registry.npm.taobao.org
---> Using cache
---> d75ad55f841b
Step 8/14 : FROM base As test
---> d75ad55f841b
Step 9/14 : COPY . /app
---> Using cache
---> 5eb0247a9f71
Step 10/14 : RUN npm test
---> Using cache
---> 765536e52fc6
Step 11/14 : FROM base AS release
---> d75ad55f841b
Step 12/14 : COPY --from=base /app/prod_node_modules /app/node_modules
---> c1f1db7c2dc9
Step 13/14 : COPY . /app
---> 6c340f7d54ee
Step 14/14 : CMD npm start
---> Running in 3bec7ae892b4
---> 9ab9c384c029
Removing intermediate container 3bec7ae892b4
Successfully built 9ab9c384c029
Successfully tagged registry.cn-beijing.aliyuncs.com/ringtail/nodejs-demo:latest
WARNING: Image for service web was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating nodejsdemo_web_1 ...
Creating nodejsdemo_web_1 ... done
Your application has been up to running! You can run `docker ps` to get exposed ports.
通過 docker ps
,我們可以找到此時映射的端口,通過訪問端口,即可在本地驗證應用容器化的效果。
(venv) derrick-nodejs-demo git:(master) docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c47e02a9fe0d nodejs-demo:0.1 "npm start" 3 seconds ago Up 2 seconds 0.0.0.0:32774->3000/tcp derricknodejsdemo_web_1
訪問瀏覽器localhost:32774,一個NodeJs的應用已經容器化完畢了。
尾聲
Derrick目前暫時隻支持NodeJs、Python、Java三種語言,但是Derrick的強大之處在於他的插件體係,開發者可以定義自定義插件的方式來實現自己特定場景的探測。在下一篇文章中會講解下如何通過自定義插件的方式來實現自定義業務的容器化。
Derrick地址:https://github.com/alibaba/derrick,歡迎大家積極參與,提交代碼。
最後更新:2017-10-18 23:03:16