博客 / 詳情

返回

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 應用並集成可觀測性工具,可以簡化部署流程,提高系統的可監控性和可維護性。通過本文的實踐,你可以快速上手並應用於實際項目中。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.