在當今的軟體開發環境中,容器化技術已成為不可或缺的一部分。Docker Registry 作為容器映像的中心儲存函式庫,扮演著關鍵角色。本文將引導讀者瞭解如何建立和組態安全的 Docker Registry,並搭配藍綠佈署策略,實作可靠的應用程式交付。同時,我們也將探討 Ansible 和 Jenkins 如何在自動化佈署流程中發揮作用,並強調監控對於確保應用程式穩定性和安全性的重要性。
在現代軟體開發中,容器化技術已成為不可或缺的一部分,而 Docker Registry 正是容器映像的中心儲存函式庫,扮演著關鍵角色。本文將引導讀者瞭解如何建立和組態安全的 Docker Registry,並搭配藍綠佈署策略,實作可靠的應用程式交付。同時,我們也將探討 Ansible 和 Jenkins 如何在自動化佈署流程中發揮作用,並強調監控對於確保應用程式穩定性和安全性的重要性。 藉由 Ansible 的自動化能力,可以簡化基礎設施的管理和維護,並確保組態的一致性。而 Jenkins 則可以整合不同的 DevSecOps 工具,建立自動化的 CI/CD 流程,從而提高軟體交付的速度和效率。最後,監控系統可以提供實時的可見性,幫助團隊及時發現和解決問題,確保應用程式的穩定性和安全性。
使用 Docker Registry 進行容器化管理
在現代化的 DevSecOps 環境中,容器化技術扮演著至關重要的角色。Docker Registry 是用於儲存和管理容器映像的關鍵工具。本章節將探討如何建立和組態 Docker Registry,以及如何安全地佈署容器。
建立 Docker Registry
首先,我們需要建立一個 Docker Registry。這個過程涉及建立一個安全的儲存函式庫,用於存放和管理容器映像。以下是建立 Docker Registry 的步驟:
- 
建立儲存目錄:首先,我們需要為 Docker Registry 建立一個儲存目錄,用於存放容器映像。 mkdir -p /opt/registry
- 
執行 Docker Registry 容器:接下來,我們使用 Docker 執行一個 Registry 容器。這個容器將作為我們的私有 Docker Registry。 docker run -d -p 5000:5000 --name registry -v /opt/registry:/var/lib/registry registry:2
- 
組態 SSL/TLS:為了確保資料傳輸的安全,我們需要為 Docker Registry 組態 SSL/TLS。這涉及建立 SSL 憑證和金鑰。 openssl req -x509 -newkey rsa:4096 -nodes -keyout domain.key -out domain.crt -days 365 -subj "/C=TW/ST=Taiwan/L=Taipei/O=Example/CN=dockreg.braingia.org"
- 
組態認證:為了控制對 Docker Registry 的存取,我們需要組態使用者認證。這可以透過建立一個包含使用者名稱和密碼的 htpasswd檔案來實作。docker run --entrypoint htpasswd httpd:2 -Bbn reginald regpass > /opt/registry/auth/htpasswd
- 
重新啟動 Docker Registry 容器:在組態完成後,我們需要重新啟動 Docker Registry 容器,以使組態生效。 docker stop registry docker rm registry docker run -d -p 443:443 --name registry -v /opt/registry:/var/lib/registry -v /opt/registry/auth:/auth -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -v /path/to/ssl:/certs -e "REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt" -e "REGISTRY_HTTP_TLS_KEY=/certs/domain.key" registry:2
登入 Docker Registry 並上傳映像
在建立和組態 Docker Registry 之後,我們需要登入並上傳容器映像。以下是具體步驟:
- 
登入 Docker Registry:使用 docker login命令登入到 Docker Registry。docker login dockreg.braingia.org當提示輸入使用者名稱和密碼時,輸入之前組態的使用者名稱 reginald和密碼regpass。
- 
下載並標記映像:下載一個容器映像(例如 Alpine Linux),並將其標記為我們的私有 Registry 中的映像。 docker pull alpine docker tag alpine dockreg.braingia.org/alpine
- 
上傳映像:將標記的映像上傳到我們的私有 Docker Registry。 docker push dockreg.braingia.org/alpine
- 
驗證映像:上傳完成後,可以透過刪除本地映像並從私有 Registry 提取來驗證映像是否成功上傳。 docker rmi alpine docker rmi dockreg.braingia.org/alpine docker pull dockreg.braingia.org/alpine
內容解密:
- 登入 Docker Registry:使用 docker login命令並提供正確的使用者名稱和密碼,以確保對私有 Registry 的安全存取。
- 下載並標記映像:透過 docker pull和docker tag命令,將公共映像下載到本地並重新標記,以便上傳到私有 Registry。
- 上傳映像:使用 docker push命令將重新標記的映像上傳到私有 Docker Registry,確保映像可以在組織內部共用。
- 驗證映像:透過刪除本地映像並從私有 Registry 提取映像,驗證上傳過程是否成功。
藍綠佈署策略
藍綠佈署是一種安全佈署程式碼的策略,透過使用兩套基礎設施來降低佈署風險。當前生產環境被標記為「藍色」環境,而即將上線的新環境則被標記為「綠色」環境。一旦「綠色」環境透過測試,生產流量將被切換到「綠色」環境。
藍綠佈署的優勢
- 降低風險:透過使用兩個獨立的環境,藍綠佈署降低了因佈署新程式碼而導致的生產環境中斷風險。
- 快速回復:如果在「綠色」環境中發現問題,可以快速將流量切換回「藍色」環境,從而實作快速回復。
- 簡化管理:藍綠佈署簡化了佈署流程,因為它提供了清晰的環境區分和流量切換機制。
實施藍綠佈署的步驟
- 準備兩個環境:設定兩個相同的環境,分別為「藍色」和「綠色」環境。
- 佈署新程式碼:將新程式碼佈署到「綠色」環境中。
- 測試「綠色」環境:對「綠色」環境進行全面測試,以確保其穩定性和正確性。
- 切換流量:一旦「綠色」環境透過測試,將生產流量切換到「綠色」環境。
- 監控和驗證:在流量切換後,持續監控「綠色」環境的表現,以確保其符合預期。
隨著容器化技術和 DevSecOps 實踐的不斷發展,未來將會有更多的工具和方法出現,以進一步簡化和增強佈署流程。持續關注最新的技術趨勢和最佳實踐,將有助於組織保持競爭力並實作更高效的軟體交付。
  graph LR
    A[開始] --> B[建立 Docker Registry]
    B --> C[組態 SSL/TLS]
    C --> D[組態認證]
    D --> E[上傳映像到 Registry]
    E --> F[藍綠佈署]
    F --> G[測試綠色環境]
    G --> H[切換流量到綠色環境]
    H --> I[監控和驗證]
圖表翻譯:
此圖表展示了從建立 Docker Registry 到實施藍綠佈署的整個流程。首先,建立 Docker Registry 並組態 SSL/TLS 和認證。接著,將容器映像上傳到 Registry。然後,透過藍綠佈署策略,將新程式碼佈署到「綠色」環境並進行測試。最後,切換生產流量到「綠色」環境,並進行監控和驗證。
詳細說明
- 建立 Docker Registry:此步驟涉及建立一個私有的 Docker Registry,用於儲存和管理容器映像。
- 組態 SSL/TLS:透過組態 SSL/TLS,確保資料傳輸的安全性。
- 組態認證:設定使用者認證機制,以控制對 Docker Registry 的存取。
- 上傳映像到 Registry:將容器映像上傳到私有 Docker Registry,以便在組織內部共用。
- 藍綠佈署:透過藍綠佈署策略,安全地將新程式碼佈署到生產環境,降低風險並簡化管理。
- 測試綠色環境:對「綠色」環境進行全面測試,以確保其穩定性和正確性。
- 切換流量到綠色環境:一旦「綠色」環境透過測試,將生產流量切換到「綠色」環境。
- 監控和驗證:在流量切換後,持續監控「綠色」環境的表現,以確保其符合預期。
透過遵循這些步驟和策略,組織可以實作更安全、更高效的容器化應用佈署。
佈署、營運與監控
當應用程式進入生產環境時,其背後的程式碼應該已經經過多次審查和多種方式的測試。程式碼的佈署,無論是在容器、雲端還是傳統與雲端混合環境中,都應該已經進行過多次,這樣當程式碼進入生產環境時,意外情況就會減少。這種「左移」的工作方式是DevOps和DevSecOps的核心主題。在軟體開發生命週期(SDLC)的早期階段,以可重複的方式進行佈署、營運和監控,有助於DevSecOps實踐者更早發現問題,而不是在後期,當問題對時間表和終端使用者的影響更大時。
本章節將探討CI/CD,認為自動化的CI/CD是一個目標,首先在SDLC的左側實作,然後進入品質保證和生產環境。本章還強調了監控作為DevSecOps成功的一個重要因素。
持續整合與持續佈署
在過去二十年中,現代應用程式佈署所需的複雜度顯著增加。在許多組織中,由於需要在生產環境中佈署應用程式,不能出現任何停機時間。以前,佈署可能在凌晨進行,導致後端應用程式(如資料函式庫伺服器)在更改架構時停機,現在功能旗標和藍綠佈署已成為常態。
本文首先使用Ansible建立和維護環境,然後展示如何使用Jenkins進行佈署。我們將使用Jenkins建立一個簡單但可擴充套件的程式碼交付管道。一些組織可能已經發展到多容器環境,這些組織可能需要更成熟的佈署模型和軟體。例如,使用Kubernetes的組織可能會使用Argo CD或其他佈署工具。此外,使用多個雲端供應商的組織可能會使用原生雲端工具或多個工具的整合作為其DevSecOps流程的一部分。所需的軟體工具數量和可能的軟體工具組合數量使得無法在一本文中涵蓋,更不用說單一章節。因此,本章的目標是透過一個真實的例子來展示這個過程,這個例子可以擴充套件到其他工具,因為DevSecOps在組織內成熟。
使用Ansible建立和維護環境
Ansible是少數幾種有助於自動化複雜基礎設施的技術之一,包括整個應用程式堆積疊的裸機佈署。Ansible的不同之處在於它非常輕量,可以在無代理的模式下執行,並使用純文字的組態檔案格式,如YAML和INI。Ansible使用SSH和Python,這樣就少了一個攻擊向量——代理軟體,而使用的是現代作業系統上安裝或可用的標準化軟體,如SSH。
Ansible圍繞著庫存和劇本(playbook)的概念運作,其中庫存定義了由Ansible管理的裝置,而劇本定義了裝置的期望狀態。例如,一組需要應用DNS相關組態的伺服器可以這樣分組:
[dns_servers]
dns1.example.com
dns2.example.com
dns3.example.com
然後,您可以使用Ansible安裝DNS相關軟體和自定義組態。例如,可以為這些主機建立一個任務列表:
---
- name: ensure installed bind9
  apt: name=bind9 state=present
- name: sync named.conf
  copy: src={{ config_dir }}/dns/named.conf
        dest=/etc/bind/named.conf group=bind backup=yes
  notify:
    - restart named
  tags:
    - bindconfigs
內容解密:
上述程式碼定義了兩個任務:第一個任務確保BIND DNS伺服器軟體被安裝,第二個任務將本地的named.conf組態檔案同步到遠端裝置。apt模組用於安裝軟體,並透過設定state屬性為present來確保軟體被安裝。如果需要確保軟體被解除安裝,只需將state屬性的值改為absent即可。copy模組用於將本地檔案複製到遠端裝置,並設定檔案的所有權和備份。
使用Jenkins進行佈署
Jenkins是一個用Java編寫的自動化服務,可以將現代應用程式的許多不同部分連線成一個連貫的佈署。Jenkins功能強大且非常全面,僅僅是培訓他人使用Jenkins就可以成為一個完整的職業。因此,本文將僅限於建立一個用於佈署應用程式的管道。該佈署可以進一步構建和擴充套件到更複雜的架構中。
總體架構包括一個執行Docker的Debian伺服器。該伺服器負責第5章中建立的本地登入檔。該Docker伺服器將透過執行Jenkins容器來協調與Jenkins的構建。伺服器不一定要執行Debian,但建議建立一個專門用於DevSecOps工具的伺服器。根據需求,這可能需要多台伺服器。然而,與其嘗試在本地電腦上組態Jenkins,然後遷移到伺服器,不如直接安裝一台伺服器(無論是虛擬還是實體的),用於執行容器程式,這樣會更快更簡單。
Jenkins可以作為Docker容器安裝。在這樣做的同時,您需要包含持久儲存,以便Jenkins組態詳細資訊保持可用。
程式碼解析
# 使用官方Jenkins映像
FROM jenkins/jenkins:lts
# 設定Jenkins主目錄的許可權
USER root
RUN mkdir /var/jenkins_home
RUN chown jenkins:jenkins /var/jenkins_home
# 切回Jenkins使用者
USER jenkins
內容解密:
這段Dockerfile用於建立一個Jenkins容器。首先,它使用官方的Jenkins映像作為基礎。然後,它以root使用者身份執行命令,建立Jenkins主目錄並設定其所有權為Jenkins使用者。最後,切換回Jenkins使用者,以確保容器的安全性。
監控在DevSecOps中的重要性
監控是DevSecOps成功的關鍵因素之一。透過監控應用程式和基礎設施的效能和安全狀態,團隊可以快速發現並修復問題,從而減少停機時間和安全漏洞。監控還可以提供有關應用程式使用模式和效能瓶頸的寶貴見解,幫助團隊最佳化應用程式並提高使用者經驗。
監控工具
有多種監控工具可供選擇,包括開源工具如Prometheus和Grafana,以及商業工具如Datadog和New Relic。選擇合適的監控工具取決於組織的具體需求和技術堆疊。
DevSecOps的未來發展
隨著DevSecOps的持續發展,我們可以預期看到更多的自動化和整合。未來的DevSecOps工具將更加智慧化和自動化,能夠自動檢測和修復安全漏洞和效能問題。此外,隨著雲原生技術的興起,DevSecOps將更加註重雲原生應用程式的安全和效能。
自動化安全測試
自動化安全測試將成為DevSecOps的一個重要組成部分。透過將安全測試整合到CI/CD管道中,團隊可以在應用程式的整個生命週期中自動檢測和修復安全漏洞。
 
            