Docker從0到1實現(xiàn)項目編排部署
在深入討論 Docker 編排之前,首先讓我們了解一下 Docker 技術(shù)本身。Docker 是一個開源平臺,旨在幫助開發(fā)者自動化應(yīng)用程序的部署、擴展和管理。自 2013 年推出以來,Docker 迅速發(fā)展成為現(xiàn)代軟件開發(fā)和運維領(lǐng)域不可或缺的重要工具。
Docker 采用容器技術(shù),將應(yīng)用程序及其所有依賴項封裝在一起,從而確保它們能夠在不同環(huán)境中一致地運行。與傳統(tǒng)的虛擬化技術(shù)(如虛擬機)相比,Docker 的容器更輕量級,啟動時間也顯著縮短。這一優(yōu)勢使得開發(fā)者能夠更高效地進行應(yīng)用程序開發(fā)和測試,尤其是在快速迭代和頻繁發(fā)布的場景中。
隨著 DevOps 思潮的興起,開發(fā)與運維之間的界限變得日益模糊,Docker 在這一轉(zhuǎn)變中提供了強有力的技術(shù)支持。然而,隨著項目規(guī)模的擴大和復(fù)雜性的增加,Docker 容器的數(shù)量也隨之增長,這就引發(fā)了對 Docker 編排的需求。
Docker 編排(Orchestration)指的是管理和協(xié)調(diào)多個 Docker 容器的工具和技術(shù),其主要目的是簡化容器的部署、擴展和管理流程。通過編排,用戶可以更輕松地管理復(fù)雜的應(yīng)用程序架構(gòu),確保各個組件能夠高效協(xié)同工作。
因此,本文將為讀者提供一份從零開始部署 Docker 編排項目的實用指南,幫助您掌握這一關(guān)鍵技術(shù),提升應(yīng)用程序管理的效率和靈活性。
項目準備
在本節(jié)中,我們將以 Java 項目為例,假設(shè)您已經(jīng)擁有一個微服務(wù)架構(gòu)的項目。整體項目結(jié)構(gòu)可能會如下所示:
接下來,我們將逐步開始構(gòu)建 Docker 容器,并按照一系列系統(tǒng)化的步驟來實現(xiàn)這一過程。
核心概念
我們首先將對一些基本概念進行詳細解釋,包括 Dockerfile、Docker 構(gòu)建命令以及 docker-compose.yml 文件的基本概念介紹。理解這些概念后,我們將進入實際操作環(huán)節(jié),通過實踐加深對這些工具的掌握。
Dockerfile
Dockerfile 是一個文本文件,它包含了一系列構(gòu)建 Docker 鏡像所需的指令。這些指令不僅定義了鏡像的基礎(chǔ)環(huán)境,還詳細描述了應(yīng)用程序的安裝步驟、所需的依賴關(guān)系、配置的環(huán)境變量,以及其他必要的設(shè)置。例如:
# 使用一個基礎(chǔ)鏡像 FROM maven:3.8.3-openjdk-17 AS builder # 設(shè)置工作目錄 WORKDIR /app # 復(fù)制 pom.xml 和源代碼 COPY pom.xml . COPY src ./src # 構(gòu)建項目 RUN mvn clean package # 使用一個輕量級的基礎(chǔ)鏡像運行應(yīng)用 FROM openjdk:17-jdk-slim # 設(shè)置工作目錄 WORKDIR /app # 從構(gòu)建階段復(fù)制 JAR 文件 COPY --from=builder /app/target/demo-0.0.1-SNAPSHOT.jar ./myapp.jar # 設(shè)置容器啟動時執(zhí)行的命令 ENTRYPOINT ["java", "-jar", "myapp.jar"]
接下來,我們需要將這個配置應(yīng)用到我們的項目中。為了演示的方便,我們使用了自定義的文件名稱來啟動項目,這樣可以更清晰地展示每個步驟的具體過程。當然,你也可以選擇使用默認的文件名,這樣操作會更加簡單直接。無論你選擇哪種方式,最終的效果都是一樣的。如下圖所示:
構(gòu)建命令
docker build
是構(gòu)建 Docker 鏡像的核心命令,它用于將 Dockerfile 中定義的指令轉(zhuǎn)換為可執(zhí)行的鏡像。在執(zhí)行這個命令時,你可以使用一系列可選參數(shù),以便更好地定制構(gòu)建過程。
docker build [OPTIONS] PATH | URL | -
PATH:指定包含 Dockerfile 的上下文路徑。通常是當前目錄(.)或具體的目錄路徑。
URL:可以是 Git 倉庫的 URL,Docker 會從該地址獲取 Dockerfile。
-:表示從標準輸入讀取 Dockerfile。
常用選項有以下這些:
- -t, --tag:為鏡像指定一個名稱和標簽。例如:-t myapp:latest。
- -f, --file:指定 Dockerfile 的路徑。
- –no-cache:在構(gòu)建時不使用緩存,確保每個步驟都從頭開始運行。
- –target:如果 Dockerfile 中定義了多階段構(gòu)建,可以通過這個選項指定要構(gòu)建的目標階段。
docker-compose.yml 文件
docker-compose.yml
文件是用于定義和運行多個 Docker 容器的配置文件,它使得管理應(yīng)用程序的服務(wù)、網(wǎng)絡(luò)和數(shù)據(jù)卷變得更加簡便和高效。通過這個簡單的 YAML 文件,你可以在一個統(tǒng)一的配置中描述整個應(yīng)用的架構(gòu),使得容器的啟動、停止和管理變得一目了然。在我們的示例程序中,我們包含了 MySQL 服務(wù)。
盡管我們本地已經(jīng)有一個獨立的 MySQL 實例,但為了更好地演示如何同時運行多個 Docker 容器,我們選擇將 MySQL 作為一個 Docker 容器來啟動。此外,值得一提的是,MySQL 已經(jīng)有官方提供的預(yù)構(gòu)建鏡像,這意味著我們無需花費額外的精力去構(gòu)建和配置數(shù)據(jù)庫,直接使用現(xiàn)成的鏡像即可。
現(xiàn)在,讓我們開始這一過程吧!
version: '3.8' services: app: image: ccr.ccs.tencentyun.com/studiousxiaoyu/my-java-app:latest # 替換為你的 Java 應(yīng)用鏡像 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 # 設(shè)置 root 用戶密碼 MYSQL_DATABASE: agent # 創(chuàng)建數(shù)據(jù)庫 MYSQL_USER: user # 創(chuàng)建新用戶 MYSQL_PASSWORD: password # 新用戶密碼 ports: - "13306:13306" # 映射 MySQL 端口 volumes: - db_data:/var/lib/mysql # 數(shù)據(jù)持久化 volumes: db_data: # 定義一個數(shù)據(jù)卷
你可以通過運行 docker-compose up
命令來啟動所有在 docker-compose.yml
文件中定義的服務(wù)。
開始構(gòu)建
假設(shè)我們已經(jīng)將代碼項目成功從倉庫部署到了服務(wù)器上,接下來,我們就可以直接在服務(wù)器上進行操作了。如果你還沒有安裝過 Docker,可以先自行安裝,過程并不復(fù)雜。
完成安裝后,只需進入項目根目錄,并執(zhí)行相應(yīng)的命令即可開始使用。
docker build -t my-java-app -f demo.dockerfile .
構(gòu)建過程的具體步驟和流程如圖所示:
我們可以耐心等待接下來的步驟完成,因為此時的過程與生產(chǎn)環(huán)境已經(jīng)非常相似。接下來,我們只需將最終構(gòu)建的鏡像推送到我們的私有倉庫中,以便進行后續(xù)的部署和管理。
鏡像倉庫
當然,公司的私有倉庫地址是必不可少的。在這里,我們以騰訊云的容器鏡像服務(wù)為例,來展示如何進行鏡像的存儲和管理。
推送私庫
之前我們已經(jīng)詳細講解過如何創(chuàng)建私有倉庫的步驟,因此在此不再贅述?,F(xiàn)在,我們可以直接將構(gòu)建好的鏡像推送到倉庫中,以便進行后續(xù)的使用和管理。
接下來,我們將對我們的鏡像進行標簽操作,完成標簽操作后,我們將鏡像推送到私有倉庫中,以便于后續(xù)的部署和使用。
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
最后推送成功如下:
容器編排
接下來,我們將使用編排文件來定義和管理所需的服務(wù)。為了實現(xiàn)這一目標,我們需要在指定的目錄下創(chuàng)建一個名為 docker-compose.yaml
的文件。該文件的內(nèi)容將與我們之前展示的配置保持一致。
創(chuàng)建完文件后,我們將直接執(zhí)行啟動命令,來驗證我們的配置是否正確,并觀察各個服務(wù)是否能順利啟動。
docker-compose -f spring-ai.yaml up -d
最后看下日志,我們成功啟動:
總結(jié)
通過本文,我們深入探討了 Docker 的核心概念及其編排技術(shù)的重要性。從 Docker 的輕量級容器架構(gòu)到其在現(xiàn)代 DevOps 環(huán)境中的應(yīng)用,Docker 不僅提高了開發(fā)和部署的效率,還使得多容器管理變得更加高效。我們逐步介紹了 Dockerfile、構(gòu)建命令及 docker-compose.yml 文件的使用,幫助讀者掌握如何構(gòu)建和管理微服務(wù)架構(gòu)。
在具體操作中,我們以 Java 項目為例,通過實用的示范引導(dǎo),展示了如何在本地環(huán)境中構(gòu)建和部署 Docker 容器。隨著項目規(guī)模的擴大,掌握 Docker 編排將顯得尤為重要,它不僅簡化了容器管理流程,還增強了應(yīng)用的靈活性和可擴展性。希望本文所提供的指南對你有所幫助。
到此這篇關(guān)于Docker從0到1實現(xiàn)項目編排部署的文章就介紹到這了,更多相關(guān)Docker編排部署內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Docker使用Dockerfile創(chuàng)建支持ssh服務(wù)自啟動的容器鏡像
這篇文章主要介紹了Docker使用Dockerfile創(chuàng)建支持ssh服務(wù)自啟動的容器鏡像,需要的朋友可以參考下2016-10-10Docker拉取鏡像失敗解決(connect: connection refused)
最近遇到Docker拉取centos鏡像時報錯,本文主要介紹了Docker拉取鏡像失敗解決(connect: connection refused),具有一定的參考價值,感興趣的可以了解一下2024-07-07Spring Boot 打包上傳Docker 倉庫的詳細步驟
這篇文章主要介紹了Spring Boot 打包上傳Docker 倉庫的詳細步驟,本文分步驟給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-08-08使用Vscode結(jié)合docker進行開發(fā)的詳細過程
這篇文章主要介紹了如何使用Vscode結(jié)合docker進行開發(fā),在本文中,我將提供一個在 Node 環(huán)境中運行的 JavaScript 應(yīng)用程序示例。閱讀在容器內(nèi)開發(fā)以獲取所有技術(shù)堆棧的詳細文檔,需要的朋友可以參考下2021-07-07Docker網(wǎng)絡(luò)模型以及容器通信詳解續(xù)篇
這篇文章主要介紹了Docker網(wǎng)絡(luò)模型以及容器通信詳解續(xù)篇的相關(guān)資料,通過學(xué)習(xí)Docker網(wǎng)路驅(qū)動模型,更好地解決容器間的通信問題,需要的朋友可以參考下2022-11-11docker常用命令總結(jié)之安裝、鏡像、容器基本操作
這篇文章主要介紹了docker常用命令總結(jié)之安裝、鏡像、容器基本操作,需要的朋友可以參考下2017-05-05