Docker容器化開發流程(一)介紹

目標

  • 瞭解容器化開發模式
  • 瞭解容器化開發流程

參考: Docker技術入門與實戰 第二版 書籍

[認識容器](https://snailclimb.gitee.io/javaguide/#/docs/tools/Docker)

Docker 從入門到實踐

以下多引用於Docker技術入門與實戰 第二版這本書籍

容器化開發模式

  • 傳統開發流程

    傳統模式中,開發團隊在開發環境中完成軟件開發,本地完成單元測試,測試通過,則可提交到代碼版本管理庫;測試團隊打包進行進一步測試。運維團隊把應用部署到測試環境,開發團隊或測試團隊再次進行測試,沒問題後通知部署人員發佈到生產環境。
    
    在上述過程中涉及三個環境:開發、測試和生產,以及三個團隊:開
    發、測試、運維。多個環境和多個團隊之間的這種交互,很容易出現彼此環境不一致的情況,浪費不必要的人力物力。
    

    在之前的工作流程中,基本可以分爲測試環境和線上環境兩種。

    開發階段:一般是本公司的服務器提供測試環境,測試環境提供關係型數據庫或者是nosql數據庫環境支持,開發人員本地使用本機的jdk和tomcat開發和測試。

    測試階段:開發人員將項目部署到測試環境下,在測試環境中安裝jdk和tomcat部署運行項目,供測試人員測試

    線上階段:通常要把各種服務(比如nginx,mysql,jdk,tomcat,redis等等),安裝到由客戶提供的線上環境中,再部署和運行項目。

    出現的問題:測試環境和線上環境會存在差異,本來在測試環境項目好好的,到線上環境後項目就不能正常運行。這是真實存在的,何況在客戶提供的服務器,線上可能還運行着很多服務,很多時候不能快速定位項目爲什麼會運行報錯,也不能擅自修改某些服務配置。或者本身的測試環境可能是windows,但是現在換成了linux。

    想要解決的問題:使用容器化的技術,docker來解決環境不一致的情況

  • 容器化開發流程

    在容器化的應用中,項目架構師和開發人員的作用貫穿整個開發、測
    試、生產三個環節。
    項目伊始,架構師根據項目預期創建好需要的基礎 base 鏡像,nginx、tomcat、mysql鏡像或者將 Dockerfile 分發給所有開發人員,所有開發人員根據 Dockerfile 創建的容器或者從內部倉庫下載的鏡像進行開發,達到開發環境的充分一致。若開發過程中需要添加新的軟件,只需要向架構師申請修改基礎 base 鏡像的 Dockerfile即可。
    開發任務結束後,架構師調整 Dockerfile或者Docker 鏡像,然後分發給測試部門,測試部門馬上就可以進行測試,消除了部署困難等難纏的問題。
    

在這裏插入圖片描述

注意事項
首先,在開發和測試環境中,推薦使用- v 共享文件夾來存儲開發人員的
程序代碼,避免頻繁打包操作。
其次,利用基礎 base 鏡像的繼承特性來調整鏡像的輕微變更。例如當需
要測試程序對不同版本 JDK 的支持情況時,只需改變 base 鏡像的 JDK 設置,然
後其他依賴它的鏡像在重新創建的過程中就可以自動完成更新。
最後,測試部門應當注意 Docker 以及鏡像的版本,並經常對部署後的應
用程序進行性能上的測試。

生產環境使用docker 的問題

如果Docker 出現不可控的風險,是否考慮了備選的解決方案;
 
是否需要對 Docker 容器做資源限制,以及如何限制,如CPU、內存、網
絡、磁盤等;
 
目前,Docker對容器的安全管理做得不夠完善,在應用到生產環境之前
可以使用第三方工具來加強容器的安全管理。如使用 apparmor 對容器的能力進行限制、使用更加嚴格的 iptable 規則、禁止 root 用戶登錄、限制普通用戶權限以及做好系統日誌的記錄;

容器化流程

基於上面提供的內容,我們來嘗試搭建一下這種方案。

每一步會單獨寫一個文檔,來學習和了解這種方式

  • 第一步:指定基礎的dockerfile文件,搭建基礎鏡像。

    目標:
    * 瞭解dockerfile 的文件指令
    * 瞭解如果創建鏡像
    
    
    假設我們的項目是spring boot 工程,需要連接mysql 和 redis 數據庫,假定測試環境是linux 環境,通過 nginx 代理,將請求分發到兩個tomcat上,也就是說通過兩個tomcat 提供服務,那我們需要創建以下這些鏡像文件:
    
    jdk+tomcat   一個鏡像
    nginx 一個鏡像
    mysql  一個鏡像
    redis  一個鏡像
    
    
    這裏有一個疑問
    爲什麼不把所有服務,都封裝成一個鏡像,這跟我們之前安裝服務有區別嗎?
    將多個應用服務解耦到不同容器中,保證了容器的橫向擴展和複用。
    應該保證在一個容器中只運行一個進程。
    儘量讓每個鏡像的用途都比較集中、單一,避免構造大
    而複雜、多功能的鏡像;複雜鏡像會讓後期的維護和修改難以進行。
    容器應該是短暫的:
    通過 Dockerfile 構建的鏡像所啓動的容器應該儘可能短暫(生命週期短)。「短暫」意味着可以停止和銷燬容器,並且創建一個新容器並部署好所需的設置和配置工作量應該是極小的。如果創建一個包含很多服務的鏡像,在容器啓動和配置方面是很複雜的。
    使用docker來配置和啓動服務會更加方便。
    
    參考:https://yeasy.gitbooks.io/docker_practice/introduction/why.html
    
    
    
  • 第二步:搭建私有docker register (倉庫)

    目標:
    * 瞭解如何搭建私有docker 倉庫
    
    通常公司的環境都是內網的,開發人員和測試人員是連接不上docker hub 的,就算制定好了鏡像,發佈到 docker hub 上也是pull不下來的。更何況有時候並不想將配置好的鏡像發佈到公網上面。
    所以,需要搭建私有的docker倉庫,將基礎鏡像上傳到私有docker倉庫供其他人下載使用。
    
    
  • 第三步:在測試環境 pull 鏡像,將容器啓動起來,開發人員在本地開始開發項目。

    目標:
     * 瞭解容器間的互聯和端口映射
    
    這裏會涉及到容器間的互聯和宿主機與容器的端口映射
    
  • 第四步:將項目提交至測試環境運行測試,並將測試環境同步到線上環境

    目標:
    * 通過修改基礎鏡像,將鏡像部署到線上環境,運行項目
    

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章