DockerCompose:簡化多容器部署

字節碼在跳舞 2024-04-18 17:52:57

Docker Compose示例介紹

使用Docker Compose配置文件啓動服務

優勢與劣勢

Docker Compose 用來定義單個Yaml配置文件、運行多個容器的工具。在Yaml中可以配置服務、網絡、數據卷,通過一條命令,即通過Yaml配置文件,創建啓動所有的服務。

使用Docker Compose的帶來的優勢,單個Yaml文件中定義和管理多個容器。簡化了多個容器協調的複雜度。更加流暢,提高效率。提高Yaml配置,語法簡單,輕松與他人分享。

平時使用需要掌握Yaml配置文件編寫和Docker Compose的使用命令。在Yaml中可以定義應用和數據庫,數據隊列,緩存等所有有依賴服務。使用命令docker compose up -d一條命令,即可運行多個容器服務。要停止 這些容器,只需要docker compose down即可。

演示項目:https://gitee.com/ft/hello-go-db

1. Docker Compose示例介紹

Docker Compose配置文件有多個版本,每個版本引入了不同的特性和語法,v1版本已經停止了支持,不建議再使用。根據實際情況可以使用最新版本的語法規則編寫。最新版的Docker引擎支持較新版本的語法,當前版本爲3.8。v3與Dokcer Swarm配置兼容。

驗證安裝

確保你的電腦已經安裝Docker Compose。

➜  ~ docker compose versionDocker Compose version v2.26.1

可以使用命令docker compose version進行驗證。老版本使用的是docker-compose命令。新版本Docker Compose已經內置到Docker命令中。

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

觀察這命令,當初安裝docker時,使用過。我們已經使用插件的形式(docker-compose-plugin),安裝過了。

配置文件

支持都中文件命名,如下:

compose.yaml

docker-compose.yaml

docker-compose.yml

compose.yml

先結合實例簡單介紹下,

version: '3'services:app:build:context: .dockerfile: Dockerfileexpose:- 8080ports:- 8080:8080links:- dbdepends_on:- dbdb:image: postgresenvironment:POSTGRES_PASSWORD: "abc123"POSTGRES_USER: helloPOSTGRES_DB: hello

FROM golang:1.22.2-alpine3.19 as builderLABEL authors="ff755"ENV GO111MODULE=onENV GOPROXY=https://goproxy.cnWORKDIR /appCOPY . /appRUN GOOS=linux GOARCH=amd64 go build -o appFROM alpine:3.19.1WORKDIR /appCOPY --from=builder /app .EXPOSE 8080CMD sh -c "sleep 5s && ./app"

app服務構建時,使用到的Dockerfile。

上述docker-compose.yml文件中,定義了一個由兩部分構成的多服務應用:app服務和db服務。

版本聲明: 首先,我們聲明使用Docker Compose的版本爲3,確保與當前版本的Docker引擎兼容,能夠充分利用其特性。

服務定義: 接下來,我們定義了兩個核心服務:

app服務:

context: .表示構建上下文目錄爲當前目錄(.),Docker會在此目錄查找構建所需的文件。

dockerfile: Dockerfile指定使用當前目錄下的Dockerfile作爲構建鏡像的指令文件。

通過Dockerfile構建鏡像啓動容器

服務的鏡像。具體參數如下:

端口暴露:使用expose關鍵字聲明服務內部使用的端口爲8080,表明該服務在容器內部監聽此端口。這一步不是必須的,主要用于文檔說明,不影響實際網絡通信。

端口映射:通過ports關鍵字將容器內部的8080端口映射到宿主機的同名端口,使得外部可以通過宿主機的8080端口訪問到app服務。

服務間鏈接:使用links關鍵字指定app服務與db服務之間的鏈接關系。雖然在Docker Compose v3中,網絡默認共享,一般不再需要顯式鏈接,但這裏保留了該配置。

依賴關系:使用depends_on關鍵字確保db服務在app服務啓動前啓動。注意,這僅保證啓動順序,不代表db服務在app服務啓動時已經完全可用。

db服務:

POSTGRES_PASSWORD: 數據庫的密碼,設置爲abc123。

POSTGRES_USER: 數據庫的用戶名,設置爲hello。

POSTGRES_DB: 數據庫的名稱,設置爲hello。

使用官方鏡像:指定db服務基于官方的PostgreSQL鏡像構建,無需額外編寫Dockerfile。

環境變量設置environment

設置必要的環境變量以配置數據庫:

總結來說,這份docker-compose.yml文件描述了一個包含app服務(基于當前目錄下的Dockerfile構建,監聽並映射8080端口,依賴于db服務)和db服務(使用PostgreSQL鏡像,配置了數據庫的用戶名、密碼和數據庫名)的應用。使用此配置文件啓動應用時,Docker Compose將自動構建app服務的鏡像,拉取或啓動db服務的鏡像,並按依賴關系有序啓動兩個服務。

app容器的啓動命令寫在了在Dockerfile中CMD sh -c "sleep 5s && ./app。休眠5秒,啓動./app。因爲數據庫啓動需要一定時間,會出現app連接db失敗的情況。必須讓db先于app達到可用狀態。

舉例說明:

服務容器啓動時間服務可用時間app0.1s0.3sdb0.1s3s

app可用,即可以通過浏覽器進行訪問。db可用,即可通過app進行建立與數據庫的連接。

若直接啓動,app服務無法成功和db服務建立連接,app啓動時間短,此時,db還沒有達到可用狀態。

故此處,使用了休眠5秒,使app連接數據庫的時間大于db可用的時間。5.3>3s。

Docker Compose提供了心跳檢測,可以結合pg_isready達到相同的效果。

pg_isready -h localhost -p 5432localhost:5432 - 接受連接

當返回接收連接時,app才會開始連接db。之後講解,先簡單了解下。

2. 使用Docker Compose配置文件啓動服務

啓動服務

在包含docker-compose.yml文件的目錄下,執行以下命令啓動服務:

docker-compose up

如果您想在後台(detached mode)啓動服務,添加-d參數:

docker-compose up -d

檢查服務狀態

docker-compose ps

停止服務

要停止並刪除(如果使用-d參數啓動)所有服務及其容器,運行:

docker-compose down

使用以上命令,您可以使用Docker Compose配置文件成功啓動了服務。根據需要,您可以編輯docker-compose.yml文件,添加、刪除或修改服務,然後重新執行docker-compose up命令來更新服務配置並啓動。

運行演示項目

➜ hello-go-db git:(master) docker compose upWARN[0000] /root/hello/a/hello-go-db/docker-compose.yaml: `version` is obsolete[+] Running 1/2 ✔ Network hello-go-db_default Created 0.1s ⠴ Container hello-go-db-db-1 Created 0.5s ⠋ Container hello-go-db-app-1 Created 0.1sAttaching to app-1, db-1db-1 | The files belonging to this database system will be owned by user "postgres".db-1 | 2024-04-18 08:44:19.084 UTC [1] LOG: database system is ready to accept connectionsapp-1 | db: dbapp-1 | [GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.app-1 |app-1 | [GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.app-1 | - using env: export GIN_MODE=releaseapp-1 | - using code: gin.SetMode(gin.ReleaseMode)app-1 |app-1 | [GIN] 2024/04/18 - 08:44:21 | 200 | 718.089µs | 192.168.31.47 | GET "/"app-1 | strconv.ParseInt: parsing "favicon.ico": invalid syntax

運行日志信息太長,這裏提供一個精簡後的信息。如後台運行填加參數-d。停止使用命令docker compose down。

3. 優勢與劣勢

Docker Compose具備簡化多容器部署、快速環境搭建、版本控制、環境一致性、依賴管理和協調、方便的管理命令、跨平台支持、資源隔離和服用等優勢。Docker Compose同時具備了一些劣勢也較爲明顯,單機局限性,伸縮性、集群、高可用等不支持或支持太弱。Docker Compose非常適合小型的多容器應用,開發測試階段和單機生産環境,簡化了多容器部署和管理。

Docker Compose作爲一款強大的容器編排工具,憑借其簡潔易用的YAML配置文件、豐富的管理命令和跨平台兼容性,極大地簡化了多容器應用的部署與管理,尤其在小型、開發環境和簡單生産場景中表現出色。

讀完後,忍不住要加個關注!不是我吹,但你會後悔沒關注的!

0 阅读:4

字節碼在跳舞

簡介:分享學習筆記、知識。