image-YYIp.png

一、整体规划

  1. 数据存储目录:所有数据统一存储到 /data/dockerData/skywalking
  2. 时区配置:所有容器强制设置为东八区(Asia/Shanghai)
  3. 核心组件:MySQL8(存储)、SkyWalking OAP(核心)、SkyWalking UI(可视化)
  4. 网络隔离:自定义桥接网络,避免端口冲突

二、部署步骤

1. 环境准备

  • 确保服务器已安装 dockerdocker compose ,并创建基础目录:
# 创建目录结构
mkdir -p /data/dockerData/skywalking/{mysql/data,mysql/conf,mysql/driver,oap/logs,oap/config,ui/logs}
# 赋予目录读写权限(生产环境可按需调整)
chmod -R 777 /data/dockerData/skywalking
  • 拷贝驱动到/data/dockerData/mysql/driver中

2. 编写 docker-compose.yml

创建 /data/dockerData/skywalking/docker-compose.yml,内容如下:

version: '3.8'

# 自定义网络,隔离SkyWalking组件
networks:
  skywalking-network:
    driver: bridge

services:
  # ========== MySQL8 服务 ==========
  skywalking-mysql:
    image: docker.1ms.run/mysql:8.0
    container_name: skywalking-mysql
    networks:
      - skywalking-network
    environment:
      # MySQL基础配置
      MYSQL_ROOT_PASSWORD: root@123456  # 根密码,建议生产环境修改
      MYSQL_DATABASE: skywalking        # 自动创建skywalking库
      MYSQL_USER: skywalking            # skywalking专用用户
      MYSQL_PASSWORD: sky@123456        # 专用用户密码,建议修改
      TZ: Asia/Shanghai                 # 东八区时区
    command:
      # MySQL8兼容配置(解决OAP连接认证问题)
      - --default-authentication-plugin=mysql_native_password
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_general_ci
      - --sql-mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
    volumes:
      - /data/dockerData/skywalking/mysql/data:/var/lib/mysql  # 数据持久化
      - /etc/localtime:/etc/localtime:ro  # 同步宿主机时区
      - /etc/timezone:/etc/timezone:ro
    ports:
      - "3306:3306"  # 可选,仅需外部访问MySQL时保留
    # 健康检查:确保MySQL初始化完成后再启动OAP
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p$$MYSQL_ROOT_PASSWORD"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 30s

  # ========== SkyWalking OAP 核心服务 ==========
  skywalking-oap:
    image: docker.1ms.run/apache/skywalking-oap-server:10.3.0
    container_name: skywalking-oap
    networks:
      - skywalking-network
    depends_on:
      skywalking-mysql:
        condition: service_healthy  # 依赖MySQL健康检查通过
    environment: 
      TZ: Asia/Shanghai
      # 存储类型配置(MySQL)
      SW_STORAGE: mysql
      SW_JDBC_URL: jdbc:mysql://skywalking-mysql:3306/skywalking?rewriteBatchedStatements=true&allowMultiQueries=true
      SW_DATA_SOURCE_USER: skywalking
      SW_DATA_SOURCE_PASSWORD: sky@123456
      SW_RECEIVER_GRPC_PORT: 11801
      # 其他基础配置
      SW_HEALTH_CHECKER: default
      SW_TELEMETRY: prometheus
      JAVA_OPTS: "-Xms512m -Xmx1024m"  # JVM内存,按需调整(生产建议1G+)
    volumes:
      #- /data/dockerData/skywalking/oap/config/application.yml:/skywalking/config/application.yml  # 第一次运行把这句删了(可选)
      - /data/dockerData/skywalking/oap/logs:/skywalking/oap-server/logs  # OAP日志持久化 
      - /data/dockerData/skywalking/mysql/driver/mysql-connector-j-8.0.33.jar:/skywalking/oap-libs/mysql-connector-j-8.0.33.jar      
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "11801:11801"  # Agent上报数据端口
      - "12800:12800"  # UI连接OAP的端口
    # 健康检查:确保OAP启动完成后再启动UI
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:12800/health/check"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 30s

  # ========== SkyWalking UI 可视化服务 ==========
  skywalking-ui:
    image: docker.1ms.run/apache/skywalking-ui:10.3.0
    container_name: skywalking-ui
    restart: always
    networks:
      - skywalking-network
    depends_on:
      skywalking-oap:
        condition: service_healthy  # 依赖OAP健康检查通过
    environment:
      TZ: Asia/Shanghai
      SW_OAP_ADDRESS: http://skywalking-oap:12800  # 连接OAP的地址
      SW_HEALTH_CHECKER: default
      JAVA_OPTS: "-Xms256m -Xmx256m"  # UI内存,按需调整
    volumes:
      - /data/dockerData/skywalking/ui/logs:/skywalking/ui/logs  # UI日志持久化
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "8080:8080"  # UI访问端口,可自定义(如改为80:8080)

3. 启动服务

# 进入目录
cd /data/dockerData/skywalking
# 启动服务(后台运行)
docker compose up -d
# 查看启动状态
docker compose ps

注意,如果是非docker官方compose插件,命令中间要加-

4.映射配置文件出来(可选)

为了比较好的控制oap,可以将配置文件映射一下。

# 复制配置文件出来
docker cp skywalking-oap:/skywalking/config/application.yml /data/dockerData/skywalking/config
#删除容器
docker compose down -v
# 编辑docker-compose.yml将skywalking-oap的volumes中的配置文件映射注释删掉

#重启容器
docker compose up -d
# 如果服务状态不正常再重启下就对了(因为我配置文件有健康检测,但是oap第一次创建会超时,就容易导致ui启动失败。重启下就对了)
docker compose restart

5. 验证部署

  1. 访问UI界面:浏览器访问 http://服务器IP:8080,能看到SkyWalking控制台即说明部署成功。
  2. 检查容器日志(排查问题用):
    # 查看OAP日志
    docker compose logs -f skywalking-oap
    # 查看UI日志
    docker compose logs -f skywalking-ui
    # 查看MySQL日志
    docker compose logs -f skywalking-mysql
    

三、关键说明

  1. 时区保障
    • 所有容器通过 TZ=Asia/Shanghai 环境变量设置时区;
    • 挂载宿主机 /etc/localtime/etc/timezone 确保时区同步。
  2. 数据持久化
    • MySQL数据:/data/dockerData/skywalking/mysql/data
    • OAP日志:/data/dockerData/skywalking/oap/logs
    • UI日志:/data/dockerData/skywalking/ui/logs
  3. 生产环境优化建议
    • 调整JVM内存(如OAP的 Xms/Xmx 改为 1G/2G);
    • 关闭MySQL的3306端口对外暴露(注释掉ports配置);
    • 更换更复杂的MySQL密码,并限制MySQL用户的访问权限;
    • 增加容器资源限制(如 deploy.resources);
    • 配置MySQL主从或备份策略,防止数据丢失。