3. 工业容器基础与Docker核心操作

在工业网关、机器视觉控制器、边缘计算盒这类设备上部署应用,最怕的是“换一台机器就跑不起来”。容器技术解决的正是这个问题:把应用及其依赖打包成一个标准单元,在任意支持容器的设备上以一致方式运行。Docker 是目前工业边缘场景中最常用的容器引擎,本节围绕它的五个核心概念——镜像、容器、仓库、Dockerfile、数据卷与网络模式——展开,并给出在工业网关上的安装与验证方法。

镜像、容器与仓库:三层关系

镜像(Image)是只读的模板,包含文件系统、运行时、库和配置;容器(Container)是镜像的一次运行实例,在镜像之上加了一层可写层;仓库(Registry)是存放和分发镜像的服务,如 Docker Hub、Harbor 或企业内网私有仓库。三者关系可以概括为:仓库存储镜像,镜像启动容器,容器运行结束后可写层被丢弃,镜像本身不变。

工业现场常用“基础镜像 + 应用层”的分层策略。例如以 arm64v8/ubuntu:22.04 为基础,叠加 Python 运行时、采集程序与配置文件。分层带来的好处是:多个应用共享同一基础层,网关存储占用小;升级应用只需替换上层,不必重传整个系统。

镜像—容器—仓库关系与工业网关部署链 镜像仓库 Registry gateway-app:v1.2 arm64v8/ubuntu:22.04 docker pull 镜像 Image(只读) 应用层 + 依赖 基础镜像层 分层共享,不可修改 docker run 容器 Container(运行) 可写层(临时) 镜像层(只读) 进程隔离,独立网络/文件系统 工业网关上的容器运行要素 数据卷 Volume /data 采集数据持久化 容器删除数据仍在 网络模式 bridge / host / none 端口映射 -p 8080:80 Dockerfile FROM / COPY / RUN 构建可复现镜像 验证手段 docker ps / logs / exec 健康检查与端口探测

Dockerfile:把部署过程写成可复现的脚本

Dockerfile 是构建镜像的说明书,每条指令生成一层。工业场景中常见的写法如下,假设网关为 ARM64 架构,应用是一个 Modbus 采集程序:

FROM arm64v8/python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY collector.py config.yaml ./
ENV MODBUS_HOST=192.168.1.10
EXPOSE 8080
CMD ["python", "collector.py"]

关键点:FROM 必须与网关 CPU 架构匹配,否则镜像无法运行;COPY requirements.txt 单独一层,可在依赖不变时复用缓存,加快构建;ENV 提供默认参数,运行时可用 -e 覆盖;EXPOSE 只是声明,真正映射端口靠 docker run -p。构建命令为 docker build -t gateway-app:v1.2 .,其中 -t 指定镜像名与标签,末尾的 . 表示构建上下文为当前目录。

数据卷与网络模式:让容器适配工业现场

容器默认的文件系统是临时的,删除容器数据即丢失。工业采集数据、日志、配置需要持久化,应使用数据卷。两种常用方式:命名卷 -v gateway-data:/data,由 Docker 管理存储位置;绑定挂载 -v /opt/gateway/config:/app/config,直接映射宿主机目录,便于现场修改配置。前者适合数据库和采集数据,后者适合需要人工编辑的配置文件。

网络模式决定容器如何与外部通信。默认 bridge 模式为容器分配独立 IP,通过 -p 宿主机端口:容器端口 暴露服务,例如 -p 8080:80 表示网关 8080 端口转发到容器 80 端口。host 模式让容器直接使用宿主机网络栈,适合需要访问现场总线或对延迟敏感的场景,但端口会与宿主机冲突。none 模式无网络,用于纯计算或安全隔离任务。工业网关通常只有一个管理网口,建议默认使用 bridge 并显式映射必要端口,减少对现场网络的干扰。

在工业网关上安装与验证

以常见的 ARM64 工业网关(Ubuntu 22.04 系统)为例,安装步骤如下:

  1. 更新软件源并安装依赖:sudo apt update && sudo apt install -y ca-certificates curl。
  2. 添加 Docker 官方 GPG 密钥与软件源,然后执行 sudo apt install -y docker-ce docker-ce-cli containerd.io。
  3. 将当前用户加入 docker 组:sudo usermod -aG docker $USER,重新登录后生效,避免每条命令都加 sudo。
  4. 启动并设置开机自启:sudo systemctl enable --now docker。

安装完成后需要验证。先执行 docker version,确认 Client 与 Server 均正常输出,Server 部分能看到 Architecture: arm64。再执行 docker run --rm hello-world,若输出 “Hello from Docker!” 说明镜像拉取、容器创建与运行链路全部打通。随后可运行实际应用:

docker run -d --name gw-collector \
  -p 8080:8080 \
  -v /opt/gateway/data:/data \
  -e MODBUS_HOST=192.168.1.10 \
  --restart unless-stopped \
  gateway-app:v1.2

参数含义:-d 后台运行;--name 指定容器名便于管理;-p 映射端口;-v 挂载数据卷;-e 注入环境变量;--restart unless-stopped 让容器在网关重启后自动恢复,这对无人值守的现场设备尤为重要。

验证运行状态时,依次检查:docker ps 确认容器处于 Up 状态;docker logs gw-collector 查看采集程序是否正常连接 Modbus 设备;docker exec -it gw-collector sh 进入容器检查配置文件与网络连通性;在网关本机执行 curl http://localhost:8080/health 或从同网段 PC 访问网关 IP 的 8080 端口,确认服务可达。若容器反复重启,优先查看日志中的架构不匹配、端口占用或设备地址错误提示。

工业网关资源有限,建议为容器设置资源上限,例如 --memory 512m --cpus 1.0,避免单个应用占满 CPU 或内存影响其他任务。同时定期执行 docker system prune 清理无用镜像与停止的容器,释放存储空间。