使用 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 中視覺化指標。