從0到1實現專案Docker編排部署

努力的小雨發表於2024-10-22

在深入討論 Docker 編排之前,首先讓我們瞭解一下 Docker 技術本身。Docker 是一個開源平臺,旨在幫助開發者自動化應用程式的部署、擴充套件和管理。自 2013 年推出以來,Docker 迅速發展成為現代軟體開發和運維領域不可或缺的重要工具。

Docker 採用容器技術,將應用程式及其所有依賴項封裝在一起,從而確保它們能夠在不同環境中一致地執行。與傳統的虛擬化技術(如虛擬機器)相比,Docker 的容器更輕量級,啟動時間也顯著縮短。這一優勢使得開發者能夠更高效地進行應用程式開發和測試,尤其是在快速迭代和頻繁釋出的場景中。

隨著 DevOps 思潮的興起,開發與運維之間的界限變得日益模糊,Docker 在這一轉變中提供了強有力的技術支援。然而,隨著專案規模的擴大和複雜性的增加,Docker 容器的數量也隨之增長,這就引發了對 Docker 編排的需求。

Docker 編排(Orchestration)指的是管理和協調多個 Docker 容器的工具和技術,其主要目的是簡化容器的部署、擴充套件和管理流程。透過編排,使用者可以更輕鬆地管理複雜的應用程式架構,確保各個元件能夠高效協同工作。

因此,本文將為讀者提供一份從零開始部署 Docker 編排專案的實用指南,幫助您掌握這一關鍵技術,提升應用程式管理的效率和靈活性。

專案準備

在本節中,我們將以 Java 專案為例,假設您已經擁有一個微服務架構的專案。整體專案結構可能會如下所示:

image

接下來,我們將逐步開始構建 Docker 容器,並按照一系列系統化的步驟來實現這一過程。

核心概念

我們首先將對一些基本概念進行詳細解釋,包括 Dockerfile、Docker 構建命令以及 docker-compose.yml 檔案的基本概念介紹。理解這些概念後,我們將進入實際操作環節,透過實踐加深對這些工具的掌握。

Dockerfile

Dockerfile 是一個文字檔案,它包含了一系列構建 Docker 映象所需的指令。這些指令不僅定義了映象的基礎環境,還詳細描述了應用程式的安裝步驟、所需的依賴關係、配置的環境變數,以及其他必要的設定。例如:

# 使用一個基礎映象
FROM maven:3.8.3-openjdk-17 AS builder

# 設定工作目錄
WORKDIR /app

# 複製 pom.xml 和原始碼
COPY pom.xml .
COPY src ./src

# 構建專案
RUN mvn clean package

# 使用一個輕量級的基礎映象執行應用
FROM openjdk:17-jdk-slim

# 設定工作目錄
WORKDIR /app

# 從構建階段複製 JAR 檔案
COPY --from=builder /app/target/demo-0.0.1-SNAPSHOT.jar ./myapp.jar

# 設定容器啟動時執行的命令
ENTRYPOINT ["java", "-jar", "myapp.jar"]

接下來,我們需要將這個配置應用到我們的專案中。為了演示的方便,我們使用了自定義的檔名稱來啟動專案,這樣可以更清晰地展示每個步驟的具體過程。當然,你也可以選擇使用預設的檔名,這樣操作會更加簡單直接。無論你選擇哪種方式,最終的效果都是一樣的。如下圖所示:

image

構建命令

docker build 是構建 Docker 映象的核心命令,它用於將 Dockerfile 中定義的指令轉換為可執行的映象。在執行這個命令時,你可以使用一系列可選引數,以便更好地定製構建過程。

docker build [OPTIONS] PATH | URL | -

PATH:指定包含 Dockerfile 的上下文路徑。通常是當前目錄(.)或具體的目錄路徑。

URL:可以是 Git 倉庫的 URL,Docker 會從該地址獲取 Dockerfile。

-:表示從標準輸入讀取 Dockerfile。

常用選項有以下這些:

  • -t, --tag:為映象指定一個名稱和標籤。例如:-t myapp:latest。
  • -f, --file:指定 Dockerfile 的路徑。
  • --no-cache:在構建時不使用快取,確保每個步驟都從頭開始執行。
  • --target:如果 Dockerfile 中定義了多階段構建,可以透過這個選項指定要構建的目標階段。

docker-compose.yml 檔案

docker-compose.yml 檔案是用於定義和執行多個 Docker 容器的配置檔案,它使得管理應用程式的服務、網路和資料卷變得更加簡便和高效。透過這個簡單的 YAML 檔案,你可以在一個統一的配置中描述整個應用的架構,使得容器的啟動、停止和管理變得一目瞭然。在我們的示例程式中,我們包含了 MySQL 服務。

儘管我們本地已經有一個獨立的 MySQL 例項,但為了更好地演示如何同時執行多個 Docker 容器,我們選擇將 MySQL 作為一個 Docker 容器來啟動。此外,值得一提的是,MySQL 已經有官方提供的預構建映象,這意味著我們無需花費額外的精力去構建和配置資料庫,直接使用現成的映象即可。

現在,讓我們開始這一過程吧!

version: '3.8'

services:
  app:
    image: ccr.ccs.tencentyun.com/studiousxiaoyu/my-java-app:latest  # 替換為你的 Java 應用映象
    ports:
      - "18080:18080"  # 對映埠
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://db:13306/agent?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
      SPRING_DATASOURCE_USERNAME: user
      SPRING_DATASOURCE_PASSWORD: password

  db:
    image: mysql:5.7  # 使用 MySQL 5.7
    environment:
      MYSQL_ROOT_PASSWORD: root_password  # 設定 root 使用者密碼
      MYSQL_DATABASE: agent  # 建立資料庫
      MYSQL_USER: user  # 建立新使用者
      MYSQL_PASSWORD: password  # 新使用者密碼
    ports:
      - "13306:13306"  # 對映 MySQL 埠
    volumes:
      - db_data:/var/lib/mysql  # 資料持久化

volumes:
  db_data:  # 定義一個資料卷

你可以透過執行 docker-compose up 命令來啟動所有在 docker-compose.yml 檔案中定義的服務。

開始構建

假設我們已經將程式碼專案成功從倉庫部署到了伺服器上,接下來,我們就可以直接在伺服器上進行操作了。如果你還沒有安裝過 Docker,可以先自行安裝,過程並不複雜。

完成安裝後,只需進入專案根目錄,並執行相應的命令即可開始使用。

docker build -t my-java-app -f demo.dockerfile .

構建過程的具體步驟和流程如圖所示:

image

我們可以耐心等待接下來的步驟完成,因為此時的過程與生產環境已經非常相似。接下來,我們只需將最終構建的映象推送到我們的私有倉庫中,以便進行後續的部署和管理。

映象倉庫

當然,公司的私有倉庫地址是必不可少的。在這裡,我們以騰訊雲的容器映象服務為例,來展示如何進行映象的儲存和管理。

推送私庫

之前我們已經詳細講解過如何建立私有倉庫的步驟,因此在此不再贅述。現在,我們可以直接將構建好的映象推送到倉庫中,以便進行後續的使用和管理。

image

接下來,我們將對我們的映象進行標籤操作,完成標籤操作後,我們將映象推送到私有倉庫中,以便於後續的部署和使用。

sudo docker tag my-java-app:latest ccr.ccs.tencentyun.com/studiousxiaoyu/my-java-app:latest

sudo docker push ccr.ccs.tencentyun.com/studiousxiaoyu/my-java-app:latest

最後推送成功如下:

image

image

容器編排

接下來,我們將使用編排檔案來定義和管理所需的服務。為了實現這一目標,我們需要在指定的目錄下建立一個名為 docker-compose.yaml 的檔案。該檔案的內容將與我們之前展示的配置保持一致。

建立完檔案後,我們將直接執行啟動命令,來驗證我們的配置是否正確,並觀察各個服務是否能順利啟動。

docker-compose -f spring-ai.yaml up -d

image

最後看下日誌,我們成功啟動:

image

總結

透過本文,我們深入探討了 Docker 的核心概念及其編排技術的重要性。從 Docker 的輕量級容器架構到其在現代 DevOps 環境中的應用,Docker 不僅提高了開發和部署的效率,還使得多容器管理變得更加高效。我們逐步介紹了 Dockerfile、構建命令及 docker-compose.yml 檔案的使用,幫助讀者掌握如何構建和管理微服務架構。

在具體操作中,我們以 Java 專案為例,透過實用的示範引導,展示瞭如何在本地環境中構建和部署 Docker 容器。隨著專案規模的擴大,掌握 Docker 編排將顯得尤為重要,它不僅簡化了容器管理流程,還增強了應用的靈活性和可擴充套件性。希望本文所提供的指南對你有所幫助。


我是努力的小雨,一名 Java 服務端碼農,潛心研究著 AI 技術的奧秘。我熱愛技術交流與分享,對開源社群充滿熱情。同時也是一位騰訊雲創作之星、阿里雲專家博主、華為云云享專家、掘金優秀作者。

💡 我將不吝分享我在技術道路上的個人探索與經驗,希望能為你的學習與成長帶來一些啟發與幫助。

🌟 歡迎關注努力的小雨!🌟

相關文章