Docker-Compose 应用可观测性最佳实践

前言

在现代软件开发中,容器化技术已经成为一种趋势,它为应用的部署、扩展和管理提供了极大的便利。Docker 是容器化技术的代表,而 Docker Compose 则是 Docker 官方提供的一个工具,用于定义和运行多容器 Docker 应用程序。

Docker Compose 通过一个 YAML 文件来配置应用程序的服务,然后使用一个简单的命令就可以创建并启动所有服务。它非常适合开发、测试和生产环境,因为它可以轻松地将应用程序的多个部分组合成一个可执行的容器化应用程序。

目标

采集 Docker-Compose 应用的 Trace、Log、Metrics 数据,以实现对应用的可观测。

准备工作

安装 DataKit

bash 复制代码
# 需要把token 改成观测云空间的实际token值(可在「观测云控制台」-「集成」-「Datakit」 上面获取)
DK_DATAWAY="https://openway.guance.com?token=tkn_xxxxxx" bash -c "$(curl -L https://static.guance.com/datakit/install.sh)" 

# 修改配置文件
cd /usr/local/datakit/conf.d/ddtrace && cp ddtrace.conf.sample ddtrace.conf

# 修改datakit.conf文件http_api的listen中改成0.0.0.0:9529
cd /usr/local/datakit/conf.d && vim datakit.conf

# 重启dk
datakit service -R

datakit monitor 命令查看 ddtrace 采集器开启情况。

操作步骤

链路采集

本示例采用 ddtrace 采集 JAVA 应用的链路数据

下载 APM 探针:static.guance.com/dd-image/dd...

1. 两种方式接入 Docker Compose 应用的 APM 数据

  • 将 dd-java-agent.jar 打入业务镜像(缺点:侵入性强)
  • 将 dd-java-agent.jar 通过数据卷挂载的方式进行(本文档采用该方案)

2. 编写 Dockerfile

假设业务可执行 jar 为 log_project-1.0.jar,其中 Dockerfile 中的 ENTRYPOINT 启动参数加载环境变量 JAVA_OPTS;

bash 复制代码
# log_project_dockerfile文件内容如下
FROM openjdk:8u292
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
ENV jar log_project-1.0.jar
ENV workdir /data/app/
RUN mkdir -p ${workdir}
COPY ${jar} ${workdir}
WORKDIR ${workdir}
ENTRYPOINT ["sh", "-ec", "exec java ${JAVA_OPTS} -jar ${jar}"]

3. 构建镜像并推送镜像仓库

bash 复制代码
docker build -t log_project2_nodb:1.0 -f log_project_dockerfile .
docker tag log_project2_nodb:1.0 harbor.xzccloud.local/logproject/log_project2_nodb:1.0
docker push harbor.xzccloud.local/logproject/log_project2_nodb:1.0

4. 编写 docker-compose.yml

下载 dd-java-agent.jar 到宿主机的 /usr/local/ddtrace/ 目录下,可以按照以下步骤修改 docker-compose.yml 文件。

  • 在 docker-compose.yaml 文件中添加卷挂载,将宿主机上的 dd-java-agent.jar 挂载至容器中。
  • 添加 JAVA_OPTS环境变量,Ddd.agent.host 的地址可以设置为 docker0 网卡地址,可根据实际情况修改。
yaml 复制代码
version: '3'
services:
  logproject2:
    image: harbor.xzccloud.local/logproject/log_project2_nodb:1.0
    container_name: log_project2
    privileged: true
    ports: 
      - "8080:8080"
    environment:
      - TZ=Asia/Shanghai
      - JAVA_OPTS=-javaagent:/usr/local/ddtrace/dd-java-agent.jar -Ddd.logs.injection=true -Ddd.service.name=logproject2 -Ddd.env=dev -Ddd.version=2.0 -Ddd.agent.host=172.17.0.1 -Ddd.trace.agent.port=9529
    volumes:
      - /usr/local/ddtrace/:/usr/local/ddtrace
    networks:
      - persist
networks:
    persist:
        external:
            name: mynetwork

Tips:

新建桥接网络:docker network create --driver bridge mynetwork

5. 启动应用

bash 复制代码
docker-compose --f docker-compose.yml up --d
# 调试时可以前台运行应用:
docker-compose -f docker-compose.yml up

6. 验证效果

登录「观测云」-「应用性能监测」,查看链路数据上报情况。

日志采集

应用日志分为 stdout 日志和容器内日志,下面根据两种不同的情况进行说明。

为了区分两种不同的日志,本示例控制台输出日志中会包含"控制台日志输出 "字样,容器内文件日志中会包含"文件内日志输出"字样。

1. stdout 日志采集

1.1 前提条件

docker-compose 应用启动之后,确认 stdout 日志正常输出;

复制代码
docker logs -f log_project2
1.2 开启采集器

开启 container 采集器(默认开启),根据需要修改配置即可,本示例根据 image 来筛选采集容器 stdout 日志。

bash 复制代码
# 手动开启container采集器
cd /usr/local/datakit/conf.d/container && cp container.conf.sample container.conf
datakit service -R

假设,我只想采集镜像为 harbor.xzccloud.local/logproject/log_project2_nodb:1.0 和 harbor.xzccloud.local/logproject/nginx:1.20.1 对应容器日志,container.conf 配置摘要如下(其他配置默认即可):

ini 复制代码
                .
                .
                .
  ## Containers logs to include and exclude, default collect all containers. Globs accepted.
  container_include_log = ["image:*log_project2_nodb*","image:*nginx*"]
  container_exclude_log = []
                .
                .
                .
1.3 验证效果

登录观测云->日志,查看 stdout 日志正常上报。

2. 容器内日志采集

2.1 前提条件

docker-compose 应用启动之后,确认容器内日志正常输出(本示例容器内日志目录:/tmp/log);

修改链路采集中的 docker-compose.yml 文件,将宿主机的 /tmp/logx 挂载到容器的日志目录 /tmp/log 。

ruby 复制代码
version: '3'
services:
  logproject2:
    image: harbor.xzccloud.local/logproject/log_project2_nodb:1.0
    container_name: log_project2
    privileged: true
    ports: 
      - "8080:8080"
    environment:
      - TZ=Asia/Shanghai
      - JAVA_OPTS=-javaagent:/usr/local/ddtrace/dd-java-agent.jar -Ddd.logs.injection=true -Ddd.service.name=logproject2 -Ddd.env=dev -Ddd.version=2.0 -Ddd.agent.host=172.17.0.1 -Ddd.trace.agent.port=9529
    volumes:
      - /usr/local/ddtrace/:/usr/local/ddtrace
      - /tmp/logx:/tmp/log
    networks:
      - persist
networks:
    persist:
        external:
            name: mynetwork
  • 应用启动之后,确认/tmp/logx下有输出对应的日志文件;
2.2 开启采集器

开启 log 采集器。

ini 复制代码
cd /usr/local/datakit/conf.d/log && cp logging.conf.sample log_project.conf
# 修改log_project.conf配置文件
vim log_project.conf
                    .
                    .
                    .
  ## File names or a pattern to tail.
  logfiles = [
    "/tmp/logx/log-*.log",
  ]

  # Only two protocols are supported:TCP and UDP.
  # sockets = [
  #         "tcp://0.0.0.0:9530",
  #         "udp://0.0.0.0:9531",
  # ]
  ## glob filteer
  ignore = [""]

  ## Your logging source, if it's empty, use 'default'.
  source = "log_project2_file"

  ## Add service tag, if it's empty, use $source.
  service = "log_project2_file"               
                    .
                    .
                    .
# 重启dk
datakit service -R           
2.3 验证效果

登录观测云->日志,查看容器内日志正常上报。

指标采集

1. 开启采集器

开启 container 采集器(默认已开启),无需变动。

2. 验证效果

登录观测云->场景->新建仪表板,新建 dashboard(Docker 监控视图),即可查看对应指标。

登录观测云->指标->指标管理,采集容器所有指标列表如下。

总结

使用 Docker Compose 部署 Java 应用并集成可观测性工具,可以简化部署流程,提高系统的可监控性和可维护性。通过本文的实践,你可以快速上手并应用于实际项目中。

相关推荐
问简3 小时前
docker 镜像相关
运维·docker·容器
Benszen4 小时前
Docker容器化技术实战指南
运维·docker·容器
Hommy885 小时前
【开源剪映小助手】Docker 部署
docker·容器·开源·github·aigc
斯普信云原生组6 小时前
Prometheus 环境监控虚机 Redis 方案(生产实操版)
运维·docker·容器
喵了几个咪7 小时前
如何在 Superset Docker 容器中安装 MySQL 驱动
mysql·docker·容器·superset
工具罗某人7 小时前
docker compose部署kafka集群搭建
docker·容器·kafka
sbjdhjd13 小时前
Docker | 核心概念科普 + 保姆级部署
linux·运维·服务器·docker·云原生·面试·eureka
摇滚侠13 小时前
Vmvare 虚拟机安装 Linux CentOS 7 操作系统 一键安装 Docker 1Panel 一键安装 MySQL Redis OpenClaw
linux·docker·centos
comedate13 小时前
【OpenClaw】 Open-WebUI Docker 部署连接本地 Ollama 技术文档
docker·ollama·openwebui·openclaw
川trans13 小时前
基于 Docker & K8s 的 MySQL 容器化部署与应用关联实践
mysql·docker·kubernetes