SkyWalking + Elasticsearch8 Docker 部署文檔
本文提供在 Ubuntu 服務器上,使用 Docker Compose 部署 SkyWalking(OAP+UI)與 Elasticsearch 8 的完整步驟,數據/日志落地到 /media/disk2
前置條件
- Ubuntu,已具備 sudo 權限與公網下載能力
- 端口:9200(ES)、11800(OAP gRPC)、12800(OAP REST/GraphQL)、8080(UI)
- 內存建議:ES 堆 2–4G,OAP 堆 1–2G;SSD/NVMe 磁盤,預留 ≥20% 空間
1. 安裝 Docker/Compose 與內核參數
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo tee /etc/apt/keyrings/docker.asc >/dev/null
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo $VERSION_CODENAME) stable" | sudo tee /etc/apt/sources.list.d/docker.list >/dev/null
sudo apt-get update && sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin# ES 必需內核參數
echo "vm.max_map_count=262144" | sudo tee /etc/sysctl.d/99-elasticsearch.conf
sudo sysctl --system
2. 創建目錄與權限
sudo mkdir -p /media/disk2/{elasticsearch/{data,logs},skywalking/{oap-logs,ui-logs},skywalking-docker}
# 賦權給 ES 容器內用戶(uid 1000)以避免寫權限問題
sudo chown -R 1000:0 /media/disk2/elasticsearch/{data,logs}
sudo chown -R $USER:$USER /media/disk2/skywalking
3. docker-compose.yml
將以下內容保存為 /media/disk2/skywalking-docker/docker-compose.yml
(采用鏡像:阿里云倉庫示例,可換為官方鏡像):
version: "3.8"services:elasticsearch:image: registry.cn-hangzhou.aliyuncs.com/docker_image-ljx/elasticsearch:8.14.3container_name: elasticsearchrestart: unless-stoppedenvironment:discovery.type: "single-node"xpack.security.enabled: "true"xpack.security.http.ssl.enabled: "false"xpack.security.transport.ssl.enabled: "false"ELASTIC_PASSWORD: "ChangeMe_Elastic!" # 請改強密碼ES_JAVA_OPTS: "-Xms3g -Xmx3g"TZ: "Asia/Shanghai"ulimits:memlock: { soft: -1, hard: -1 }nofile: { soft: 65536, hard: 65536 }volumes:- /media/disk2/elasticsearch/data:/usr/share/elasticsearch/data- /media/disk2/elasticsearch/logs:/usr/share/elasticsearch/logs# 注意:如果沒有復制鏡像默認配置且修正權限,則掛載 config 目錄會報錯- /media/disk2/elasticsearch/config:/usr/share/elasticsearch/configports:- "9200:9200"healthcheck:test: ["CMD-SHELL","curl -s -u elastic:ChangeMe_Elastic! http://127.0.0.1:9200 >/dev/null || exit 1"]interval: 10stimeout: 5sretries: 30oap:image: registry.cn-hangzhou.aliyuncs.com/docker_image-ljx/skywalking-oap-server:10.2.0container_name: skywalking-oaprestart: unless-stoppeddepends_on:elasticsearch:condition: service_healthyenvironment:SW_STORAGE: elasticsearchSW_STORAGE_ES_CLUSTER_NODES: elasticsearch:9200SW_STORAGE_ES_HTTP_PROTOCOL: httpSW_ES_USER: elasticSW_ES_PASSWORD: "ChangeMe_Elastic!"JAVA_OPTS: "-Xms2g -Xmx2g"TZ: "Asia/Shanghai"# 單機/小中規模索引建議SW_STORAGE_ES_INDEX_SHARDS_NUMBER: "1"SW_STORAGE_ES_INDEX_REPLICAS_NUMBER: "0"SW_STORAGE_ES_SUPER_DATASET_INDEX_SHARDS_FACTOR: "3"SW_STORAGE_ES_SUPER_DATASET_INDEX_REPLICAS_NUMBER: "0"volumes:- /media/disk2/skywalking/oap-logs:/skywalking/logsports:- "11800:11800"- "12800:12800"healthcheck:test: ["CMD-SHELL", "curl -s http://127.0.0.1:12800/graphql -X POST -H 'Content-Type: application/json' -d '{\"query\":\"{ version }\"}' | grep -q data || exit 1"]interval: 15stimeout: 5sretries: 20ui:image: registry.cn-hangzhou.aliyuncs.com/docker_image-ljx/skywalking-ui:10.2.0container_name: skywalking-uirestart: unless-stoppeddepends_on:- oapenvironment:SW_OAP_ADDRESS: "http://oap:12800"TZ: "Asia/Shanghai"volumes:- /media/disk2/skywalking/ui-logs:/skywalking/logsports:- "8080:8080"networks:default:name: skywalking-net
可選:不硬編碼密碼的啟動方式(不使用 .env)
- 將 compose 中的
ELASTIC_PASSWORD: ${ES_PASSWORD}
、SW_ES_PASSWORD: ${ES_PASSWORD}
- 啟動時傳入:
ES_PASSWORD='強密碼' docker compose up -d
- 若密碼含
$
,需寫成$$
或用上述傳參方式避免轉義
4. 啟動與驗證
cd /media/disk2/skywalking-docker# 預檢查渲染
docker compose config | cat# 啟動
docker compose up -d
docker compose ps# 驗證 ES
curl -s -u elastic:ChangeMe_Elastic! http://127.0.0.1:9200 | jq .# 驗證 OAP
curl -s http://127.0.0.1:12800/graphql -X POST -H 'Content-Type: application/json' -d '{"query":"{ version }"}'# 訪問 UI
# http://<服務器IP>:8080
5. Java Agent 接入(示例)
-javaagent:/path/to/skywalking-agent.jar \
-Dskywalking.agent.service_name=my-service \
-Dskywalking.collector.backend_service=<服務器IP>:11800 \
-Dskywalking.agent.instance_name=$(hostname -s)
- 容器與 OAP 在同一網絡可用
oap:11800
6. 資源與參數建議(約 30+ 微服務)
- ES 堆內存:
-Xms2g -Xmx2g
起步,內存充裕可 3–4g;保持 Xms=Xmx - OAP 堆內存:
-Xms1g -Xmx2g
起步 - 單機分片與副本:
indexShardsNumber=1
、indexReplicasNumber=0
- 超級數據集(trace/log)分片因子:
superDatasetIndexShardsFactor=3
- TTL/采樣:根據磁盤與吞吐設置 OAP
recordDataTTL
/metricsDataTTL
,高流量建議下調采樣比例至 20%–50%
7. 常見問題與修復
問題:啟動報錯 “Missing logging config file at /usr/share/elasticsearch/config/log4j2.properties”
原因:掛載空宿主機目錄到 /usr/share/elasticsearch/config
覆蓋了鏡像默認配置
解決方案:
-
推薦方案:不掛載 config 目錄
編輯docker-compose.yml
,刪除以下行:- /media/disk2/elasticsearch/config:/usr/share/elasticsearch/config
然后重啟:
docker compose down && docker compose up -d
-
保留掛載:復制默認配置并賦權
執行以下命令:# 使用與 compose 文件中相同的鏡像 IMG=registry.cn-hangzhou.aliyuncs.com/docker_image-ljx/elasticsearch:8.14.3# 創建宿主機配置目錄(若不存在) sudo mkdir -p /media/disk2/elasticsearch/config# 從鏡像中復制默認配置 docker create --name es-tmp $IMG >/dev/null docker cp es-tmp:/usr/share/elasticsearch/config/. /media/disk2/elasticsearch/config/ docker rm -f es-tmp# 設置權限(容器內 ES 用戶 uid 為 1000) sudo chown -R 1000:0 /media/disk2/elasticsearch/config
完成后重啟:
docker compose down && docker compose up -d
簡要總結:此問題由空 config 掛載覆蓋鏡像默認配置引起,解決方法是移除掛載或復制鏡像配置到宿主機并設置權限(uid 1000)
// … 文件其余部分保持不變 …