Apache OpenWhisk 2.0.0 Docker Compose 部署指南
使用 Docker Compose 在 Ubuntu 22.04 上部署 Apache OpenWhisk 2.0.0 单机 standalone 服务,涵盖 Dockerfile 与 docker-compose.yml 编写、镜像构建、compose up/down 生命周期管理、端口与数据目录、函数端到端验证及实例名/网络/内存三类常见排障,命令与回显均实测
Apache OpenWhisk 2.0.0 Docker Compose 部署指南
目标:在 Ubuntu 22.04 服务器上使用 Docker Compose 部署 Apache OpenWhisk 2.0.0 单机 standalone 服务,实现一条命令拉起、函数端到端可用、生命周期可视化管理。以下 Dockerfile、compose 编排与全部回显均在真实环境逐步实测。
一、环境信息
- 操作系统:Ubuntu 22.04.5 LTS(x86_64)
- Docker:29.1.3(含 compose 插件 v5.5.1)
- Apache OpenWhisk:2.0.0(standalone 单机模式,
openwhisk-standalone.jar) - wsk CLI:1.2.0
- 基础映像:ubuntu:22.04;应用映像:
openwhisk-standalone:2.0.0 - 实例名:
ow-standalone;compose 工程名:ow-compose - 端口:3233(Controller / API)、3232(Playground UI)
- 运行用户:root(示例账号:root,密码:q1w2e3r4)
💡 前提:先按《Ubuntu 22.04 安装 Apache OpenWhisk 2.0.0 指南》构建出
openwhisk-standalone.jar并准备好 wsk CLI 二进制,本文假定二者已存在(位于/opt/OpenWhisk-2.0.0/bin/与/usr/local/bin/wsk),同时已准备函数运行时映像openwhisk/action-nodejs-v20:1.22.0。
二、编排文件准备
2.1 Dockerfile
创建目录 /opt/ow-compose,编写 Dockerfile:
mkdir -p /opt/ow-compose
cd /opt/ow-compose
Dockerfile 内容:
FROM ubuntu:22.04
RUN apt-get update -qq && \
DEBIAN_FRONTEND=noninteractive apt-get install -y -qq \
openjdk-11-jdk docker.io curl unzip net-tools procps && \
rm -rf /var/lib/apt/lists/*
ENV JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 \
PATH=/usr/local/bin:/usr/bin:/bin
COPY openwhisk-standalone.jar /opt/openwhisk/bin/openwhisk-standalone.jar
COPY wsk /usr/local/bin/wsk
WORKDIR /opt/openwhisk
EXPOSE 3233 3232
CMD ["java", "-jar", "/opt/openwhisk/bin/openwhisk-standalone.jar"]
说明:映像内安装
docker.io是为了让 standalone 的 invoker 能通过docker.sock拉起函数运行时;openwhisk-standalone.jar与 wsk 二进制需提前放入构建上下文目录。
2.2 docker-compose.yml
docker-compose.yml 内容(实测最终版):
services:
openwhisk:
build: .
image: openwhisk-standalone:2.0.0
container_name: ow-standalone
restart: unless-stopped
network_mode: host
environment:
JAVA_TOOL_OPTIONS: "-Djava.io.tmpdir=/opt/tmp -Xms256m -Xmx512m"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
| 配置项 | 值 | 说明 |
|---|---|---|
container_name | ow-standalone | 实例名,不可包含 whisk- 子串,否则会被 standalone 启动时的 support 实例清理逻辑误删 |
network_mode | host | 复用宿主机网络,standalone 探测到的本机 IP 可直接绑定(bridge 网络会因探测到网桥 IP 而绑定失败) |
JAVA_TOOL_OPTIONS | -Djava.io.tmpdir=/opt/tmp -Xms256m -Xmx512m | 临时目录规避 tmpfs mmap 问题;JVM 堆限制 256–512MB |
volumes | /var/run/docker.sock | 让 invoker 使用宿主机运行时拉起函数运行环境 |
⚠️
version: '3.8'顶层键在 compose v5.5.1 下提示obsolete(会被忽略),可省略不写。
2.3 构建上下文
cp /opt/OpenWhisk-2.0.0/bin/openwhisk-standalone.jar /opt/ow-compose/
cp /usr/local/bin/wsk /opt/ow-compose/
ls /opt/ow-compose
回显:
Dockerfile
docker-compose.yml
openwhisk-standalone.jar
wsk
三、构建与启动
cd /opt/ow-compose
docker compose up -d --build
构建与启动回显:
Image openwhisk-standalone:2.0.0 Building
Sending build context to Docker daemon 158MB
Step 1/9 : FROM ubuntu:22.04
---> e8df6c74f650
Step 2/9 : RUN apt-get update -qq && DEBIAN_FRONTEND=noninteractive apt-get install -y -qq openjdk-11-jdk docker.io curl unzip net-tools procps && rm -rf /var/lib/apt/lists/*
---> Using cache
---> 20c0e7a9a927
Step 3/9 : ENV JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 PATH=/usr/local/bin:/usr/bin:/bin
---> Using cache
---> 1053598d64e4
Step 4/9 : COPY openwhisk-standalone.jar /opt/openwhisk/bin/openwhisk-standalone.jar
---> Using cache
---> 36b6f9ddfcec
Step 5/9 : COPY wsk /usr/local/bin/wsk
---> Using cache
---> 64c16d9c5f03
Step 6/9 : WORKDIR /opt/openwhisk
---> Using cache
---> 3b2677fb0fe0
Step 7/9 : EXPOSE 3233 3232
---> Using cache
---> 117498973101
Step 8/9 : CMD ["java", "-jar", "/opt/openwhisk/bin/openwhisk-standalone.jar"]
---> Using cache
---> 569f3ff9980d
Step 9/9 : LABEL com.docker.compose.image.builder=classic
---> Using cache
---> 3b2b9e623457
Successfully built 3b2b9e623457
Successfully tagged openwhisk-standalone:2.0.0
Image openwhisk-standalone:2.0.0 Built
Container ow-standalone Created
Container ow-standalone Starting
Container ow-standalone Started
查看服务状态:
docker compose ps
回显:
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
ow-standalone openwhisk-standalone:2.0.0 "java -jar /opt/open…" openwhisk 52 seconds ago Up 45 seconds
docker compose ps首次执行可能输出一条version is obsolete警告,忽略即可。
四、验证服务可用
4.1 查看启动日志
docker logs ow-standalone | grep -E "Launched service|Controller started|Created user"
回显(节选):
[ OK ] Server port [3233] is free
Launched service details
[ 3233 ] http://172.18.0.1:3233 (Controller)
[ 3232 ] http://172.18.0.1:3232/playground (Playground)
[2026-10-11T19:04:33.239Z] [INFO] [StandaloneOpenWhisk] Created user [guest]
[2026-10-11T19:04:33.301Z] [INFO] [StandaloneOpenWhisk] Created user [whisk.system]
invoker 预热回显(docker logs ow-standalone | grep prewarm):
[2026-10-11T19:06:01.895Z] [INFO] [DockerClientWithFileAccess] running /usr/bin/docker run -d
--cpu-shares 256 --memory 256m --memory-swap 256m --network bridge
-e __OW_API_HOST=http://172.18.0.1:3233 --name wsk0_1_prewarm_nodejs20
--pids-limit 1024 --cap-drop NET_RAW --cap-drop NET_ADMIN
--ulimit nofile=1024:1024 --log-driver json-file openwhisk/action-nodejs-v20:1.22.0
日志中的 172.18.0.1 为实测环境的本机地址,请以实际服务器 IP 为准。
4.2 探测 API
curl -s -o /dev/null -w "%{http_code}" http://172.18.0.1:3233/api/v1/namespaces
回显:
401
401 表示 API 端口已监听并返回鉴权要求,属正常(需带 guest 凭据)。
4.3 配置 wsk 并创建函数
wsk property set --apihost http://172.18.0.1:3233
wsk property set --auth 23bc46b1-71f6-4ed5-8c54-816aa4f8c502:123zO3xZCLrMN6v2BKK1dXYFpXlPkccOFqm12CdAsMgRU4VrNZ9lyGVCGuMDGIwP
编写函数并创建 action:
cat > /tmp/hello.js <<'EOF'
function main(params) {
const name = params.name || "stranger";
return { greeting: "Hello, " + name + "!" };
}
EOF
wsk action create hello /tmp/hello.js --kind nodejs:20
回显:
ok: created action hello
4.4 调用函数
wsk action invoke hello --blocking --result -p name Compose
回显:
{
"greeting": "Hello, Compose!"
}
4.5 查看调用记录
wsk activation list
回显:
Datetime Activation ID Kind Start Duration Status Entity
2026-10-11 19:07:11 abe34729610e4f4ba34729610e2f4b73 nodejs:20 cold 417ms success guest/hello:0.0.1
至此 Compose 部署的函数链路完全打通。
五、常用管理操作
5.1 查看工程配置
cd /opt/ow-compose && docker compose config
回显(节选):
name: ow-compose
services:
openwhisk:
build:
context: /opt/ow-compose
dockerfile: Dockerfile
container_name: ow-standalone
environment:
JAVA_TOOL_OPTIONS: -Djava.io.tmpdir=/opt/tmp -Xms256m -Xmx512m
image: openwhisk-standalone:2.0.0
network_mode: host
restart: unless-stopped
volumes:
- type: bind
source: /var/run/docker.sock
target: /var/run/docker.sock
5.2 停止与移除
cd /opt/ow-compose && docker compose down
回显:
Container ow-standalone Stopped
Container ow-standalone Removing
Container ow-standalone Removed
5.3 重新启动
docker compose up -d
restart: unless-stopped保证宿主机重启后服务自动拉起;docker compose down后需再次up -d。
六、注意事项
- 实例名不能包含
whisk-子串:standalone 启动时会执行docker ps --filter name=whisk-并清理匹配的 support 实例,实例名含该子串会被误删(exit 137)。 - 使用
network_mode: host:standalone 会绑定其探测到的本机 IP;bridge 网络下探测到的是宿主机网桥 IP,实例内绑定会报BindException: Cannot assign requested address。 - 不宜设
mem_limit:JVM 堆 + 预热实例(默认 2 个wsk0_*_prewarm_nodejs20)内存叠加易触发宿主 OOM,堆大小由JAVA_TOOL_OPTIONS的-Xms256m -Xmx512m控制。 - standalone 为内存存储:服务重启后已创建的 action / trigger / rule 全部丢失,需重新创建(
docker compose restart亦然)。 - 冷启动函数依赖运行时映像:确保
openwhisk/action-nodejs-v20:1.22.0已存在于本地,否则首次调用会因拉取失败报 HTTP 500 冷启动失败。
七、常见问题
7.1 实例启动数秒后被自动删除(exit 137)
原因:实例名含 whisk- 子串,被 standalone 启动时的 support 实例清理逻辑误杀。
解决:改用不含 whisk- 的实例名,如 ow-standalone。
7.2 启动报 BindException: [/172.18.0.1:3232] Cannot assign requested address
原因:bridge 网络下实例内不存在宿主机网桥 IP,standalone 无法绑定探测到的地址。
解决:在 docker-compose.yml 中设置 network_mode: host。
7.3 首次调用函数报 HTTP 500 / 冷启动失败
原因:函数运行时映像缺失,冷启动尝试从公网拉取失败。
解决:提前导入 openwhisk/action-nodejs-v20:1.22.0 映像并确认 pull-standard-images = false(见安装指南 4.5 节)。
7.4 重启后 action 丢失
原因:standalone 使用内存存储。
解决:属正常特性,重启后重新执行 wsk action create 即可。
7.5 docker compose ps 提示 version is obsolete
原因:compose 新版本忽略 version 顶层键。
解决:删除 version: '3.8' 行即可,不影响功能。
八、卸载
cd /opt/ow-compose
docker compose down --rmi all --volumes
rm -rf /opt/ow-compose
九、参考链接
- OpenWhisk 源码与 Quick Start:https://github.com/apache/openwhisk
- Docker Compose 官方文档:https://docs.docker.com/compose/
- OpenWhisk CLI 发布:https://github.com/apache/openwhisk-cli/releases