3. 容器化运行时部署

任务目标

在工业边缘网关(x86_64 / ARM64 Linux)上完成容器化运行时的最小可用部署,使网关能够拉取并运行一个验证用容器,为后续边缘应用以容器方式交付建立基础。本案例聚焦于运行时安装与基本验证,不涉及镜像仓库搭建、K8s集群或容器编排。

环境与依赖

  • 操作系统:Ubuntu 22.04 LTS(内核 ≥ 5.15)或 Debian 12,支持 systemd
  • 架构:amd64 或 arm64
  • 网络:可访问 Docker Hub 或可用的镜像仓库
  • 权限:root 或具有 sudo 权限的用户

实现方案

采用 Docker Engine 作为容器运行时,通过官方脚本安装并由 systemd 管理。安装完成后使用 hello-world 镜像验证拉取与运行链路,再运行一个轻量 HTTP 服务容器验证端口映射与进程隔离是否正常。

关键完整代码

#!/bin/bash
# deploy_container_runtime.sh
# 用途:在 Ubuntu/Debian 边缘网关上安装并验证 Docker Engine
# 用法:sudo bash deploy_container_runtime.sh

set -euo pipefail

echo "=== [1/4] 安装依赖包 ==="
apt-get update
apt-get install -y \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

echo "=== [2/4] 添加 Docker 官方 GPG 密钥与仓库 ==="
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/$(. /etc/os-release && echo "$ID")/gpg | \
    gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg

echo \
    "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
    https://download.docker.com/linux/$(. /etc/os-release && echo "$ID") \
    $(lsb_release -cs) stable" | \
    tee /etc/apt/sources.list.d/docker.list > /dev/null

echo "=== [3/4] 安装 Docker Engine ==="
apt-get update
apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

echo "=== [4/4] 启用并启动服务 ==="
systemctl enable docker
systemctl start docker

echo "=== 安装完成,开始验证 ==="
# 验证 1:运行时版本
docker version --format 'Client: {{.Client.Version}} | Server: {{.Server.Version}}'

# 验证 2:拉取并运行 hello-world(验证拉取/运行链路)
docker run --rm hello-world

# 验证 3:运行 HTTP 容器并测试端口映射(验证网络与进程隔离)
docker run -d --name test-nginx -p 8080:80 nginx:alpine
sleep 2
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:8080)
echo "HTTP 测试返回码: $HTTP_CODE"

# 清理测试容器
docker rm -f test-nginx

echo "=== 全部验证通过 ==="

运行方式

# 将脚本保存后执行
sudo bash deploy_container_runtime.sh

验证方法与判定标准

  • 版本输出:docker version 同时显示 Client 和 Server 版本号,说明守护进程已正常运行。
  • hello-world 容器:终端输出 “Hello from Docker!” 信息,说明镜像拉取、容器创建与运行链路正常。
  • HTTP 容器测试:curl 返回码为 200,说明容器端口映射与网络隔离正常。
  • 服务持久化:执行 systemctl is-enabled docker 返回 enabled,确保网关重启后 Docker 自动启动。

常见问题

  • 安装源连接超时:若网关处于离线或受限网络环境,需提前配置 HTTP 代理或使用内网镜像源替换脚本中的 download.docker.com 地址。
  • arm64 设备拉取 x86 镜像:确认镜像支持多架构(如 nginx:alpine 支持 arm64),否则需在 Dockerfile 中指定 --platform 或改用对应架构镜像。
  • iptables 冲突:若网关已运行其他防火墙管理工具,Docker 默认修改 iptables 可能被覆盖,需在 /etc/docker/daemon.json 中设置 "iptables": false 并手动配置规则,或调整防火墙策略允许 Docker 网桥流量。