Docker部署Java項(xiàng)目實(shí)踐詳細(xì)介紹
前言
在當(dāng)今的軟件開發(fā)領(lǐng)域,容器化技術(shù)已經(jīng)成為了一種趨勢。Docker 作為一種流行的容器化平臺,為開發(fā)者提供了一種便捷、高效的方式來部署和管理應(yīng)用程序。對于 Java 項(xiàng)目而言,使用 Docker 進(jìn)行部署可以帶來許多好處,如提高部署效率、增強(qiáng)可移植性、簡化環(huán)境配置等。本文將詳細(xì)介紹如何使用 Docker 部署 Java 項(xiàng)目,包括構(gòu)建 Docker 鏡像、編寫 Dockerfile、使用 Docker Compose 進(jìn)行多服務(wù)部署等內(nèi)容。
一、引言
隨著云計(jì)算和微服務(wù)架構(gòu)的興起,軟件部署的復(fù)雜性不斷增加。傳統(tǒng)的部署方式往往需要手動配置服務(wù)器環(huán)境、安裝依賴庫等,不僅耗時(shí)費(fèi)力,而且容易出現(xiàn)環(huán)境不一致的問題。Docker 容器化技術(shù)的出現(xiàn)為解決這些問題提供了一種有效的解決方案。通過將應(yīng)用程序及其依賴打包到一個(gè)可移植的容器中,可以實(shí)現(xiàn)快速部署、輕松遷移和可靠運(yùn)行。對于 Java 項(xiàng)目來說,Docker 提供了一種簡潔、高效的部署方式,使得開發(fā)人員可以專注于業(yè)務(wù)邏輯的實(shí)現(xiàn),而無需過多關(guān)注底層的服務(wù)器配置和環(huán)境搭建。
二、Docker 基礎(chǔ)概念
(一)容器與鏡像
- 容器
- 容器是一種輕量級的虛擬化技術(shù),它可以將應(yīng)用程序及其依賴打包到一個(gè)獨(dú)立的運(yùn)行環(huán)境中。容器之間相互隔離,每個(gè)容器都有自己的文件系統(tǒng)、網(wǎng)絡(luò)配置和進(jìn)程空間。容器的啟動和停止非常快速,可以在不同的服務(wù)器上進(jìn)行遷移,提高了應(yīng)用程序的可移植性和部署效率。
- 鏡像
- 鏡像是容器的基礎(chǔ),它是一個(gè)只讀的模板,包含了應(yīng)用程序及其依賴的所有文件和配置信息。鏡像可以通過 Dockerfile 進(jìn)行構(gòu)建,也可以從 Docker 倉庫中下載。多個(gè)容器可以基于同一個(gè)鏡像創(chuàng)建,從而保證了容器之間的一致性。
(二)Docker 架構(gòu)
- 客戶端 - 服務(wù)器架構(gòu)
- Docker 采用客戶端 - 服務(wù)器架構(gòu),由 Docker 客戶端和 Docker 守護(hù)進(jìn)程組成。Docker 客戶端是用戶與 Docker 交互的接口,用戶可以通過命令行或圖形界面向 Docker 守護(hù)進(jìn)程發(fā)送指令。Docker 守護(hù)進(jìn)程負(fù)責(zé)管理容器和鏡像,接收來自客戶端的請求并執(zhí)行相應(yīng)的操作。
- 容器運(yùn)行時(shí)
- Docker 容器運(yùn)行時(shí)負(fù)責(zé)創(chuàng)建和運(yùn)行容器。它可以在不同的操作系統(tǒng)上運(yùn)行,支持多種容器技術(shù),如 Linux 容器(LXC)和 Windows 容器。容器運(yùn)行時(shí)提供了一系列的 API,使得開發(fā)者可以方便地管理容器的生命周期,如創(chuàng)建、啟動、停止、刪除等。
(三)Docker 倉庫
- 公共倉庫與私有倉庫
- Docker 倉庫是用于存儲和分發(fā) Docker 鏡像的地方。Docker 提供了一個(gè)公共倉庫(Docker Hub),用戶可以從公共倉庫中下載各種官方和社區(qū)維護(hù)的鏡像。此外,用戶還可以搭建自己的私有倉庫,用于存儲和管理內(nèi)部使用的鏡像。
- 鏡像命名與標(biāo)簽
- Docker 鏡像通過命名和標(biāo)簽進(jìn)行唯一標(biāo)識。鏡像名稱通常由倉庫名稱、鏡像名稱和標(biāo)簽組成,如
docker.io/library/ubuntu:latest
。其中,docker.io/library
是倉庫名稱,ubuntu
是鏡像名稱,latest
是標(biāo)簽。標(biāo)簽用于區(qū)分不同版本的鏡像,用戶可以根據(jù)自己的需求選擇不同的標(biāo)簽。
- Docker 鏡像通過命名和標(biāo)簽進(jìn)行唯一標(biāo)識。鏡像名稱通常由倉庫名稱、鏡像名稱和標(biāo)簽組成,如
三、準(zhǔn)備工作
(一)安裝 Docker
- 在 Linux 系統(tǒng)上安裝 Docker
- 不同的 Linux 發(fā)行版安裝 Docker 的方法略有不同。以 Ubuntu 為例,可以通過以下步驟安裝 Docker:
- 更新軟件包列表:
sudo apt update
- 安裝必要的依賴:
sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
- 添加 Docker 官方 GPG 密鑰:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
- 添加 Docker 軟件源:
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
- 安裝 Docker:
sudo apt install docker-ce docker-ce-cli containerd.io
- 更新軟件包列表:
- 不同的 Linux 發(fā)行版安裝 Docker 的方法略有不同。以 Ubuntu 為例,可以通過以下步驟安裝 Docker:
- 在 Windows 和 Mac 系統(tǒng)上安裝 Docker
- Docker 提供了適用于 Windows 和 Mac 的桌面版安裝程序,用戶可以從 Docker 官方網(wǎng)站下載并安裝。安裝過程非常簡單,只需按照安裝向?qū)У奶崾具M(jìn)行操作即可。
(二)準(zhǔn)備 Java 項(xiàng)目
- 項(xiàng)目結(jié)構(gòu)
- 一個(gè)典型的 Java 項(xiàng)目通常包括以下幾個(gè)部分:
- 源代碼:包含 Java 類文件和資源文件。
- 依賴庫:項(xiàng)目所依賴的第三方庫文件。
- 配置文件:如數(shù)據(jù)庫連接配置、日志配置等。
- 構(gòu)建文件:如 Maven 或 Gradle 的構(gòu)建文件。
- 一個(gè)典型的 Java 項(xiàng)目通常包括以下幾個(gè)部分:
- 構(gòu)建項(xiàng)目
- 在使用 Docker 部署之前,需要先構(gòu)建 Java 項(xiàng)目??梢允褂?Maven 或 Gradle 等構(gòu)建工具進(jìn)行構(gòu)建,生成可執(zhí)行的 JAR 包或 WAR 包。以 Maven 為例,可以在項(xiàng)目根目錄下執(zhí)行以下命令進(jìn)行構(gòu)建:
mvn clean package
- 在使用 Docker 部署之前,需要先構(gòu)建 Java 項(xiàng)目??梢允褂?Maven 或 Gradle 等構(gòu)建工具進(jìn)行構(gòu)建,生成可執(zhí)行的 JAR 包或 WAR 包。以 Maven 為例,可以在項(xiàng)目根目錄下執(zhí)行以下命令進(jìn)行構(gòu)建:
四、構(gòu)建 Docker 鏡像
(一)編寫 Dockerfile
- Dockerfile 語法
- Dockerfile 是一個(gè)用于構(gòu)建 Docker 鏡像的文本文件,它包含了一系列的指令,用于描述如何構(gòu)建鏡像。Dockerfile 的基本語法如下:
# 基礎(chǔ)鏡像 FROM <image>:<tag> # 維護(hù)者信息 MAINTAINER <name> # 復(fù)制文件到鏡像中 COPY <src>... <dest> # 設(shè)置工作目錄 WORKDIR <dir> # 運(yùn)行命令 RUN <command> # 暴露端口 EXPOSE <port> # 環(huán)境變量 ENV <key>=<value> # 容器啟動時(shí)執(zhí)行的命令 CMD ["<command>", "<arg1>", "<arg2>",...]
- 針對 Java 項(xiàng)目的 Dockerfile 示例
- 以下是一個(gè)針對 Java 項(xiàng)目的 Dockerfile 示例:
# 基礎(chǔ)鏡像為 OpenJDK 8 FROM openjdk:8-jdk-alpine # 維護(hù)者信息 MAINTAINER Your Name <your@email.com> # 將項(xiàng)目的 JAR 包復(fù)制到鏡像中 COPY target/your-project.jar /app.jar # 設(shè)置工作目錄 WORKDIR / # 暴露項(xiàng)目運(yùn)行的端口 EXPOSE 8080 # 設(shè)置環(huán)境變量 ENV JAVA_OPTS="-Xmx256m -Xms128m" # 容器啟動時(shí)執(zhí)行的命令 CMD ["java", "-jar", "/app.jar"]
- 在這個(gè)示例中,首先指定了基礎(chǔ)鏡像為 OpenJDK 8 的 Alpine 版本,這是一個(gè)輕量級的 Linux 發(fā)行版,非常適合在容器中運(yùn)行 Java 應(yīng)用程序。然后,將項(xiàng)目構(gòu)建生成的 JAR 包復(fù)制到鏡像中,并設(shè)置了工作目錄、暴露的端口和環(huán)境變量。最后,指定了容器啟動時(shí)執(zhí)行的命令,即運(yùn)行 Java 程序并加載 JAR 包。
(二)構(gòu)建鏡像
- 使用
docker build
命令構(gòu)建鏡像- 在項(xiàng)目根目錄下,創(chuàng)建一個(gè)名為
Dockerfile
的文件,并將上述示例中的內(nèi)容復(fù)制到該文件中。然后,在命令行中執(zhí)行以下命令構(gòu)建鏡像:
- 在項(xiàng)目根目錄下,創(chuàng)建一個(gè)名為
docker build -t your-project.
- 這個(gè)命令將在當(dāng)前目錄下查找
Dockerfile
文件,并根據(jù)其中的指令構(gòu)建一個(gè)名為your-project
的鏡像。構(gòu)建過程可能需要一些時(shí)間,具體取決于項(xiàng)目的大小和網(wǎng)絡(luò)速度。 - 查看構(gòu)建好的鏡像
- 構(gòu)建完成后,可以使用
docker images
命令查看構(gòu)建好的鏡像:
- 構(gòu)建完成后,可以使用
docker images
- 這個(gè)命令將列出本地所有的鏡像,包括鏡像的名稱、標(biāo)簽、大小等信息??梢栽诹斜碇姓业絼倓倶?gòu)建的
your-project
鏡像。
五、運(yùn)行 Docker 容器
(一)使用docker run命令運(yùn)行容器
- 基本用法
- 構(gòu)建好鏡像后,可以使用
docker run
命令運(yùn)行容器。以下是docker run
命令的基本用法:
- 構(gòu)建好鏡像后,可以使用
docker run -d -p <host-port>:<container-port> --name <container-name> <image-name>
- 其中,
-d
參數(shù)表示以守護(hù)進(jìn)程模式運(yùn)行容器,即容器在后臺運(yùn)行;-p
參數(shù)用于將主機(jī)的端口映射到容器的端口,以便外部可以訪問容器中的應(yīng)用程序;--name
參數(shù)用于指定容器的名稱;<image-name>
是要運(yùn)行的鏡像名稱。 - 針對 Java 項(xiàng)目的示例
- 對于前面構(gòu)建的
your-project
鏡像,可以使用以下命令運(yùn)行容器:
- 對于前面構(gòu)建的
docker run -d -p 8080:8080 --name your-container your-project
- 這個(gè)命令將以守護(hù)進(jìn)程模式運(yùn)行一個(gè)名為
your-container
的容器,將主機(jī)的 8080 端口映射到容器的 8080 端口,并使用your-project
鏡像。容器啟動后,可以通過訪問主機(jī)的 8080 端口來訪問 Java 項(xiàng)目的應(yīng)用程序。
(二)查看容器運(yùn)行狀態(tài)
- 使用
docker ps
命令查看正在運(yùn)行的容器- 可以使用
docker ps
命令查看正在運(yùn)行的容器的信息:
- 可以使用
docker ps
- 這個(gè)命令將列出正在運(yùn)行的容器的 ID、名稱、鏡像名稱、啟動時(shí)間、狀態(tài)等信息??梢栽诹斜碇姓业絼倓倖拥娜萜?。
- 使用
docker logs
命令查看容器日志- 如果需要查看容器的日志,可以使用
docker logs
命令:
- 如果需要查看容器的日志,可以使用
docker logs <container-name>
- 其中,
<container-name>
是要查看日志的容器名稱。這個(gè)命令將輸出容器的日志信息,有助于排查應(yīng)用程序的問題。
六、使用 Docker Compose 進(jìn)行多服務(wù)部署
(一)Docker Compose 簡介
- 什么是 Docker Compose
- Docker Compose 是一個(gè)用于定義和運(yùn)行多容器 Docker 應(yīng)用程序的工具。它使用 YAML 文件來配置應(yīng)用程序的服務(wù)、網(wǎng)絡(luò)和卷等。通過 Docker Compose,可以輕松地管理多個(gè)容器的啟動、停止和升級,提高了開發(fā)和部署的效率。
- Docker Compose 的優(yōu)勢
- 使用 Docker Compose 進(jìn)行多服務(wù)部署有以下幾個(gè)優(yōu)勢:
- 簡化部署:通過一個(gè) YAML 文件定義多個(gè)服務(wù)的配置,避免了手動啟動每個(gè)容器的繁瑣過程。
- 一致性:確保在不同環(huán)境中部署的服務(wù)具有相同的配置和依賴關(guān)系。
- 可擴(kuò)展性:可以輕松地添加或刪除服務(wù),以及調(diào)整服務(wù)的數(shù)量和配置。
- 方便管理:可以使用一組命令來管理整個(gè)應(yīng)用程序的生命周期,如啟動、停止、重啟等。
- 使用 Docker Compose 進(jìn)行多服務(wù)部署有以下幾個(gè)優(yōu)勢:
(二)編寫 Docker Compose 文件
- YAML 語法
- Docker Compose 使用 YAML 格式的文件來定義應(yīng)用程序的服務(wù)。YAML 是一種簡潔、易讀的數(shù)據(jù)序列化格式,它具有以下特點(diǎn):
- 縮進(jìn)表示層次結(jié)構(gòu)。
- 使用冒號和空格來分隔鍵值對。
- 支持注釋和多行字符串。
- Docker Compose 使用 YAML 格式的文件來定義應(yīng)用程序的服務(wù)。YAML 是一種簡潔、易讀的數(shù)據(jù)序列化格式,它具有以下特點(diǎn):
- 針對 Java 項(xiàng)目的 Docker Compose 文件示例
- 以下是一個(gè)使用 Docker Compose 部署 Java 項(xiàng)目的示例文件:
version: '3' services: app: image: your-project ports: - "8080:8080" environment: - JAVA_OPTS=-Xmx256m -Xms128m database: image: mysql:5.7 environment: - MYSQL_ROOT_PASSWORD=password - MYSQL_DATABASE=your_database - MYSQL_USER=user - MYSQL_PASSWORD=password volumes: - db-data:/var/lib/mysql volumes: db-data:
- 在這個(gè)示例中,定義了兩個(gè)服務(wù):
app
和database
。app
服務(wù)使用前面構(gòu)建的your-project
鏡像,將主機(jī)的 8080 端口映射到容器的 8080 端口,并設(shè)置了環(huán)境變量。database
服務(wù)使用 MySQL 5.7 鏡像,設(shè)置了數(shù)據(jù)庫的密碼、數(shù)據(jù)庫名稱、用戶名和密碼,并將數(shù)據(jù)庫數(shù)據(jù)存儲在名為db-data
的卷中。
(三)使用 Docker Compose 啟動和管理服務(wù)
- 啟動服務(wù)
- 在包含 Docker Compose 文件的目錄下,執(zhí)行以下命令啟動服務(wù):
docker-compose up -d
- 這個(gè)命令將根據(jù) Docker Compose 文件中的配置啟動所有服務(wù),并在后臺運(yùn)行。
- 停止服務(wù)
- 可以使用以下命令停止服務(wù):
docker-compose down
- 這個(gè)命令將停止并刪除所有由 Docker Compose 管理的容器和網(wǎng)絡(luò)。
- 查看服務(wù)狀態(tài)
- 使用以下命令查看服務(wù)的狀態(tài):
docker-compose ps
- 這個(gè)命令將列出所有由 Docker Compose 管理的服務(wù)的名稱、狀態(tài)、端口映射等信息。
七、高級主題
(一)數(shù)據(jù)卷與持久化存儲
- 數(shù)據(jù)卷的概念
- 數(shù)據(jù)卷是一個(gè)可供一個(gè)或多個(gè)容器使用的特殊目錄,它繞過了容器的文件系統(tǒng),直接將數(shù)據(jù)存儲在主機(jī)的文件系統(tǒng)中。使用數(shù)據(jù)卷可以實(shí)現(xiàn)數(shù)據(jù)的持久化存儲,即使容器被刪除,數(shù)據(jù)也不會丟失。
- 在 Java 項(xiàng)目中的應(yīng)用
- 在 Java 項(xiàng)目中,可以使用數(shù)據(jù)卷來存儲數(shù)據(jù)庫數(shù)據(jù)、配置文件、日志文件等。例如,可以將數(shù)據(jù)庫數(shù)據(jù)存儲在一個(gè)數(shù)據(jù)卷中,以便在容器重新啟動或升級時(shí)保留數(shù)據(jù)??梢栽?Docker Compose 文件中定義數(shù)據(jù)卷,并將其掛載到容器中的相應(yīng)目錄。
- 示例
- 以下是一個(gè)在 Docker Compose 文件中使用數(shù)據(jù)卷的示例:
version: '3' services: app: image: your-project ports: - "8080:8080" environment: - JAVA_OPTS=-Xmx256m -Xms128m volumes: - app-data:/app/data database: image: mysql:5.7 environment: - MYSQL_ROOT_PASSWORD=password - MYSQL_DATABASE=your_database - MYSQL_USER=user - MYSQL_PASSWORD=password volumes: - db-data:/var/lib/mysql volumes: app-data: db-data:
- 在這個(gè)示例中,定義了兩個(gè)數(shù)據(jù)卷:
app-data
和db-data
。app
服務(wù)將app-data
數(shù)據(jù)卷掛載到容器的/app/data
目錄,database
服務(wù)將db-data
數(shù)據(jù)卷掛載到容器的/var/lib/mysql
目錄。這樣,數(shù)據(jù)庫數(shù)據(jù)和應(yīng)用程序的數(shù)據(jù)都可以實(shí)現(xiàn)持久化存儲。
(二)網(wǎng)絡(luò)配置
- Docker 網(wǎng)絡(luò)模式
- Docker 提供了幾種網(wǎng)絡(luò)模式,用于容器之間的通信。常見的網(wǎng)絡(luò)模式有:
- bridge:默認(rèn)的網(wǎng)絡(luò)模式,創(chuàng)建一個(gè)虛擬網(wǎng)橋,容器通過網(wǎng)橋進(jìn)行通信。
- host:容器直接使用主機(jī)的網(wǎng)絡(luò)棧,與主機(jī)共享網(wǎng)絡(luò)。
- none:容器沒有網(wǎng)絡(luò)連接,需要手動配置網(wǎng)絡(luò)。
- Docker 提供了幾種網(wǎng)絡(luò)模式,用于容器之間的通信。常見的網(wǎng)絡(luò)模式有:
- 在 Java 項(xiàng)目中的應(yīng)用
- 在多服務(wù)部署的 Java 項(xiàng)目中,需要考慮容器之間的網(wǎng)絡(luò)通信??梢愿鶕?jù)項(xiàng)目的需求選擇合適的網(wǎng)絡(luò)模式。例如,如果需要容器與主機(jī)或外部網(wǎng)絡(luò)進(jìn)行通信,可以選擇
host
網(wǎng)絡(luò)模式;如果需要容器之間進(jìn)行隔離,可以選擇bridge
網(wǎng)絡(luò)模式。
- 在多服務(wù)部署的 Java 項(xiàng)目中,需要考慮容器之間的網(wǎng)絡(luò)通信??梢愿鶕?jù)項(xiàng)目的需求選擇合適的網(wǎng)絡(luò)模式。例如,如果需要容器與主機(jī)或外部網(wǎng)絡(luò)進(jìn)行通信,可以選擇
- 示例
- 以下是一個(gè)在 Docker Compose 文件中配置網(wǎng)絡(luò)的示例:
version: '3' services: app: image: your-project ports: - "8080:8080" environment: - JAVA_OPTS=-Xmx256m -Xms128m networks: - my-network database: image: mysql:5.7 environment: - MYSQL_ROOT_PASSWORD=password - MYSQL_DATABASE=your_database - MYSQL_USER=user - MYSQL_PASSWORD=password networks: - my-network networks: my-network:
- 在這個(gè)示例中,定義了一個(gè)名為
my-network
的網(wǎng)絡(luò),并將app
和database
服務(wù)連接到這個(gè)網(wǎng)絡(luò)。這樣,兩個(gè)服務(wù)可以通過網(wǎng)絡(luò)進(jìn)行通信。
(三)容器化部署的最佳實(shí)踐
- 選擇合適的基礎(chǔ)鏡像
- 選擇一個(gè)合適的基礎(chǔ)鏡像對于容器化部署非常重要。應(yīng)該選擇一個(gè)輕量級、安全、穩(wěn)定的基礎(chǔ)鏡像,并確保其包含了應(yīng)用程序所需的運(yùn)行時(shí)環(huán)境和依賴庫。對于 Java 項(xiàng)目,可以選擇 OpenJDK 或其他輕量級的 Java 運(yùn)行時(shí)鏡像。
- 優(yōu)化鏡像大小
- 盡量減小鏡像的大小可以提高部署速度和節(jié)省存儲空間。可以通過以下方法優(yōu)化鏡像大?。?ul>
- 選擇輕量級的基礎(chǔ)鏡像。
- 刪除不必要的文件和依賴庫。
- 使用多階段構(gòu)建,只將最終的可執(zhí)行文件復(fù)制到最終的鏡像中。
- 為了避免容器占用過多的資源,可以配置容器的資源限制,如內(nèi)存、CPU 等。可以在 Dockerfile 或 Docker Compose 文件中設(shè)置資源限制,以確保容器在合理的資源范圍內(nèi)運(yùn)行。
- 容器化部署也需要考慮安全問題。可以采取以下措施來增強(qiáng)容器的安全性:
- 使用最小權(quán)限原則,只賦予容器必要的權(quán)限。
- 定期更新基礎(chǔ)鏡像和應(yīng)用程序,以修復(fù)安全漏洞。
- 配置容器的網(wǎng)絡(luò)訪問控制,限制容器的對外訪問。
- 使用加密技術(shù)保護(hù)敏感數(shù)據(jù)。
八、結(jié)論
使用 Docker 部署 Java 項(xiàng)目是一種高效、便捷的方式,可以提高部署效率、增強(qiáng)可移植性和簡化環(huán)境配置。通過編寫 Dockerfile 構(gòu)建鏡像,使用docker run
命令運(yùn)行容器,以及使用 Docker Compose 進(jìn)行多服務(wù)部署,可以輕松地管理和部署 Java 應(yīng)用程序。在實(shí)際應(yīng)用中,還可以結(jié)合數(shù)據(jù)卷、網(wǎng)絡(luò)配置和最佳實(shí)踐等高級主題,進(jìn)一步優(yōu)化部署過程。
到此這篇關(guān)于Docker部署Java項(xiàng)目的文章就介紹到這了,更多相關(guān)Docker部署Java項(xiàng)目內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
docker內(nèi)部容器之間的端口訪問實(shí)現(xiàn)方法
alpine-client?與?alpine-server?兩容器,前者訪問后者監(jiān)聽之端口,以此探析?Docker?內(nèi)部容器間端口訪問機(jī)制,這篇文章主要介紹了如何實(shí)現(xiàn)docker內(nèi)部容器之間的端口訪問,需要的朋友可以參考下2024-04-04Jenkins構(gòu)建Docker鏡像并推送至Harbor倉庫的實(shí)現(xiàn)
本文主要介紹了Jenkins構(gòu)建Docker鏡像并推送至Harbor倉庫,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09詳解使用docker 1.12 搭建多主機(jī)docker swarm集群
本篇文章主要介紹了使用docker 1.12 搭建多主機(jī)docker swarm集群,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07