🐳 OpenClaw Docker部署完全指南

凌晨4点23分,我盯着那台老旧VPS发呆。它问我想不想让它永远保持年轻,我说"想",然后Docker出现了。

为什么选择Docker?

5分钟部署、零依赖污染、一键升级、环境隔离。Docker是OpenClaw生产环境部署的官方推荐方式,比裸机部署安全10倍,比手动配置快100倍。

🎯 部署前准备

🚀 5分钟快速部署

1安装Docker

# 一键安装Docker
curl -fsSL https://get.docker.com | sh

# 启动Docker服务
sudo systemctl start docker
sudo systemctl enable docker

# 验证安装
docker --version  # Docker version 24.0.7

2创建项目目录

mkdir -p ~/openclaw-docker
cd ~/openclaw-docker

# 创建必要目录
mkdir -p {data,logs,skills,custom-skills}

3编写docker-compose.yml

version: '3.8'

services:
  openclaw:
    image: openclaw/gateway:latest
    container_name: openclaw-gateway
    restart: unless-stopped
    
    ports:
      - "3000:3000"  # Gateway端口
      - "8080:8080"  # Admin面板
    
    volumes:
      # 数据持久化
      - ./data:/data
      - ./logs:/logs
      - ./skills:/app/skills:ro
      - ./custom-skills:/app/custom-skills:ro
      
      # 配置文件
      - ./config.yaml:/app/config.yaml:ro
      
      # 时区同步
      - /etc/localtime:/etc/localtime:ro
    
    environment:
      - NODE_ENV=production
      - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}
      - OPENAI_API_KEY=${OPENAI_API_KEY}
      
    # 资源限制
    deploy:
      resources:
        limits:
          memory: 2G
        reservations:
          memory: 512M

4创建配置文件

# config.yaml
gateway:
  port: 3000
  host: "0.0.0.0"
  
models:
  default:
    provider: anthropic
    model: claude-3-5-sonnet-20241022
    api_key: ${ANTHROPIC_API_KEY}

channels:
  telegram:
    enabled: false  # 按需启用
    # bot_token: ${TELEGRAM_TOKEN}
首次部署建议关闭所有渠道,确认Gateway正常运行后再逐步开启

5创建环境变量文件

# .env文件(永远不要提交到Git)
ANTHROPIC_API_KEY=sk-ant-xxxxx
OPENAI_API_KEY=sk-xxxxxx

# 可选渠道密钥
TELEGRAM_TOKEN=123456:ABC-DEF
DISCORD_TOKEN=MTIxxx

# 时区
TZ=Asia/Shanghai

6启动容器

# 启动服务
docker-compose up -d

# 查看日志
docker-compose logs -f openclaw

# 确认运行状态
docker ps | grep openclaw

⚡ 高级配置

自动更新配置

添加Watchtower实现自动更新:

# docker-compose.yml 添加
  watchtower:
    image: containrrr/watchtower
    container_name: watchtower
    restart: unless-stopped
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - WATCHTOWER_POLL_INTERVAL=86400  # 每天检查
      - WATCHTOWER_CLEANUP=true
      - WATCHTOWER_INCLUDE_STOPPED=true

使用Nginx反向代理

# nginx.conf
server {
    listen 80;
    server_name your-domain.com;
    
    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

HTTPS配置(Let's Encrypt)

# 使用acme.sh申请证书
~/.acme.sh/acme.sh --issue -d your-domain.com --nginx

# 自动续期
crontab -e
0 3 * * * ~/.acme.sh/acme.sh --cron

🔧 常用操作

# 查看容器状态
docker-compose ps

# 重启服务
docker-compose restart openclaw

# 更新到最新版本
docker-compose pull openclaw
docker-compose up -d

# 进入容器内部
docker exec -it openclaw-gateway /bin/sh

# 备份数据
tar -czf backup-$(date +%Y%m%d).tar.gz data/ logs/ config.yaml

# 恢复数据
tar -xzf backup-20260117.tar.gz
docker-compose restart

💎 生产环境最佳实践

重要提醒:
1. 首次启动后访问 http://服务器IP:8080 完成初始化设置
2. 默认情况下Gateway只监听localhost,生产环境需改为0.0.0.0
3. 防火墙开放对应端口:sudo ufw allow 3000/tcp

🔗 相关资源

写在最后:
"Docker不是什么魔法,它只是把魔法封装成了集装箱。而你,现在是那个掌握钥匙的港口管理员。凌晨4点47分,我关闭了终端——你的OpenClaw正在容器中静静运行,像一座永不熄灭的城市。"