原創:Docker在雲家政的應用 謝絕複製粘貼內容

来源:http://www.cnblogs.com/dsab/archive/2017/08/24/7425570.html
-Advertisement-
Play Games

我們公司目前大規模使用了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分鐘,後面如果鏡像沒更新,只是更新代碼,也就幾秒完成。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 存儲函數 定義 CREATE FUNCTION `fn_sum`(`a` int,`b` int) RETURNS int(11) BEGIN RETURN a + b; END 調用 Navicat工具中的調用 運行結果: Sql調用 SELECT fn_sum(1,2); 運行結果: Java中 ...
  • 要創建新帳戶時分配密碼,請使用 CREATE USER並包含 IDENTIFIED BY子句 要為現有帳戶分配或更改密碼,請使用以下方法之一: 1) 使用ALTER USER帶有IDENTIFIED BY子句的語句: 如果您沒有作為匿名用戶連接,您可以更改自己的密碼,而不必直接命名自己的帳戶: 2) ...
  • GREENPLUM總體結構: 資料庫由Master Severs和Segment Severs通過Interconnect互聯組成。 Master主機負責:建立與客戶端的連接和管理;SQL的解析並形成執行計劃;執行計劃向Segment的分發收集Segment的執行結果;Master不存儲業務數據,只 ...
  • 1. 準備工作 1.1. 軟體準備 1、安裝VMWare 2、在VMWare上安裝CentOS6.5 3、安裝XShell5,用來遠程登錄系統 4、通過rpm -qa | grep ssh 檢查cent os 是否安裝了ssh server和ssh client ,然後使用ssh localhost ...
  • 本文說明的是一條linux命令在執行時大致要經過哪些過程?以及這些過程的大致順序。 1.1 shell解析命令行 shell讀取和執行命令時的大致操作過程如下圖: 以執行以下命令為例: echo -e "some files:" ~/i* "\nThe date:$(date +%F)\n$name ...
  • 監測命令的運行時間 time command $ time sleep 5 real 0m5.003s # 程式開始至結束的時間,包括其它進程占用的時間片和IO時間 user 0m0.001s # 進程真正執行占用CPU的時間 sys 0m0.002s # 進程在內核中調用所消耗的CPU時間 use ...
  • 通俗的講,環境變數就是告訴電腦 (實際是操作系統)幾個目錄。這幾個目錄下存儲幾個執行文件,如前面顯示的/usr/bin目錄,大部分的系統命令都在這個目錄下。 當我們輸入命令mkdir時,系統就會在環境變數所代表的幾個目錄從前到後去查找,哪個裡面有mkdir文件,然後去執行mkdir命令。 系統中環境 ...
  • ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...