我們公司目前大規模使用了Docker,目前除了資料庫應用,其他所有應用都在Docker容器內運行,下麵我就Docker在公司的應用做一些分享。、 首先我介紹一下公司的背景,公司屬於中小型創業公司,伺服器數量不多,但是為瞭解決一些問題,我們引入了現在比較火的Docker技術。 看一下我們在沒用Dock ...
我們公司目前大規模使用了Docker,目前除了資料庫應用,其他所有應用都在Docker容器內運行,下麵我就Docker在公司的應用做一些分享。、
首先我介紹一下公司的背景,公司屬於中小型創業公司,伺服器數量不多,但是為瞭解決一些問題,我們引入了現在比較火的Docker技術。
看一下我們在沒用Docker之前遇到的問題:
1、線上環境和測試環境不完全一致,導致測試好的功能上線後會出現一些BUG。
2、部署新項目步驟繁瑣,批量部署運行環境後,需要根據每個項目不同的情況,手動修改配置參數。
3、新項目環境部署耗費時間長。有些項目部署需要幾十分鐘甚至更長時間
4、操作系統版本的差異,導致批量部署遇到麻煩
5、不能跨平臺部署環境。
有了這些問題,我們就要解決這些問題
這裡我再簡單對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文件內容:
FROM php: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 redis mongodb mongo \
COPY ./nginx_vhost_conf/* /etc/nginx/sites-enabled/
docker build –t hub.yunjiazheng.com/front_web:v1.0 . 構建鏡像命令
docker push hub.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:80 hub.yunjiazheng.com/front_web:v1.0
docker部署的命令
我來解釋一下這2條命令:
docker pull hub.yunjiazheng.com/front_web:v1.0
是從hub.yunjiazheng.com 這個私有鏡像倉庫拉取front_web鏡像,鏡像版本是v1.0
docker run –d –p 80:80 hub.yunjiazheng.com/front_web:v1.0
這條命令-d是在後端運行容器,-p是映射容器的80埠。然後啟動容器
這樣就部署好了一個需要的環境。
上面看了Docker部署環境的流程後,有一個問題,同一個鏡像運行起來的容器如何區分測試環境和線上環境呢。
為了區分容器運行的環境,接下來要用到雲家政的運維平臺了。
雲家政運維平臺運維是自主開發的平臺,平臺集成了環境管理、配置管理、發佈管理、任務管理等功能
在環境管理會先創建好需要的多套環境,例如beta、線上。
創建完環境後,會為每個環境添加不同的配置參數,然後發佈的時候選擇主機和鏡像及要發佈的環境就可以自動化部署一套環境。
例如指定伺服器A部署A1項目的測試環境:
運維平臺自動登錄A伺服器,拉取A1項目需要的環境鏡像,拉取A1項目代碼,再拉取平臺上為A1項目配置好的測試環境參數,然後啟動容器就可以自動部署一套可運行的環境。
看一下我們環境管理的界面:
下麵是環境參數的管理界面:
對不同的環境 配置不同的參數。
運維平臺裡面的配置管理,可以線上管理線上、測試環境等配置信息,配置管理可以添加、刪除、修改代碼連接的資料庫信息、redis信息等配置信息.
運維平臺提供測試環境、線上環境的配置信息API介面,伺服器容器啟動的時候會根據伺服器類型去獲取不同的配置信息API來獲取不同的參數,並將伺服器部署成不同的應用環境。
實現邏輯大致是上面的圖形展示的這樣。
接下來看一下我們通過運維平臺部署好的應用的界面:
主機就是發佈好的主機,版本是容器運行鏡像的版本,狀態是容器的運行狀態,在這裡可以對容器進行遠程管理。
目前雲家政所有服務除了資料庫是直接運行在操作系統上,其他所有應用服務都實現了容器化,每個項目服務都有對應的鏡像,可以在最快幾秒內實現服務的快速部署。
運維平臺通過調用伺服器上Docker API介面實現對容器的啟動、關閉、執行命令、更新鏡像等自動化管理。
現在大家來看一下我們引入Docker後都得到了哪些好處:
1、保證了運行環境的一致性,線上環境和測試環境使用同一個鏡像,測試環境測試通過後,上線後不會出現因為環境差異而導致Bug。
2、部署新項目方便快捷,不用考慮操作系統的差異而導致自動部署失敗。
3、新項目部署速度快,可在秒級部署好一個項目環境
4、服務鏡像製作完成後,可以多次快速部署,方便快速橫向擴展服務
5、支持跨平臺部署。
目前我們公司運維平臺因為一些功能還不完善,等完善後,後續會將運維平臺開源。
以上是公司對Docker使用的一點分享,後續如果有機會可以分享一下我們的運維平臺。
感謝大家的收看。
Q1 貴公司使用編排工具了嗎?
公司目前還沒有用到docker的編排工具,公司的運維平臺通過調用docker的介面的方式實現對docker的自動化管理。
Q2:貴公司如何保證容器還在運行中,容器內服務已經掛掉,還能正常對外提供服務。
目前是利用python開發了一些腳本實現對容器內部的資源的監控,後期運維平臺會集成監控報警功能,對容器內部的資源和服務進行監控。
Q3 貴公司使用的是什麼網路?如何跨主機調用的,實例銷毀後ip會變化嗎。
目前還是使用docker預設的網路,容器映射埠實現跨主機調用,容器內部ip發生變化對調用沒有影響。
Q4 日誌也在容器裡面嗎? 如果研發要看日誌怎麼辦呢.
日誌有些項目我們是將代碼映射在宿主機上,開發要看就在宿主機看。不過後面我們運維平臺也會支持查看指定文件或者日誌。Q4 日誌也在容器裡面嗎? 如果研發要看日誌怎麼辦呢.
日誌有些項目我們是將代碼映射在宿主機上,開發要看就在宿主機看。不過後面我們運維平臺也會支持查看指定文件或者日誌。Q6 nginx和php在一個容器中,一次構建發佈需要多久?
這個很快,拉鏡像和代碼是內網拉取,第一次可能稍慢2-3分鐘,後面如果鏡像沒更新,只是更新代碼,也就幾秒完成。
Q5 請問docker持久化存儲是如何實現的?
除了一些重要的應用的數據定期自動備份數據實現數據持久化,像資料庫這種重要應用沒有在容器內運行。
Q6 nginx和php在一個容器中,一次構建發佈需要多久?
這個很快,拉鏡像和代碼是內網拉取,第一次可能稍慢2-3分鐘,後面如果鏡像沒更新,只是更新代碼,也就幾秒完成。