用 Docker 現代化你的傳統企業!|航海日誌 Vol.22

DaoCloud發表於2017-07-31

用 Docker 現代化你的傳統企業!|航海日誌 Vol.22

通過 Docker 網路研討會將傳統的應用現代化


用 Docker 現代化你的傳統企業!|航海日誌 Vol.22


IT 公司總是花費 80 %的預算來維護現有的應用,而僅花費 20 %的預算用於創新工作。這個比例在過去十年間沒有發生任何改變,但是創新的壓力一直存在。無論它直接來源於客戶的新需求,或者是來源於你的管理鏈,它的內容都是相同的:你需要花更少的代價做更多的事


值得慶幸的是,Docker 有現代化傳統應用的功能。你可以使用現有的、與你業務相同的應用程式,使其效率提高 70 %,更安全,且適用於任何基礎架構。


➤ 使用自定義資源擴充套件 Kubernetes 1.7


用 Docker 現代化你的傳統企業!|航海日誌 Vol.22

如果想要構建叢集應用程式或軟體即服務。在開始編寫一行應用程式程式碼之前,你必須解決一系列架構問題,包括安全性,多租戶,API 閘道器,CLI,配置管理和日誌記錄。


那麼又該如何將所有的基礎設施從 Kubernetes 中充分利用, 使得在開發中節省一些人力時間, 並專注於實現你專屬的服務?


最新的 Kubernetes 1.7 新增了一個名為 CustomResourceDefinitions(CRD)的重要功能,它可以插入您自己的託管物件和應用程式,就像它是一個本地的Kubernetes 元件一樣。這樣,您可以利用 Kubernetes CLI,API 服務,安全性和叢集管理框架,而無需修改 Kubernetes 或瞭解其內部。我們在這裡使用 Iguazio 將 Kubenetes 與我們新的實時“無伺服器”專案和資料平臺物件無縫整合。


➤ Docker 環境下的 CI/CD


用 Docker 現代化你的傳統企業!|航海日誌 Vol.22

Docker 的一大優勢在於它能夠實現無縫的 CI/CD 流程;容器只是一個執行的 Docker 映象的只讀例項,更新容器就像更新映象檔案一樣簡單,然後我們還可以根據更新的映象重新部署容器。甚至有免費的工具可以持續監控映象儲存庫,並在檢測到更新的映象的瞬間重新部署容器。然而,雖然這簡化了容器的執行,但建立和更新映象仍然需要我們手動操作。


將 CI/CD 概念提升到一個新的水平,即建立一個開發流程,自動化您在軟體交付過程中的所有步驟。典型的單一業務流程包括以下基本步驟:


  • 構建 — 啟動構建過程,其中原始碼被轉換為編譯的偽像並打包在 Docker 映象中。

  • 測試 — 使用支援您的框架的任何測試工具在 Docker 容器內執行單元測試。

  • 推送 — 將測試的 Docker 映象推送到 Docker 登錄檔服務中,例如 Docker Hub。

  • 部署 — 將 Docker 映象從登錄檔服務下載到適用的分段/生產 Docker 環境。

  • 執行 - 從一個或多個映象例項化容器或服務。


CI/CD 的下一個邏輯擴充套件是通過 webhook 將開發程式碼庫完全整合到開發管道中;簡單地說,這允許在程式碼儲存庫中發生事件(例如程式碼提交或合併)時執行自動構建部署流水線流程。通過這種整合,每當開發人員將程式碼提交到儲存庫時,幾秒鐘後,Docker 容器將與開發人員的更改結果相結合,然後可以將其用於實時整合測試。


ETP(Emerging Technology Partners) 研究和驗證了市場上最全面的以容器為中心的 CI/CD 功能解決方案。我們的解決方案允許您將整合測試,UI 測試或效能測試所需的整個環境轉化為構建的一部分,從而允許您測試任何提交或 PR。通過我們的解決方案,開發人員和測試人員可以快速找到迴歸,並在分期前進行修復。採用該方案可以加快開發週期,並且節省時間和精力。


➤ 使用 Docker 建立 SQL Server 容器


到目前為止,我關於容器的文章一直在討論僅使用單一容器的情況。在現實世界中,情況不可能是這樣的。在任何時候,主機上都執行許多個容器(我有 30 多個)。

我需要一種方法來簡單的開啟、執行多個容器。可行的兩種辦法:


  • 應用伺服器驅動

  • 容器主機驅動


在應用伺服器驅動方法中,應用程式伺服器將與容器主機通訊,構建執行容器並獲取它的詳細資訊(例如埠號)。


這種點對點的模式效果良好,因為只有在需要的情況下,容器才能被啟動和使用,從而節省了主機上的資源。但是,這意味著必須等待容器成功啟動以後,應用程式才能開始工作。OK,我知道啟動容器的過程很快,但是我所要達到的目的是減少部署時間。


如果我們知道需要多少個容器?如果我們希望在容器部署後,應用能直接與它們相連線?


接下來我會向你們介紹--使用 docker compose 一次性構建多個容器的所有步驟。


Compose 是一個用於定義和執行多容器 Docker 應用程式的工具。


作為 SQL Server 開發者,我們只對應用程式感興趣,但這並不意味著我們獲得 compose 的優勢。


我要做的是按步驟啟動執行 SQL Server 的 5 個容器,所有這些容器都使用不同的sa密碼監聽不同的埠。


在執行命令之前的準備工作。我將在我的 C:\驅動器上建立幾個資料夾,這些資料夾將用於儲存 compose 和 dockerfile:

mkdir C:\docker  
mkdir C:\docker\builds\dev1  
mkdir C:\docker\compose  複製程式碼

在 C:\docker\builds\dev1 目錄中,我將放入資料庫檔案和 dockerfile

用 Docker 現代化你的傳統企業!|航海日誌 Vol.22

注:- 注意 dockerfile 的名稱(dockerfile.dev1)


以下是我 dockerfile 的程式碼:

# building our new image from the microsft SQL 2017 image
FROM microsoft/mssql-server-windows
 
 
# creating a directory within the container
RUN powershell -Command (mkdir C:\\SQLServer)
 
 
# copying the database files into the container
# no file path for the files so they need to be in the same location as the dockerfile
COPY DevDB1.mdf C:\\SQLServer
COPY DevDB1_log.ldf C:\\SQLServer
 
COPY DevDB2.mdf C:\\SQLServer
COPY DevDB2_log.ldf C:\\SQLServer
 
COPY DevDB3.mdf C:\\SQLServer
COPY DevDB3_log.ldf C:\\SQLServer
 
COPY DevDB4.mdf C:\\SQLServer
COPY DevDB4_log.ldf C:\\SQLServer
 
COPY DevDB5.mdf C:\\SQLServer
COPY DevDB5_log.ldf C:\\SQLServer
 
 
# attach the databases into the SQL instance within the container
ENV attach_dbs="[{'dbName':'DevDB1','dbFiles':['C:\\SQLServer\\DevDB1.mdf','C:\\SQLServer\\DevDB1_log.ldf']}, \ 
    {'dbName':'DevDB2','dbFiles':['C:\\SQLServer\\DevDB2.mdf','C:\\SQLServer\\DevDB2_log.ldf']}, \ 
    {'dbName':'DevDB3','dbFiles':['C:\\SQLServer\\DevDB3.mdf','C:\\SQLServer\\DevDB3_log.ldf']}, \ 
    {'dbName':'DevDB4','dbFiles':['C:\\SQLServer\\DevDB4.mdf','C:\\SQLServer\\DevDB4_log.ldf']}, \ 
    {'dbName':'DevDB5','dbFiles':['C:\\SQLServer\\DevDB5.mdf','C:\\SQLServer\\DevDB5_log.ldf']}]"複製程式碼

在 C:\docker\compose 目錄下,我建立了一個 docker-compose.yml 檔案用於定義我想在容器中執行的服務。


改檔案的程式碼:

# specify the compose file format
# this depends on what version of docker is running
version: '3'
 
 
# define our services, all database containers
# each section specifies a container... 
# the dockerfile name and location...
# port number & sa password
services:
  db1:
    build:
        context: C:\docker\builds\dev1
        dockerfile: dockerfile.dev1
    environment:
      sa_password: "Testing11@@"
      ACCEPT_EULA: "Y"
    ports:
      - "15785:1433"
  db2:
    build:
        context: C:\docker\builds\dev1
        dockerfile: dockerfile.dev1
    environment:
      sa_password: "Testing22@@"
      ACCEPT_EULA: "Y"
    ports:
      - "15786:1433"
  db3:
    build:
        context: C:\docker\builds\dev1
        dockerfile: dockerfile.dev1
    environment:
      sa_password: "Testing33@@"
      ACCEPT_EULA: "Y"
    ports:
      - "15787:1433"
  db4:
    build:
        context: C:\docker\builds\dev1
        dockerfile: dockerfile.dev1
    environment:
      sa_password: "Testing44@@"
      ACCEPT_EULA: "Y"
    ports:
      - "15788:1433"
  db5:
    build:
        context: C:\docker\builds\dev1
        dockerfile: dockerfile.dev1
    environment:
      sa_password: "Testing55@@"
      ACCEPT_EULA: "Y"
    ports:
      - "15789:1433"複製程式碼

注: - 要檢查哪個版本的 docker 與哪個 compose 檔案格式相容,https://docs.docker.com/compose/compose-file/ 檢視相容表。


既然我們建立好了檔案,讓我們執行我們的第一個 compose 命令。

docker-compose複製程式碼


注: -這是一個測試命令,如果安裝了它,您應該能看到一個幫助參考(您可以跳過下一部分)。

用 Docker 現代化你的傳統企業!|航海日誌 Vol.22

那麼我們需要安裝。執行:

Invoke-WebRequest "https://github.com/docker/compose/releases/download/1.14.0/docker-compose-Windows-x86_64.exe" -UseBasicParsing -OutFile $Env:ProgramFiles\docker\docker-compose.exe複製程式碼

上面命令中的1.14.0是最新版本。要檢查最新版本,請跳轉到這個(https://github.com/docker/compose/releases)。


安裝完成後,請驗證版本:

docker-compose version複製程式碼

用 Docker 現代化你的傳統企業!|航海日誌 Vol.22

在執行 compose 命令之前,進到 C:\docker\compose 目錄下。

cd C:\docker\compose複製程式碼

現在我們可以執行 compose 命令。使用 compose 構建容器的命令非常簡單:

docker-compose up -d複製程式碼

用 Docker 現代化你的傳統企業!|航海日誌 Vol.22

該指令碼基於 docker-compose.yml,並構建了 5 個引用 dockerfile.dev1 的容器。


我可以通過執行以下指令來確認:

docker ps複製程式碼

用 Docker 現代化你的傳統企業!|航海日誌 Vol.22

完成,五個容器正在執行!通過使用 docker compose,我們可以使用一個命令構建執行 SQL 的多個容器。這對構建開發環境幫助很大,我們部署了應用程式之後,它們可以立即連線到容器中的 SQL。


這一期的『航海日誌』就到這裡,下期再浪~


參考連結

  • https://blog.docker.com/2017/07/modernize-traditional-applications-docker-webinar-recap/

  • https://thenewstack.io/extend-kubernetes-1-7-custom-resources/

  • https://www.linkedin.com/pulse/cicd-docker-environments-neil-cresswell

  • https://dbafromthecold.com/2017/07/12/creating-sql-server-containers-with-docker-compose/


作者介紹

夏巖:DaoCloud 技術顧問,偽の全棧工程師 && 語言愛好者。

楊雪穎 Misha:DaoCloud 技術顧問,能文能擼碼の通用型選手,兼 Labs 吉祥物。


上期回顧:

容器技術標準化大統一,OCI V1.0 正式釋出!|航海日誌 Vol.21

用 Docker 現代化你的傳統企業!|航海日誌 Vol.22


相關文章