openplc runtimev4 Docker 部署

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 的拉取请求
  • 手动工作流调度

流程:

  1. 构建多架构镜像
  2. 运行测试
  3. 推送到 GHCR
  4. 使用提交 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

相关文档

相关推荐
爱装代码的小瓶子5 小时前
【C++与Linux基础】进程间通讯方式:匿名管道
android·c++·后端
CoderCodingNo5 小时前
【GESP】C++ 二级真题解析,[2025年12月]第一题环保能量球
开发语言·c++·算法
LYOBOYI1235 小时前
qtcpSocket详解
c++·qt
REDcker5 小时前
gRPC完整文档
服务器·网络·c++·网络协议·grpc
陈桴浮海5 小时前
【Linux&Ansible】学习笔记合集三
linux·运维·云原生·ansible
小Pawn爷5 小时前
1.Docker基础
运维·docker·容器
chinesegf5 小时前
清理docker残留镜像images
运维·docker·容器
江湖有缘5 小时前
基于华为openEuler系统部署Gitblit服务器
运维·服务器·华为
EnglishJun5 小时前
Linux系统编程(二)---学习Linux系统函数
linux·运维·学习