Docker 部署
概述
OpenPLC Runtime v4 提供官方 Docker 镜像,便于跨多个平台轻松部署。容器化的运行时包含所有依赖项,可以通过单一命令部署。
官方镜像
注册表: GitHub Container Registry (GHCR)
镜像: ghcr.io/autonomy-logic/openplc-runtime:latest
支持的架构:
linux/amd64- x86_64 系统linux/arm64- ARM 64位(树莓派 4 等)linux/arm/v7- ARM 32位(树莓派 3 等)
快速开始
拉取并运行
bash
docker pull ghcr.io/autonomy-logic/openplc-runtime:latest
docker run -d \
--name openplc-runtime \
-p 8443:8443 \
--cap-add=SYS_NICE \
--cap-add=SYS_RESOURCE \
-v openplc-runtime-data:/var/run/runtime \
ghcr.io/autonomy-logic/openplc-runtime:latest
注意: 运行时将在端口 8443 上监听来自 OpenPLC Editor 的连接。不要在浏览器中打开 https://localhost:8443 - 没有 Web 界面。请从 OpenPLC Editor 桌面应用程序连接。
停止和移除
bash
docker stop openplc-runtime
docker rm openplc-runtime
卷管理
持久化数据
运行时将重要数据存储在 /var/run/runtime/:
内容:
.env- 环境变量(JWT 密钥、数据库 URI、密码胡椒值)restapi.db- 包含用户账户的 SQLite 数据库- 套接字文件(运行时创建,临时性)
卷挂载:
bash
-v openplc-runtime-data:/var/run/runtime
命名卷(推荐)
使用命名卷提供持久化和易管理性:
bash
# 创建命名卷
docker volume create openplc-runtime-data
# 使用命名卷运行
docker run -d \
--name openplc-runtime \
-p 8443:8443 \
-v openplc-runtime-data:/var/run/runtime \
ghcr.io/autonomy-logic/openplc-runtime:latest
优势:
- 数据在容器重启后持久保存
- 易于备份和恢复
- Docker 管理卷位置
绑定挂载(替代方案)
用于直接访问运行时数据:
bash
mkdir -p /path/to/runtime-data
docker run -d \
--name openplc-runtime \
-p 8443:8443 \
-v /path/to/runtime-data:/var/run/runtime \
ghcr.io/autonomy-logic/openplc-runtime:latest
优势:
- 直接文件系统访问
- 易于检查和备份
- 可以使用现有目录
考虑事项:
- 需要适当权限
- 主机路径必须存在
- 跨系统可移植性较差
端口映射
默认端口
运行时暴露端口 8443 用于 OpenPLC Editor 的 REST API 访问:
bash
-p 8443:8443
自定义端口
使用不同的主机端口:
bash
-p 9443:8443 # Editor 连接到 https://localhost:9443
仅限本地主机
限制仅限本地主机访问:
bash
-p 127.0.0.1:8443:8443
多接口
绑定到特定接口:
bash
-p 192.168.1.100:8443:8443
环境变量
数据库 URI
覆盖默认数据库位置:
bash
docker run -d \
--name openplc-runtime \
-p 8443:8443 \
-e SQLALCHEMY_DATABASE_URI=sqlite:////var/run/runtime/custom.db \
-v openplc-runtime-data:/var/run/runtime \
ghcr.io/autonomy-logic/openplc-runtime:latest
JWT 密钥
提供自定义 JWT 密钥(不推荐,自动生成更安全):
bash
-e JWT_SECRET_KEY=your_64_character_hex_string_here
密码胡椒值
提供自定义密码哈希胡椒值:
bash
-e PEPPER=your_64_character_hex_string_here
实时调度
对于实时性能,容器可能需要特权模式:
bash
docker run -d \
--name openplc-runtime \
--privileged \
-p 8443:8443 \
-v openplc-runtime-data:/var/run/runtime \
ghcr.io/autonomy-logic/openplc-runtime:latest
替代方案(更安全):
授予特定能力而不是完全特权模式:
bash
docker run -d \
--name openplc-runtime \
--cap-add=SYS_NICE \
-p 8443:8443 \
-v openplc-runtime-data:/var/run/runtime \
ghcr.io/autonomy-logic/openplc-runtime:latest
能力:
SYS_NICE- SCHED_FIFO 实时调度所需
Docker Compose
基本配置
创建 docker-compose.yml:
yaml
version: '3.8'
services:
openplc-runtime:
image: ghcr.io/autonomy-logic/openplc-runtime:latest
container_name: openplc-runtime
ports:
- "8443:8443"
volumes:
- openplc-runtime-data:/var/run/runtime
restart: unless-stopped
volumes:
openplc-runtime-data:
启动:
bash
docker-compose up -d
停止:
bash
docker-compose down
高级配置
yaml
version: '3.8'
services:
openplc-runtime:
image: ghcr.io/autonomy-logic/openplc-runtime:latest
container_name: openplc-runtime
cap_add:
- SYS_NICE
ports:
- "127.0.0.1:8443:8443"
volumes:
- openplc-runtime-data:/var/run/runtime
- ./plugins.conf:/workdir/plugins.conf:ro
environment:
- TZ=America/New_York
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-k", "-f", "https://localhost:8443/api/ping"]
interval: 30s
timeout: 10s
retries: 3
start_period: 10s
volumes:
openplc-runtime-data:
功能:
- 仅限本地主机访问
- 实时调度能力
- 自定义插件配置
- 时区设置
- 健康检查监控
- 故障时自动重启
构建自定义镜像
从源代码构建
克隆仓库并构建:
bash
git clone https://github.com/Autonomy-Logic/openplc-runtime.git
cd openplc-runtime
git checkout development
docker build -t my-openplc-runtime .
使用构建脚本
bash
bash scripts/build-docker-image.sh
多架构构建
构建支持多架构的镜像:
bash
docker buildx create --use
docker buildx build \
--platform linux/amd64,linux/arm64,linux/arm/v7 \
-t my-openplc-runtime:latest \
--push \
.
开发容器
用于开发和测试,使用开发镜像:
bash
bash scripts/build-docker-image-dev.sh
bash scripts/run-image-dev.sh
功能:
- 包含测试依赖项
- 安装开发工具
- 源代码作为卷挂载
- 交互式 shell 访问
网络配置
桥接网络(默认)
容器使用 Docker 的默认桥接网络:
bash
docker run -d \
--name openplc-runtime \
-p 8443:8443 \
ghcr.io/autonomy-logic/openplc-runtime:latest
主机网络
用于直接主机网络访问(仅限 Linux):
bash
docker run -d \
--name openplc-runtime \
--network host \
ghcr.io/autonomy-logic/openplc-runtime:latest
注意: 使用主机网络时不需要端口映射。
自定义网络
创建和使用自定义网络:
bash
docker network create openplc-net
docker run -d \
--name openplc-runtime \
--network openplc-net \
-p 8443:8443 \
ghcr.io/autonomy-logic/openplc-runtime:latest
日志管理
查看日志
bash
docker logs openplc-runtime
跟踪日志
bash
docker logs -f openplc-runtime
限制日志输出
bash
docker logs --tail 100 openplc-runtime
日志驱动程序
在 docker-compose.yml 中配置日志驱动程序:
yaml
services:
openplc-runtime:
image: ghcr.io/autonomy-logic/openplc-runtime:latest
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
备份和恢复
备份卷
bash
# 创建备份
docker run --rm \
-v openplc-runtime-data:/data \
-v $(pwd):/backup \
alpine tar czf /backup/openplc-backup.tar.gz -C /data .
恢复卷
bash
# 恢复备份
docker run --rm \
-v openplc-runtime-data:/data \
-v $(pwd):/backup \
alpine tar xzf /backup/openplc-backup.tar.gz -C /data
导出容器
bash
docker export openplc-runtime > openplc-container.tar
导入容器
bash
docker import openplc-container.tar my-openplc-runtime:backup
安全考虑
容器隔离
优势:
- 与主机的进程隔离
- 文件系统隔离
- 网络隔离(除非使用主机网络)
限制:
- 特权模式减少隔离
- 卷挂载暴露主机目录
- 端口暴露创建网络访问
镜像验证
验证镜像真实性:
bash
docker pull ghcr.io/autonomy-logic/openplc-runtime:latest
docker inspect ghcr.io/autonomy-logic/openplc-runtime:latest
密钥管理
不要:
- 在 docker-compose.yml 中硬编码密钥
- 将 .env 文件提交到版本控制
- 在生产中使用默认密码
要:
- 使用 Docker 密钥(Swarm 模式)
- 使用具有适当权限的环境文件 (.env)
- 定期轮换密钥
网络安全
建议:
- 使用防火墙规则限制访问
- 绑定到本地主机以仅限本地访问
- 使用反向代理增加安全性
- 启用 TLS 证书验证
故障排除
容器无法启动
检查日志:
bash
docker logs openplc-runtime
常见问题:
- 端口已被占用
- 卷权限错误
- 资源不足
无法从 OpenPLC Editor 连接
验证容器是否运行:
bash
docker ps | grep openplc-runtime
检查端口映射:
bash
docker port openplc-runtime
测试连接性:
bash
curl -k https://localhost:8443/api/ping
实时性能问题
解决方案:
- 使用
--privileged或--cap-add=SYS_NICE - 增加容器资源
- 使用主机网络模式
- 检查主机系统负载
卷权限错误
修复权限:
bash
docker run --rm \
-v openplc-runtime-data:/data \
alpine chown -R 1000:1000 /data
磁盘空间不足
清理:
bash
docker system prune -a
docker volume prune
性能优化
资源限制
限制容器资源:
yaml
services:
openplc-runtime:
image: ghcr.io/autonomy-logic/openplc-runtime:latest
deploy:
resources:
limits:
cpus: '2'
memory: 1G
reservations:
cpus: '1'
memory: 512M
CPU 固定
将容器固定到特定 CPU 核心:
bash
docker run -d \
--name openplc-runtime \
--cpuset-cpus="0,1" \
-p 8443:8443 \
ghcr.io/autonomy-logic/openplc-runtime:latest
内存优化
bash
docker run -d \
--name openplc-runtime \
--memory="1g" \
--memory-swap="2g" \
-p 8443:8443 \
ghcr.io/autonomy-logic/openplc-runtime:latest
CI/CD 集成
GitHub Actions
官方镜像通过 GitHub Actions 自动构建:
工作流: .github/workflows/docker.yml
触发条件:
- 推送到 development 分支
- 到 development 的拉取请求
- 手动工作流调度
流程:
- 构建多架构镜像
- 运行测试
- 推送到 GHCR
- 使用提交 SHA 和 latest 标记
在 CI/CD 中使用
GitHub Actions 工作流示例:
yaml
name: 使用 OpenPLC Runtime 测试
on: [push]
jobs:
test:
runs-on: ubuntu-latest
services:
openplc:
image: ghcr.io/autonomy-logic/openplc-runtime:latest
ports:
- 8443:8443
volumes:
- openplc-data:/var/run/runtime
steps:
- uses: actions/checkout@v2
- name: 测试 API
run: |
curl -k https://localhost:8443/api/ping