使用 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", "http://localhost:8080/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
。它暴露 Prometheus 服务器的端口9090
并连接到go-network
网络。你还挂载了项目根目录中Docker
目录下的prometheus.yml
文件。prometheus.yml
文件包含从 Golang 应用抓取指标的 Prometheus 配置。这就是你将 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
是 Golang 应用在 Docker Compose 文件中的服务名称。Prometheus 服务器将每 10 秒从 Golang 应用抓取一次指标。Grafana 服务: 此服务在容器中运行 Grafana 服务器。它使用官方的 Grafana 镜像
grafana/grafana:11.3.0
。它暴露 Grafana 服务器的端口3000
并连接到go-network
网络。你还挂载了项目根目录中Docker
目录下的grafana.yml
文件。grafana.yml
文件包含添加 Prometheus 数据源的 Grafana 配置。这就是你将 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
是 Prometheus 服务器在 Docker Compose 文件中的服务名称。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
服务将开始运行,你可以访问 Golang 应用,地址是 http://localhost:8000
;访问 Prometheus,地址是 http://localhost:9090/health
;访问 Grafana,地址是 http://localhost:3000
。你还可以使用 docker ps
命令查看正在运行的容器。
$ docker ps
总结
在本节中,你学习了如何使用 Docker Compose 将服务连接在一起。你创建了一个 Docker Compose 文件来一起运行多个服务,并使用网络将它们连接起来。你还学习了如何使用 Docker Compose 构建和运行服务。
相关信息
接下来,你将学习如何使用 Docker Compose 开发 Golang 应用,并使用 Prometheus 和 Grafana 对其进行监控。
下一步
在下一节中,你将学习如何使用 Docker 开发 Golang 应用。你还将学习如何使用 Docker Compose Watch 在代码发生更改时自动重建镜像。最后,你将测试应用并使用 Prometheus 作为数据源在 Grafana 中可视化指标。