1、更新系统并安装依赖
登录你的 Ubuntu 服务器,执行以下命令更新软件源:
sudo apt update && sudo apt install -y curl git
命令拆解
apt:(Advanced Package Tool)高级软件包工具
是 Debian/Ubuntu 系列 Linux 系统的软件包管理工具
它是系统的应用商店 / 软件管家
用来安装、更新、卸载软件(比如你命令里的 curl、git等软件应用)
它是 Ubuntu/Debian 系统的软件安装 / 管理核心命令
apt update:刷新软件源列表,也就是刷新应用商城
apt install:安装软件,安装刷新后的最新软件和依赖,保证下到无漏洞、最新的docker
-y:自动确认安装,不用手动敲回车
curl git:要安装的两个软件
命令作用:更新软件源并一键安装 curl 和 git
用浏览器:你要看网页、登录、交互。
用 curl:你要命令行访问、脚本调用、服务器操作、调试接口、下载文件。
2、安装/更新 Docker
如果你还没有安装 Docker,或者版本较老,可以使用官方脚本一键安装(这会自动处理 Docker Compose 插件):
curl -fsSL https://get.docker.com | bash
2、查看docker是否安装成功
docker --version
3、查看docker的安装目录在哪里
(一般在:/usr/bin/docker,unix system resource,类似于win安装软件到c盘的程序目录)
which docker
4、查看docker的数据目录在哪里(一般在:/var/lib/docker。variable:可变数据存储的目录)
docker info | grep "Docker Root Dir"
3、关键步骤:配置免 sudo 权限 (非root用户执行这一步)
为了避免后续每次运行 docker 命令都要输 <code>sudo</code>,我们需要把当前用户加入 docker 用户组:
把当前用户,添加到 docker 用户组里,让它拥有直接运行 docker 的权限。
sudo usermod -aG docker $USER
newgrp docker
命令拆解
usermod = user modify
-aG(合起来:把用户追加到某个组里。)
两个参数合在一起:
-a = append(追加)
G = Group(附加组)
docker
这是一个 用户组名。
Docker 默认规定:
只要在 docker 组里的用户,就能直接运行 docker 命令,不用 sudo。
$USER
系统自动变量 = 当前登录的用户名
你不用手动写名字,系统自动替换成你自己。
newgrp docker
立刻让用户组权限生效。不用重新登录
第二阶段:构建部署目录与配置
我们将创建一个专门的工作目录,并配置好数据持久化和 API 密钥。
1、创建工作目录
mkdir -p ~/openclaw-lab && cd ~/openclaw-lab
确定openclaw的项目镜像文件位置:
执行命令会下载到docker的(Docker 有自己的镜像仓库)镜像仓库(存在系统盘里,/var/lib/docker 下)
docker pull ghcr.io/openclaw/openclaw:2026.4.8
FROM ghcr.io/openclaw/openclaw:2026.4.8
查看已下载的docker镜像文件:
docker images
查看仓库:
ls -al /var/lib/docker
https://github.com/openclaw/openclaw/pkgs/container/openclaw/783401552?tag=2026.4.8

2、改良后的nano docker-compose.yml配置文件
services:
openclaw:
# 必须要的字段1:镜像
image: ghcr.io/openclaw/openclaw:latest
# 必须要的字段2:端口映射
ports:
- "18789:18789"
# 数据持久化,防止镜像更新丢失数据
volumes:
- ./.openclaw_sys:/root/.openclaw
# 服务器重启自动重启容器
restart: unless-stopped
创建配置文件 (<code>docker-compose.yml</code>) 不建议使用,用上面这个
这是部署的核心。请在终端中执行以下命令,它会直接生成配置文件:
version: "3.8"
# 定义命名卷,用于持久化数据,左边带点,是你目录;左边不点,是 Docker 卷!
volumes:
openclaw_data: # 用于存储配置、数据库等
openclaw_workspace: # 用于存储工作空间文件
services:
openclaw:
# 使用官方 GHCR 镜像
image: ghcr.io/openclaw/openclaw:latest
container_name: openclaw
# no\always\on-failure\unless-stopped除非手动才停止重启
restart: unless-stopped
ports:
# 左边 18789 = 你服务器对外暴露的端口(你访问用的)
# 右边 18789 = 容器内部程序自己用的端口(固定死的)
- "18789:18789" # "主机端口:容器内部端口"
environment:
- TZ=Asia/Shanghai
# 告诉node.js这个运行环境,我在部署于生产环境,不是开发环境development,请稳定运行,不调试
- NODE_ENV=production
# 关键:将 HOME 指向容器内的 /app 或 /root,确保应用能找到配置
# 根据 OpenClaw 的实际运行环境,通常数据目录在容器内是 /root/.openclaw
# 如果报错,可以尝试注释掉 HOME 或改为 /root
# - HOME=/root
# 从 .env 文件读取密钥
- OPENCLAW_GATEWAY_TOKEN=${OPENCLAW_GATEWAY_TOKEN:-}
- OPENAI_API_KEY=${OPENAI_API_KEY:-}
- ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY:-}
- GEMINI_API_KEY=${GEMINI_API_KEY:-}
# volumes类似于mkdir命令,docker会去这里读取配置文件
volumes:
# 方案 A:使用命名卷(推荐,Docker 管理更方便)
- openclaw_data:/root/.openclaw
- openclaw_workspace:/root/.openclaw/workspace
# 方案 B:如果你想用绝对路径(更直观,取消注释下面两行,注释掉上面两行)
# - ./config:/root/.openclaw
# - ./workspace:/root/.openclaw/workspace
# 健康检查(可选)
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:18789/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
# 网络配置
networks:
default:
name: openclaw-network
字段解释:
1、volumes:
./config:/root/.openclaw 这是数据卷挂载(Volume Mount)语法
格式如下:"宿主机路径:容器内路径"
= 把你服务器的当前路径下的config文件夹,挂载到容器内部的 /data 文件夹。
左边:./config
代表你电脑上的文件夹
./ 指的是当前你执行 docker 命令的目录(也就是你 docker-compose.yml 所在的目录)
如果你没这个文件夹,Docker 会自动创建。
作用:存放真正的数据文件(比如openclaw的数据库文件)。
右边:/root/.openclaw
代表容器里面的文件夹。这是容器操作系统内部的路径,跟你电脑没关系。
./config = 你的真实硬盘(家里的大仓库)
/root/.openclaw = 容器里的虚拟硬盘(外卖员送货的地方)
你告诉 Docker:“把虚拟硬盘的/root/.openclaw口,直接通到真实硬盘的./config去
左边是电脑真实路径,右边是容器虚拟路径。冒号把它们连在一起,数据就互通了!
意思是:
openclaw容器产生的数据,不要存在容器内部,直接存在我服务器指定目录下,这样重启容器数据也不会丢。
2、ghcr.io:
GitHub Container(容器) Registry(仓库)
ghcr.io = GitHub 官方的 Docker 镜像服务器域名
3、restart: unless-stopped
可选字段:
no:不自动重启,挂了就挂了,不会自己重启。测试、临时脚本用
always:不管你手动停没停,只要 Docker 启动,它就跟着启动。手动 stop → 重启 Docker 后又会启动
on-failure:你手动停止 → 不重启。只有失败 / 崩溃时才重启。适合定时任务、脚本、一次性任务
unless-stopped:除非手动停止,否则一直重启。适合生产环境、长期运行的服务
4、"18789:18789":
左边 18789 = 你服务器对外暴露的端口(你访问用的)
右边 18789 = 容器内部程序自己用的端口(固定死的)
"18789:18789" # "主机端口:容器内部端口"
5、NODE_ENV=production
NODE_ENV:Node.js 环境变量(告诉程序当前运行的环境)
production = 生产环境
连起来:当前运行在【正式上线、对外提供服务】的环境
production = 正式稳定运行
不写 = 默认就是开发模式(慢、不安全、日志多)
镜像解释
openclaw的github的源码在这个目录下:https://github.com/openclaw/openclaw
openclaw的镜像文件则在ghcr.io/openclaw/openclaw:latest
也就是如果在github上看到一个代码项目,但是又找不到它所在的镜像文件,
可以直接将github.com这个域名改为ghcr.io。把最后一个目录加一个后缀:latest。
就能找到这个镜像文件了。这个规则一般是通用的,但不绝对。
三大镜像仓库对比:
docker.io(Docker 官方, 最大、最通用)
ghcr.io(GitHub 官方,GitHub 项目专用)
quay.io(RedHat,企业常用)
一般docker常用的镜像:
image: nginx
等价于:
image: docker.io/library/nginx:latest
一份docker配置文件中最重要的字段:
services:
openclaw:
# 必须要的字段1
image: ghcr.io/openclaw/openclaw:latest
# 必须要的字段2
ports:
- "18789:18789"
volumes: # 防止docker镜像更新,导致数据也跟着消失
- ./data:/root/.openclaw
restart: unless-stopped # 加了,服务器断电重启,docker也能随着自动重启
env_file:
- .env # 这一行是为了能用(读密钥),必须加上
3、配置 API 密钥 (<code>.env</code>)
OpenClaw 需要大模型的 API Key 才能工作(如 OpenAI、阿里云百炼等)。
请在目录下创建一个 <code>.env</code> 文件:
nano .env
在打开的编辑器中填入你的密钥(以 OpenAI 为例,如果是国内模型请替换 <code>OPENAI_API_BASE</code>):
OPENAI_API_BASE=http://gw-afxny8fq98a5fsi9mw.cn-wulanchabu.pai-eas.aliyuncs.com/api/predict/qwen_model_privacy/v1
OPENAI_API_KEY=M2RkZTBiMzQ4MWQwMDFkOTU4ZmQxMThjZDE2NzFmNWUxZTg1YTg2ZQ==
4、启动docker
docker compose up -d
将配置文件创造的目录root级读写权限分配给node用户
# 先停止容器
docker compose down
# 给权限!最关键一步!
sudo chown -R 1000:1000 .openclaw_data
# 重启容器
docker compose up -d
下载的截图:

5、查看docker启动日志,查看是否有崩溃现象
docker logs -f openclaw
6、docker基础命令
看正在运行的容器:
docker ps
停止:
docker stop openclaw
重启:
docker start openclaw
全部停止:
docker-compose down
修改镜像中的文件的方法
一、挂载替换
如果想改openclaw.json或者某个.py 文件,在服务器上创建一个一模一样的文件,
然后告诉 Docker:“启动的时候,别用你镜像里的那个文件,用我这个!”
1、先找到你要替换文件的所在目录
docker-compose up -d(确保容器启动着)
docker exec -it openclaw sh(进入容器中:openclaw是容器名称)
find / -name openclaw.json(全局查找文件)
找到文件:/home/node/.openclaw/openclaw.json
说明在docker的openclaw容器中,openclaw项目的配置文件openclaw.json
在容器(自己的一个小linux系统)中的所在路径是node用户而不是root用户下
要去改docker的配置文件中的volumes字段
2、创建一个或者找一个目录
# 创建目录
mkdir -p my_modifications
# 创建文件
nano my_modifications/openclaw.json
3、修改 docker-compose.yml
services:
openclaw:
image: ...
volumes:
# 格式:左边是你服务器的文件,右边是容器里原本的文件
- ./.openclaw_data:/home/node/.openclaw
4、重启
docker compose down
docker compose up -d
如果docker-compose.yml 配置文件中的端口修改
要查看加载的openclaw.json中的port字段,要和docker-compose.yml的ports:字段一致,
否则会无法外网访问。
从 Ubuntu 服务器导出 Docker 镜像到 Windows 本机的完整方案
1、服务器上先打包
docker save -o openclaw.tar ghcr.io/openclaw/openclaw:2026.4.8
2、打开powershell或者bash、cmd用 scp 命令传输到本地
scp root@服务器公网IP:~/openclaw-lab/openclaw-2026.4.8.tar D:\docker-images\
打包项目成镜像文件:
1、在项目根目录创建1个文件:Dockerfile
FROM python:3.11
COPY . .
CMD ["python", "app.py"]
2、在项目根目录打开终端,运行
docker build -t my-project:1.0 .
3、查看打包的镜像:
docker images
4、运行镜像(测试)
docker run -d -p 8080:8080 my-project:1.0
5、尝试访问
http://localhost:8080
6、把镜像导出成一个文件
docker save -o my-project.tar my-project:1.0