#!/bin/bash # 定义变量 CONTAINER_NAME="skywalkingwalking-oap-server" IMAGE_NAME="apache/skywalking-oap-server:9.4.0" # SkyWalking OAP 镜像及版本 DATA_DIR="/docker-data/skywalking/data" # 数据存储目录 LOGS_DIR="/docker-data/skywalking/logs" # 日志目录 PORT=12800 # OAP gRPC 端口 PORT1=11800 # OAP REST 端口 NETWORK_NAME="scm-net" SW_IP="10.10.2.102" # 固定IP ES_HOST="10.10.2.102" # 关联的Elasticsearch容器名称 ES_PORT=9200 # Elasticsearch端口 SW_STORAGE="elasticsearch7" # 存储类型(对应ES 7.x版本) # 显示帮助信息 show_help() { echo "使用方法: $0 [操作类型]" echo "操作类型:" echo " deploy - 部署并启动SkyWalking OAP Server容器" echo " remove - 停止并删除SkyWalking OAP Server容器及数据/配置/日志目录" echo " logs - 查看SkyWalking OAP Server容器日志" echo " help - 显示帮助信息" } # 部署功能 deploy_skywalking() { # 检查数据、配置、日志目录是否存在,不存在则创建 for dir in "$DATA_DIR" "$LOGS_DIR"; do if [ ! -d "$dir" ]; then echo "创建目录: $dir" mkdir -p "$dir" chmod 777 "$dir" # 确保容器内用户可访问 fi done # 检查容器是否已存在,存在则停止并删除 if [ "$(docker ps -aq -f name=$CONTAINER_NAME)" ]; then echo "停止并删除现有容器: $CONTAINER_NAME" docker stop $CONTAINER_NAME docker rm $CONTAINER_NAME fi # 启动SkyWalking OAP Server容器 echo "启动SkyWalking OAP Server容器..." docker run -d --privileged --name $CONTAINER_NAME --restart always \ -p $PORT:12800 -p $PORT1:11800 -p 1234:1234 \ -v $DATA_DIR:/skywalking/data \ -v $LOGS_DIR:/skywalking/logs \ -e TZ=Asia/Shanghai \ -e "SW_STORAGE=elasticsearch" \ -e "SW_STORAGE_ES_CLUSTER_NODES=$ES_HOST:$ES_PORT" \ -e "SW_ES_VERSION=7" \ -e "SW_STORAGE_ES_USE_HIGH_LEVEL_CLIENT=true" \ $IMAGE_NAME # 检查容器启动状态 if [ "$(docker ps -aq -f name=$CONTAINER_NAME -f status=running)" ]; then echo "SkyWalking OAP Server容器启动成功!" echo "容器名称: $CONTAINER_NAME" echo "数据目录: $DATA_DIR" echo "日志目录: $LOGS_DIR" echo "gRPC端口: $PORT" echo "REST端口: $PORT1" echo "关联Elasticsearch: $ES_HOST:$ES_PORT" echo "存储类型: $SW_STORAGE" else echo "SkyWalking OAP Server容器启动失败,请检查日志获取详细信息。" docker logs $CONTAINER_NAME fi } # 删除功能 remove_skywalking() { # 检查容器是否存在 if [ "$(docker ps -aq -f name=$CONTAINER_NAME)" ]; then echo "停止容器: $CONTAINER_NAME" docker stop $CONTAINER_NAME echo "删除容器: $CONTAINER_NAME" docker rm $CONTAINER_NAME else echo "容器 $CONTAINER_NAME 不存在" fi # 检查数据目录是否存在 if [ -d "$DATA_DIR" ]; then read -p "是否删除数据目录 $DATA_DIR? (y/n) " confirm if [ "$confirm" = "y" ] || [ "$confirm" = "Y" ]; then echo "删除数据目录: $DATA_DIR" rm -rf "$DATA_DIR" else echo "保留数据目录: $DATA_DIR" fi else echo "数据目录 $DATA_DIR 不存在" fi # 检查配置目录是否存在 if [ -d "$CONFIG_DIR" ]; then read -p "是否删除配置目录 $CONFIG_DIR? (y/n) " confirm if [ "$confirm" = "y" ] || [ "$confirm" = "Y" ]; then echo "删除配置目录: $CONFIG_DIR" rm -rf "$CONFIG_DIR" else echo "保留配置目录: $CONFIG_DIR" fi else echo "配置目录 $CONFIG_DIR 不存在" fi # 检查日志目录是否存在 if [ -d "$LOGS_DIR" ]; then read -p "是否删除日志目录 $LOGS_DIR? (y/n) " confirm if [ "$confirm" = "y" ] || [ "$confirm" = "Y" ]; then echo "删除日志目录: $LOGS_DIR" rm -rf "$LOGS_DIR" else echo "保留日志目录: $LOGS_DIR" fi else echo "日志目录 $LOGS_DIR 不存在" fi } # 日志功能 show_logs() { if [ "$(docker ps -aq -f name=$CONTAINER_NAME)" ]; then echo "查看 $CONTAINER_NAME 容器日志 (按 Ctrl+C 退出)..." docker logs -f $CONTAINER_NAME else echo "容器 $CONTAINER_NAME 不存在" fi } # 主逻辑 if [ $# -ne 1 ]; then show_help exit 1 fi case "$1" in deploy) deploy_skywalking ;; remove) remove_skywalking ;; logs) show_logs ;; help) show_help ;; *) echo "无效的操作类型: $1" show_help exit 1 ;; esac