【大咖講堂-171期】Docker在云家政的應用
大家晚上好,我是Fighter,今晚由我給大家分享《Docker在云家政的應用》,首先我介紹一下公司的背景,公司屬于中小型創業公司,服務器數量不多,但是為了解決一些問題,我們引入了現在比較火的Docker技術。我們公司目前大規模使用了Docker,目前除了數據庫應用,其他所有應用都在Docker容器內運行,下面我就Docker在公司的應用做一些分享。
面臨問題
看一下我們在沒用Docker之前遇到的問題:
線上環境和測試環境不完全一致,導致測試好的功能上線后會出現一些BUG。
部署新項目步驟繁瑣,批量部署運行環境后,需要根據每個項目不同的情況,手動修改配置參數。
新項目環境部署耗費時間長。有些項目部署需要幾十分鐘甚至更長時間。
操作系統版本的差異,導致批量部署遇到麻煩。
不能跨平臺部署環境。
這就是我們的現狀,正是有了這些問題,我們就要解決這些問題。
Docker簡介
這里我再簡單對Docker做一下介紹:
Docker是一個新的容器化開源項目,誕生于 2013 年初,最初是 dotCloud 公司內部的一個業余項目,項目后來加入了 Linux 基金會,遵從了 Apache 2.0 協議,基于 Google 公司推出的 Go 語言實現。
Docker?提供了一個可以運行你的應用程序的容器,它可以將應用以及依賴包到一個可移植的容器中,然后發布到任何 Linux機器上;
Docker?擴展了 Linux 容器(Linux Containers)通過一個高層次的 API 為進程單獨提供了一個輕量級的虛擬環境,有點類似虛擬機的概念。
鏡像倉庫
了解了Docker后,接下來看我們是怎么把Docker用起來的,這里容我再介紹一下公司的背景,公司屬于中小型創業公司,服務器數量不多,沒有用高大上的Kubernetes、Swarm等Docker集群管理工具。
我們都知道為了方便Docker的部署,一般都需要一個Docker私有倉庫來存放鏡像,我們也有自己的私有倉庫,看一下我們公司的私有鏡像倉庫是什么樣子的,里面都存放了哪些鏡像。
我們的鏡像倉庫里面存放了應用服務鏡像,如Tomcat,Nginx等,API服務鏡像;
NoSQL鏡像,如Redis服務,MongoDB服務,ES服務等;
這些鏡像都是根據我們自己的實際需要打包好的環境鏡像,新項目需要什么服務,直接拉取私有倉庫的鏡像,快速的部署。
有了鏡像倉庫,看一下我們是怎么制作鏡像的?
我們使用了Dockerfile制作鏡像,每個環境都有對應的Dockerfille文件,可以根據實際需要隨時調整鏡像。
以我們其中一個應用服務環境鏡像為例(Nginx+php),看一下我們的鏡像制作過程:
1、從Docker官方鏡像倉庫拉取PHP5.6作為基礎鏡像;
2、基于基礎鏡像安裝Nginx以及PHP需要的擴展;
3、修改Nginx和PHP的配置;
4、生成指定服務的專用鏡像;
5、將生成好的鏡像提交至私有倉庫;
看一下公司的Dockerfile文件及構建鏡像的命令:
Dockerfile文件內容:
FROMphp:5.6.31-fpm
RUN apt-get update&& apt-get install -y \
nginx \
libfreetype6-dev \
libjpeg62-turbo-dev \
libmcrypt-dev \
libpng12-dev \
libxml2-dev \
libssl-dev \
git \
vim \
&& pecl install redis mongodb mongo\
&& docker-php-ext-enable redismongodb mongo \
COPY./nginx_vhost_conf/* /etc/nginx/sites-enabled/
docker build –t ?hub.yunjiazheng.com/front_web:v1.0 .??構建鏡像命令。
docker pushhub.yunjiazheng.com/front_web:v1.0???提交鏡像到私有倉庫。
快速部署流程
接下來看一下我們如何利用鏡像快速部署環境的。
首先,我們服務器在安裝完操作系統,初始化系統的時候就會把Docker客戶端安裝好。
然后,服務器上只需要執行docker pull 拉取一個鏡像。然后執行docker run 啟動鏡像,就可以快速部署好一個需要的環境的。
# docker pull hub.yunjiazheng.com/front_web:v1.0
# docker run –d –p 80:80hub.yunjiazheng.com/front_web:v1.0
執行docker部署的命令。
我來解釋一下上述兩條命令:
docker pullhub.yunjiazheng.com/front_web:v1.0
是從hub.yunjiazheng.com這個私有鏡像倉庫拉取front_web鏡像,鏡像版本是v1.0;
docker run –d –p80:80 hub.yunjiazheng.com/front_web:v1.0
這條命令-d是在后端運行容器,-p是映射容器的80端口。然后啟動容器;
這樣就部署好了一個需要的環境,大家看,是不是很easy?
云家政運維平臺
上面看了Docker部署環境的流程后,有一個問題,同一個鏡像運行起來的容器如何區分測試環境和線上環境呢?
為了區分容器運行的環境,接下來要用到云家政的運維平臺了。
云家政運維平臺運維是自主開發的平臺,平臺集成了環境管理、配置管理、發布管理、任務管理等功能。
在環境管理會先創建好需要的多套環境,例如beta、線上。
創建完環境后,會為每個環境添加不同的配置參數,然后發布的時候選擇主機和鏡像及要發布的環境就可以自動化部署一套環境。
舉個栗子指定服務器A部署A1項目的測試環境:
運維平臺自動登錄A服務器,拉取A1項目需要的環境鏡像,拉取A1項目代碼,再拉取平臺上為A1項目配置好的測試環境參數,然后啟動容器就可以自動部署一套可運行的環境。
看一下我們環境管理的界面:
下面是環境參數的管理界面:
對不同的環境 配置不同的參數。
運維平臺里面的配置管理,可以在線管理線上、測試環境等配置信息,配置管理可以添加、刪除、修改代碼連接的數據庫信息、redis信息等配置信息。
實現邏輯大致如圖所示:
接下來看一下我們通過運維平臺部署好的應用的界面:
主機就是發布好的主機,版本是容器運行鏡像的版本,狀態是容器的運行狀態,在這里可以對容器進行遠程管理。
目前云家政所有服務除了數據庫是直接運行在操作系統上,其他所有應用服務都實現了容器化,每個項目服務都有對應的鏡像,可以在最快幾秒內實現服務的快速部署。
運維平臺通過調用服務器上Docker? API接口實現對容器的啟動、關閉、執行命令、更新鏡像等自動化管理。引入Docker給我們又帶來了什么好處呢?
Why Docker?
收益:
保證了運行環境的一致性,線上環境和測試環境使用同一個鏡像,測試環境測試通過后,上線后不會出現因為環境差異而導致Bug;
部署新項目方便快捷,不用考慮操作系統的差異而導致自動部署失??;
新項目部署速度快,可在秒級部署好一個項目環境;
服務鏡像制作完成后,可以多次快速部署,方便快速橫向擴展服務;
支持跨平臺部署;
以上的收益恰好解決了之前我們所說的問題。
目前我們公司運維平臺因為一些功能還不完善,等完善后,后續會將運維平臺開源。以上是公司對Docker使用的一點分享,后續如果有機會可以分享一下我們的運維平臺。建了一個docker應用交流的微信群,后續有問題的可以在群里交流。感謝大家的收看。
————廣告時間————
《馬哥Linux云計算及架構師》課程,由知名Linux布道師馬哥創立,經歷了8年的發展,聯合阿里巴巴、唯品會、大眾點評、騰訊、陸金所等大型互聯網一線公司的馬哥課程團隊的工程師進行深度定制開發,課程采用 Centos7.2系統教學,加入了大量實戰案例,授課案例均來自于一線的技術案例。
開課時間:11月06號