使用 Docker Compose 連線服務

現在您已經將 Golang 應用程式容器化了,您將使用 Docker Compose 將您的服務連線起來。您將 Golang 應用程式、Prometheus 和 Grafana 服務連線起來,以使用 Prometheus 和 Grafana 監控 Golang 應用程式。

建立 Docker Compose 檔案

在您的 Golang 應用程式的根目錄中建立一個名為 `compose.yml` 的新檔案。Docker Compose 檔案包含執行多個服務並將它們連線在一起的指令。

這是一個用於使用 Golang、Prometheus 和 Grafana 的專案的 Docker Compose 檔案。您也可以在 `go-prometheus-monitoring` 目錄中找到此檔案。

services:
  api:
    container_name: go-api
    build:
      context: .
      dockerfile: Dockerfile
    image: go-api:latest
    ports:
      - 8000:8000
    networks:
      - go-network
    healthcheck:
      test: ["CMD", "curl", "-f", "https://:8000/health"]
      interval: 30s
      timeout: 10s
      retries: 5
    develop:
      watch:
        - path: .
          action: rebuild
      
  prometheus:
    container_name: prometheus
    image: prom/prometheus:v2.55.0
    volumes:
      - ./Docker/prometheus.yml:/etc/prometheus/prometheus.yml
    ports:
      - 9090:9090
    networks:
      - go-network
  
  grafana:
    container_name: grafana
    image: grafana/grafana:11.3.0
    volumes:
      - ./Docker/grafana.yml:/etc/grafana/provisioning/datasources/datasource.yaml
      - grafana-data:/var/lib/grafana
    ports:
      - 3000:3000
    networks:
      - go-network
    environment:
      - GF_SECURITY_ADMIN_USER=admin
      - GF_SECURITY_ADMIN_PASSWORD=password

volumes:
  grafana-data:

networks:
  go-network:
    driver: bridge

理解 Docker Compose 檔案

Docker Compose 檔案由三個服務組成

  • Golang 應用程式服務:此服務使用 Dockerfile 構建 Golang 應用程式並在容器中執行。它暴露應用程式的埠 `8000` 並連線到 `go-network` 網路。它還定義了一個健康檢查來監控應用程式的健康狀況。您還使用了 `healthcheck` 來監控應用程式的健康狀況。健康檢查每 30 秒執行一次,如果健康檢查失敗,則重試 5 次。健康檢查使用 `curl` 命令檢查應用程式的 `/health` 端點。除了健康檢查之外,您還添加了一個 `develop` 部分來觀察應用程式原始碼中的更改,並使用 Docker Compose Watch 功能重新構建應用程式。

  • Prometheus 服務:此服務在容器中執行 Prometheus 伺服器。它使用官方的 Prometheus 映象 `prom/prometheus:v2.55.0`。它在埠 `9090` 上暴露 Prometheus 伺服器並連線到 `go-network` 網路。您還掛載了專案根目錄中 `Docker` 目錄下的 `prometheus.yml` 檔案。`prometheus.yml` 檔案包含 Prometheus 配置,用於從 Golang 應用程式中抓取指標。這就是您將 Prometheus 伺服器連線到 Golang 應用程式的方式。

    global:
      scrape_interval: 10s
      evaluation_interval: 10s
    
    scrape_configs:
      - job_name: myapp
        static_configs:
          - targets: ["api:8000"]

    在 `prometheus.yml` 檔案中,您定義了一個名為 `myapp` 的作業,用於從 Golang 應用程式中抓取指標。`targets` 欄位指定了抓取指標的目標。在本例中,目標是在埠 `8000` 上執行的 Golang 應用程式。`api` 是 Docker Compose 檔案中 Golang 應用程式的服務名稱。Prometheus 伺服器將每 10 秒從 Golang 應用程式中抓取指標。

  • Grafana 服務:此服務在容器中執行 Grafana 伺服器。它使用官方的 Grafana 映象 `grafana/grafana:11.3.0`。它在埠 `3000` 上暴露 Grafana 伺服器並連線到 `go-network` 網路。您還掛載了專案根目錄中 `Docker` 目錄下的 `grafana.yml` 檔案。`grafana.yml` 檔案包含 Grafana 配置,用於新增 Prometheus 資料來源。這就是您將 Grafana 伺服器連線到 Prometheus 伺服器的方式。在環境變數中,您設定了 Grafana 管理員使用者和密碼,這將用於登入 Grafana 面板。

    apiVersion: 1
    datasources:
    - name: Prometheus (Main)
      type: prometheus
      url: http://prometheus:9090
      isDefault: true

    在 `grafana.yml` 檔案中,您定義了一個名為 `Prometheus (Main)` 的 Prometheus 資料來源。`type` 欄位指定了資料來源的型別,即 `prometheus`。`url` 欄位指定了 Prometheus 伺服器的 URL,用於獲取指標。在本例中,URL 是 `http://prometheus:9090`。`prometheus` 是 Docker Compose 檔案中 Prometheus 伺服器的服務名稱。`isDefault` 欄位指定資料來源是否是 Grafana 中的預設資料來源。

除了服務之外,Docker Compose 檔案還定義了一個名為 `grafana-data` 的捲來持久化 Grafana 資料,以及一個名為 `go-network` 的網路來連線服務。您建立了一個名為 `go-network` 的自定義網路來連線服務。`driver: bridge` 欄位指定了用於網路的網路驅動程式。

構建和執行服務

現在您有了 Docker Compose 檔案,您可以使用 Docker Compose 構建並一起執行這些服務。

要構建和執行服務,請在終端中執行以下命令

$ docker compose up

`docker compose up` 命令構建 Docker Compose 檔案中定義的服務並一起執行它們。您將在終端中看到類似以下內容的輸出

 ✔ Network go-prometheus-monitoring_go-network  Created                                                           0.0s 
 ✔ Container grafana                            Created                                                           0.3s 
 ✔ Container go-api                             Created                                                           0.2s 
 ✔ Container prometheus                         Created                                                           0.3s 
Attaching to go-api, grafana, prometheus
go-api      | [GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.
go-api      | 
go-api      | [GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
go-api      |  - using env:     export GIN_MODE=release
go-api      |  - using code:    gin.SetMode(gin.ReleaseMode)
go-api      | 
go-api      | [GIN-debug] GET    /metrics                  --> main.PrometheusHandler.func1 (3 handlers)
go-api      | [GIN-debug] GET    /health                   --> main.main.func1 (4 handlers)
go-api      | [GIN-debug] GET    /v1/users                 --> main.main.func2 (4 handlers)
go-api      | [GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.
go-api      | Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details.
go-api      | [GIN-debug] Listening and serving HTTP on :8000
prometheus  | ts=2025-03-15T05:57:06.676Z caller=main.go:627 level=info msg="No time or size retention was set so using the default time retention" duration=15d
prometheus  | ts=2025-03-15T05:57:06.678Z caller=main.go:671 level=info msg="Starting Prometheus Server" mode=server version="(version=2.55.0, branch=HEAD, revision=91d80252c3e528728b0f88d254dd720f6be07cb8)"
grafana     | logger=settings t=2025-03-15T05:57:06.865335506Z level=info msg="Config overridden from command line" arg="default.log.mode=console"
grafana     | logger=settings t=2025-03-15T05:57:06.865337131Z level=info msg="Config overridden from Environment variable" var="GF_PATHS_DATA=/var/lib/grafana"
grafana     | logger=ngalert.state.manager t=2025-03-15T05:57:07.088956839Z level=info msg="State
.
.
grafana     | logger=plugin.angulardetectorsprovider.dynamic t=2025-03-15T05:57:07.530317298Z level=info msg="Patterns update finished" duration=440.489125ms

服務將開始執行,您可以訪問 `https://:8000` 上的 Golang 應用程式,`https://:9090/health` 上的 Prometheus,以及 `https://:3000` 上的 Grafana。您還可以使用 `docker ps` 命令檢查正在執行的容器。

$ docker ps

摘要

在本節中,您學習瞭如何使用 Docker Compose 將服務連線在一起。您建立了一個 Docker Compose 檔案來一起執行多個服務,並使用網路連線它們。您還學習瞭如何使用 Docker Compose 構建和執行服務。

相關資訊

接下來,您將學習如何使用 Docker Compose 開發 Golang 應用程式並使用 Prometheus 和 Grafana 進行監控。

後續步驟

在下一節中,您將學習如何使用 Docker 開發 Golang 應用程式。您還將學習如何使用 Docker Compose Watch 在程式碼更改時重建映象。最後,您將測試應用程式並使用 Prometheus 作為資料來源在 Grafana 中視覺化指標。