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

前言

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

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

目标

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

准备工作

安装 DataKit

# 需要把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 探针:https://static.guance.com/dd-image/dd-java-agent.jar

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

- 将 dd-java-agent.jar 打入业务镜像(缺点:侵入性强)

- 将 dd-java-agent.jar 通过数据卷挂载的方式进行(本文档采用该方案)

2. 编写 Dockerfile

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

# 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. 构建镜像并推送镜像仓库

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 网卡地址,可根据实际情况修改。

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. 启动应用

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 日志。

# 手动开启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 配置摘要如下(其他配置默认即可):

                .

                .

                .

  ## 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 。

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 采集器。

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 应用并集成可观测性工具,可以简化部署流程,提高系统的可监控性和可维护性。通过本文的实践,你可以快速上手并应用于实际项目中。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容