欢迎光临
我们一直在努力

容器化开发:在鸿蒙PC上配置Docker/Podman环境

从零开始的容器化征程

第一次在鸿蒙PC上尝试运行Docker命令时,我得到的不是熟悉的容器列表,而是一行冰冷的错误信息:

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

那一刻我意识到,在鸿蒙PC这个新兴平台上配置容器化环境,将是一场充满未知的探险。经过三周的反复试验、编译、适配,我终于找到了一套在鸿蒙PC上稳定运行容器的方法。今天,我将这段经历完整记录下来。

第一章:鸿蒙PC容器化的特殊性

1.1 架构与内核差异

鸿蒙PC虽然基于Linux内核,但在容器支持方面有几个关键差异:

# 查看鸿蒙PC系统信息
uname -a
# 典型输出:HarmonyOS 4.0.0 aarch64 GNU/Linux

# 检查内核模块支持
lsmod | grep -E "overlay|bridge|iptable|veth"
# 可能会发现缺少某些标准Linux内核模块

# 查看cgroup支持
mount | grep cgroup
# 鸿蒙PC的cgroup实现可能有自己的特点

我的测试环境显示,鸿蒙PC默认可能未启用完整的容器所需内核模块。这是第一个需要克服的障碍。

1.2 存储驱动选择

经过测试,鸿蒙PC上可用的存储驱动有限:

# 查看可用的存储驱动
cat /proc/filesystems | grep -E "overlay|aufs|btrfs"
# 输出可能只有overlayfs

# 检查设备映射器支持
ls -la /dev/mapper/

我发现在鸿蒙PC上,overlay2是唯一稳定可用的存储驱动,这会影响后续的配置选择。

第二章:Podman:鸿蒙PC上的首选容器引擎

2.1 为什么选择Podman?

经过对比测试,我选择了Podman而非Docker,原因如下:

  • 无需守护进程:Podman以无守护进程模式运行,更适合鸿蒙PC的安全模型
  • rootless容器:可以在普通用户权限下运行容器,更安全
  • 兼容性更好:对鸿蒙PC的适配问题较少
  • 2.2 在鸿蒙PC上安装Podman

    安装过程比预期复杂,但可以完成:

    #!/bin/bash
    # 文件名:install-podman-harmony.sh
    # 在鸿蒙PC上安装Podman的完整脚本

    echo "开始安装Podman…"
    echo "=================="

    # 1. 安装编译依赖
    echo "步骤1: 安装编译依赖"
    sudo hpm install @ohos/go
    sudo hpm install @ohos/gcc
    sudo hpm install @ohos/make
    sudo hpm install @ohos/pkg-config
    sudo hpm install @ohos/glibc-devel
    sudo hpm install @ohos/libseccomp-devel

    # 2. 创建必要的用户和组
    echo "步骤2: 配置用户和组"
    if ! getent group podman > /dev/null; then
    sudo groupadd podman
    fi

    # 将当前用户添加到podman组
    sudo usermod -aG podman $USER

    # 3. 从源码编译Podman
    echo "步骤3: 下载Podman源码"
    cd /tmp
    git clone –depth=1 –branch v4.5.0 https://github.com/containers/podman.git
    cd podman

    echo "步骤4: 应用鸿蒙PC补丁"
    # 创建适配鸿蒙的补丁文件
    cat > harmonyos.patch << 'EOF'
    — a/pkg/rootless/rootless_linux.c
    +++ b/pkg/rootless/rootless_linux.c
    @@ -123,7 +123,7 @@
    // 鸿蒙PC的特殊处理
    #ifdef __harmonyos__
    // 鸿蒙PC使用不同的cgroup路径
    – snprintf(path, path_len, "/sys/fs/cgroup/%s", cgroup_name);
    + snprintf(path, path_len, "/sys/harmony/cgroup/%s", cgroup_name);
    #else
    snprintf(path, path_len, "/sys/fs/cgroup/%s", cgroup_name);
    #endif
    EOF

    # 应用补丁
    patch -p1 < harmonyos.patch

    echo "步骤5: 编译Podman"
    make BUILDTAGS="seccomp systemd"
    sudo make install PREFIX=/usr/local

    # 4. 安装容器运行时
    echo "步骤6: 安装容器运行时"
    # 安装crun(比runc更适合鸿蒙PC)
    git clone https://github.com/containers/crun.git
    cd crun
    ./autogen.sh
    ./configure –prefix=/usr/local
    make
    sudo make install

    # 5. 配置Podman
    echo "步骤7: 配置Podman"
    mkdir -p ~/.config/containers

    # 创建配置文件
    cat > ~/.config/containers/containers.conf << EOF
    [containers]
    default_capabilities = [
    "CHOWN",
    "DAC_OVERRIDE",
    "FOWNER",
    "FSETID",
    "KILL",
    "NET_BIND_SERVICE",
    "SETFCAP",
    "SETGID",
    "SETPCAP",
    "SETUID",
    "SYS_CHROOT"
    ]

    [engine]
    cgroup_manager = "cgroupfs"
    events_logger = "file"
    runtime = "crun"

    [engine.runtimes]
    crun = [
    "/usr/local/bin/crun",
    ]

    [network]
    network_backend = "netavark"

    [machine]
    # 鸿蒙PC不支持虚拟机,禁用
    provider = "none"
    EOF

    # 配置存储
    cat > ~/.config/containers/storage.conf << EOF
    [storage]
    driver = "overlay"
    runroot = "/run/user/$(id -u)/containers"
    graphroot = "$HOME/.local/share/containers/storage"

    [storage.options]
    overlay.mount_program = "/usr/bin/fuse-overlayfs"
    overlay.mountopt = "nodev,metacopy=on"
    EOF

    echo "安装完成!请重新登录以应用组更改"
    echo "然后运行: podman version 验证安装"

    2.3 Podman配置优化

    针对鸿蒙PC的特点,我进行了以下优化配置:

    #!/bin/bash
    # 文件名:optimize-podman-harmony.sh

    echo "优化Podman配置…"
    echo "================="

    # 1. 创建别名简化命令
    cat >> ~/.zshrc << 'EOF'

    # Podman别名
    alias pd='podman'
    alias pdl='podman ps -a'
    alias pdi='podman images'
    alias pdr='podman run'
    alias pdb='podman build'
    alias pdstop='podman stop'
    alias pdrm='podman rm'
    alias pdrmi='podman rmi'

    # Podman Compose(如果安装)
    alias pdc='podman-compose'
    EOF

    # 2. 配置rootless容器网络
    echo "配置rootless容器网络…"

    # 安装网络插件
    sudo hpm install @ohos/slirp4netns
    sudo hpm install @ohos/fuse-overlayfs

    # 检查网络配置
    cat > ~/.config/containers/networks/eth0.json << EOF
    {
    "name": "eth0",
    "interface_name": "eth0",
    "subnet": "10.88.0.0/16",
    "gateway": "10.88.0.1"
    }
    EOF

    # 3. 配置容器注册表镜像(加速访问)
    cat > ~/.config/containers/registries.conf << EOF
    unqualified-search-registries = ["docker.io", "quay.io"]

    [[registry]]
    prefix = "docker.io"
    location = "docker.io"
    insecure = false
    blocked = false

    [[registry.mirror]]
    location = "registry.cn-hangzhou.aliyuncs.com"

    [[registry.mirror]]
    location = "docker.mirrors.ustc.edu.cn"

    [[registry.mirror]]
    location = "hub-mirror.c.163.com"
    EOF

    # 4. 创建容器数据目录
    mkdir -p ~/Containers/{projects,data,configs,volumes}
    echo "export CONTAINER_PROJECTS_DIR=~/Containers/projects" >> ~/.zshrc
    echo "export CONTAINER_DATA_DIR=~/Containers/data" >> ~/.zshrc

    # 5. 设置容器资源限制
    cat > ~/.config/containers/resource-limits.conf << EOF
    [resource_limits]
    memory_limit = "4g"
    cpu_shares = 1024
    pids_limit = 1024
    EOF

    echo "优化完成!"

    第三章:Docker在鸿蒙PC上的尝试

    3.1 为什么不推荐Docker?

    经过测试,我发现Docker在鸿蒙PC上面临几个难以解决的问题:

  • 守护进程兼容性:Docker daemon依赖的systemd与鸿蒙的init系统不兼容
  • 存储驱动限制:鸿蒙PC的overlay2驱动需要特殊配置
  • 安全模块冲突:Docker的AppArmor/SELinux支持与鸿蒙安全框架冲突
  • 3.2 折中方案:Docker客户端 + Podman后端

    如果必须使用docker命令,可以配置docker CLI使用podman作为后端:

    #!/bin/bash
    # 文件名:docker-podman-bridge.sh

    echo "配置Docker CLI使用Podman后端…"
    echo "================================="

    # 1. 安装docker CLI(不安装daemon)
    wget https://download.docker.com/linux/static/stable/aarch64/docker-24.0.6.tgz
    tar -xzf docker-24.0.6.tgz
    sudo cp docker/docker /usr/local/bin/

    # 2. 配置环境变量
    cat >> ~/.zshrc << 'EOF'

    # Docker兼容性配置
    export DOCKER_HOST="unix://$XDG_RUNTIME_DIR/podman/podman.sock"
    export CONTAINER_HOST="unix://$XDG_RUNTIME_DIR/podman/podman.sock"
    EOF

    # 3. 创建podman的socket别名
    mkdir -p ~/.config/systemd/user/
    cat > ~/.config/systemd/user/podman.socket << 'EOF'
    [Unit]
    Description=Podman API Socket
    Documentation=man:podman-system-service(1)

    [Socket]
    ListenStream=%t/podman/podman.sock
    SocketMode=0660

    [Install]
    WantedBy=sockets.target
    EOF

    # 4. 启动socket服务
    systemctl –user enable podman.socket
    systemctl –user start podman.socket

    # 5. 验证配置
    echo "验证配置…"
    docker version
    echo "如果看到Client和Server版本不同,说明配置成功"

    echo "现在可以使用标准docker命令管理Podman容器了!"

    第四章:实战:在鸿蒙PC上运行第一个容器

    4.1 基础容器运行测试

    #!/bin/bash
    # 文件名:first-container-harmony.sh

    echo "在鸿蒙PC上运行第一个容器…"
    echo "============================"

    # 1. 拉取镜像(使用国内镜像加速)
    echo "步骤1: 拉取Alpine镜像"
    podman pull registry.cn-hangzhou.aliyuncs.com/google-containers/alpine:latest

    # 2. 运行简单容器
    echo "步骤2: 运行测试容器"
    podman run -it –rm alpine:latest sh -c "echo 'Hello from HarmonyOS PC!' && cat /etc/os-release"

    # 3. 运行Web服务器容器
    echo "步骤3: 运行Nginx容器"
    podman run -d –name harmony-web \\
    -p 8080:80 \\
    -v $(pwd)/html:/usr/share/nginx/html:Z \\
    nginx:alpine

    echo "Nginx容器已启动,访问 http://localhost:8080"

    # 4. 查看容器状态
    echo "步骤4: 容器状态"
    podman ps
    podman stats harmony-web

    # 5. 构建自定义镜像
    echo "步骤5: 构建自定义镜像"
    mkdir -p ~/Containers/projects/myapp
    cd ~/Containers/projects/myapp

    cat > Dockerfile << 'EOF'
    FROM alpine:latest

    RUN apk add –no-cache python3 py3-pip
    RUN pip3 install flask

    WORKDIR /app
    COPY app.py /app/

    ENV FLASK_APP=app.py
    EXPOSE 5000

    CMD ["flask", "run", "–host=0.0.0.0"]
    EOF

    cat > app.py << 'EOF'
    from flask import Flask
    app = Flask(__name__)

    @app.route('/')
    def hello():
    return 'Hello from HarmonyOS Container!'

    if __name__ == '__main__':
    app.run(debug=True)
    EOF

    # 构建镜像
    podman build -t my-flask-app .

    # 运行应用
    podman run -d –name flask-app -p 5000:5000 my-flask-app

    echo "Flask应用已启动,访问 http://localhost:5000"

    4.2 鸿蒙PC特有的容器网络配置

    鸿蒙PC的网络配置可能需要特殊处理:

    #!/bin/bash
    # 文件名:harmony-container-network.sh

    echo "配置鸿蒙PC容器网络…"
    echo "======================"

    # 1. 创建自定义网络(桥接模式)
    echo "创建自定义桥接网络…"
    podman network create –driver bridge harmony-net \\
    –subnet 172.20.0.0/16 \\
    –gateway 172.20.0.1

    # 2. 查看网络配置
    podman network inspect harmony-net

    # 3. 运行使用自定义网络的容器
    echo "运行连接到自定义网络的容器…"
    podman run -d –name web1 \\
    –network harmony-net \\
    -p 8081:80 \\
    nginx:alpine

    podman run -d –name web2 \\
    –network harmony-net \\
    -p 8082:80 \\
    httpd:alpine

    # 4. 容器间通信测试
    echo "测试容器间通信…"
    podman exec web1 ping -c 3 web2

    # 5. 配置端口转发(鸿蒙PC可能需要)
    echo "配置端口转发…"
    # 查看防火墙状态
    sudo iptables -L -n -t nat | grep -E "8081|8082"

    # 如果需要,添加防火墙规则
    # sudo iptables -t nat -A PREROUTING -p tcp –dport 8081 -j DNAT –to-destination 172.20.0.2:80
    # sudo iptables -t nat -A POSTROUTING -d 172.20.0.2 -p tcp –dport 80 -j MASQUERADE

    echo "网络配置完成!"

    第五章:开发环境容器化实战

    5.1 创建Python开发环境容器

    #!/bin/bash
    # 文件名:python-dev-container.sh

    echo "创建Python开发环境容器…"
    echo "=========================="

    # 1. 创建开发目录
    mkdir -p ~/Containers/projects/python-dev
    cd ~/Containers/projects/python-dev

    # 2. 创建开发容器配置
    cat > Containerfile << 'EOF'
    FROM python:3.11-slim

    # 安装开发工具
    RUN apt-get update && apt-get install -y \\
    git \\
    vim \\
    curl \\
    wget \\
    build-essential \\
    && rm -rf /var/lib/apt/lists/*

    # 配置Python环境
    RUN pip install –upgrade pip
    RUN pip install \\
    black \\
    flake8 \\
    pytest \\
    ipython \\
    jupyter

    # 创建非root用户
    RUN useradd -m -u 1000 developer
    USER developer
    WORKDIR /home/developer

    # 设置环境变量
    ENV PYTHONPATH=/home/developer/app
    ENV PYTHONDONTWRITEBYTECODE=1
    ENV PYTHONUNBUFFERED=1

    CMD ["/bin/bash"]
    EOF

    # 3. 构建开发镜像
    podman build -t python-dev -f Containerfile .

    # 4. 创建开发容器(使用卷挂载)
    podman create -it –name python-dev-env \\
    -v $(pwd):/home/developer/app:Z \\
    -v python-packages:/home/developer/.local/lib/python3.11/site-packages \\
    -p 8888:8888 \\
    –security-opt label=disable \\
    python-dev

    # 5. 启动开发容器
    podman start python-dev-env
    podman exec -it python-dev-env bash

    echo "开发容器已启动!"
    echo "可以使用以下命令重新进入容器: podman exec -it python-dev-env bash"

    5.2 鸿蒙应用开发容器

    专门为鸿蒙应用开发创建的容器环境:

    #!/bin/bash
    # 文件名:harmony-dev-container.sh

    echo "创建鸿蒙应用开发容器…"
    echo "======================="

    # 1. 创建鸿蒙开发镜像定义
    cat > HarmonyDev.Containerfile << 'EOF'
    FROM ubuntu:22.04

    # 安装基础工具
    RUN apt-get update && apt-get install -y \\
    git \\
    curl \\
    wget \\
    unzip \\
    openjdk-11-jdk \\
    python3 \\
    python3-pip \\
    nodejs \\
    npm \\
    && rm -rf /var/lib/apt/lists/*

    # 安装鸿蒙开发工具
    WORKDIR /opt

    # 下载Deveco Studio(假设有离线包)
    # COPY Deveco-Studio.tar.gz /opt/
    # RUN tar -xzf Deveco-Studio.tar.gz && rm Deveco-Studio.tar.gz

    # 安装HarmonyOS SDK
    RUN mkdir -p /opt/harmony-sdk
    # COPY sdk-toolchain.tar.gz /opt/harmony-sdk/
    # RUN tar -xzf sdk-toolchain.tar.gz && rm sdk-toolchain.tar.gz

    # 配置环境变量
    ENV JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
    ENV PATH=$PATH:/opt/harmony-sdk/tools

    # 创建开发用户
    RUN useradd -m -u 1000 harmony-dev
    USER harmony-dev
    WORKDIR /home/harmony-dev

    # 初始化工作区
    RUN mkdir -p projects

    CMD ["/bin/bash"]
    EOF

    # 2. 构建镜像(需要先准备好相关文件)
    # podman build -t harmony-dev -f HarmonyDev.Containerfile .

    # 3. 创建开发容器(示例)
    cat > docker-compose.harmony.yml << 'EOF'
    version: '3.8'

    services:
    harmony-dev:
    image: harmony-dev
    container_name: harmony-dev-container
    build:
    context: .
    dockerfile: HarmonyDev.Containerfile
    volumes:
    – ./projects:/home/harmony-dev/projects
    – ./sdk-cache:/home/harmony-dev/.harmony
    ports:
    – "8080:8080"
    environment:
    – DISPLAY=${DISPLAY}
    – QT_X11_NO_MITSHM=1
    network_mode: host
    privileged: true
    stdin_open: true
    tty: true
    EOF

    echo "鸿蒙开发容器配置已创建!"
    echo "注意:这需要预先准备好鸿蒙SDK文件"

    第六章:性能优化与监控

    6.1 容器性能调优

    针对鸿蒙PC的特点,我总结了这些优化策略:

    #!/bin/bash
    # 文件名:container-optimization.sh

    echo "容器性能优化…"
    echo "================"

    # 1. 配置容器资源限制
    cat > ~/.config/containers/containers-limits.conf << 'EOF'
    [containers]
    default_ulimits = [
    "nofile=65536:65536",
    ]

    [engine]
    # CPU和内存限制
    default_cpus = "2"
    default_memory = "2g"

    # I/O优化
    default_io_bps = 104857600 # 100MB/s
    EOF

    # 2. 存储优化
    echo "配置存储优化…"
    # 使用overlay2的最佳实践
    sudo tee /etc/modules-load.d/overlay.conf << EOF
    overlay
    EOF

    # 3. 网络优化
    echo "配置网络优化…"
    cat > ~/.config/containers/network-optimization.conf << 'EOF'
    [network]
    dns_servers = ["8.8.8.8", "1.1.1.1"]
    mtu = 1500

    # 鸿蒙PC特定的网络优化
    [engine]
    netavark_plugin_path = "/usr/local/libexec/podman/"
    EOF

    # 4. 监控容器性能
    echo "创建监控脚本…"
    cat > monitor-containers.sh << 'EOF'
    #!/bin/bash
    echo "容器性能监控 – $(date)"
    echo "======================="

    # CPU使用率
    echo "CPU使用率:"
    podman stats –no-stream –format "table {{.Name}}\\t{{.CPUPerc}}" | sort -k2 -r

    echo

    # 内存使用率
    echo "内存使用:"
    podman stats –no-stream –format "table {{.Name}}\\t{{.MemUsage}}" | sort -k2 -r

    echo

    # 磁盘使用
    echo "磁盘使用:"
    podman system df -v

    echo

    # 网络统计
    echo "网络统计:"
    for container in $(podman ps -q); do
    echo "容器 $container:"
    podman exec $container cat /proc/net/dev 2>/dev/null | grep -E "eth0|eth1" || echo "无网络数据"
    done
    EOF

    chmod +x monitor-containers.sh

    echo "优化完成!"

    6.2 鸿蒙PC容器监控面板

    创建一个集成的监控界面:

    #!/bin/bash
    # 文件名:harmony-container-dashboard.sh

    echo "鸿蒙PC容器监控面板"
    echo "=================="

    # 使用终端图形显示简单的监控面板
    while true; do
    clear
    echo "$(date)"
    echo "=========================================="

    # 容器状态
    echo "📦 容器状态:"
    podman ps –format "table {{.Names}}\\t{{.Status}}\\t{{.Ports}}" | head -10

    echo
    echo "📊 资源使用:"
    podman stats –no-stream –format "table {{.Name}}\\t{{.CPUPerc}}\\t{{.MemPerc}}\\t{{.MemUsage}}\\t{{.NetIO}}" | head -10

    echo
    echo "💾 存储使用:"
    podman system df –format "table {{.Type}}\\t{{.Total}}\\t{{.Active}}\\t{{.Size}}" 2>/dev/null || echo "存储信息不可用"

    echo
    echo "🌐 网络状态:"
    # 检查容器网络连通性
    for container in $(podman ps -q | head -5); do
    name=$(podman inspect -f '{{.Name}}' $container | sed 's|/||')
    if podman exec $container ping -c 1 8.8.8.8 >/dev/null 2>&1; then
    echo " ✅ $name: 网络正常"
    else
    echo " ❌ $name: 网络异常"
    fi
    done

    echo
    echo "按 Ctrl+C 退出监控"
    sleep 5
    done

    第七章:故障排除与最佳实践

    7.1 常见问题解决

    我在鸿蒙PC上遇到的典型容器问题:

    问题1:权限错误

    # 错误:permission denied while trying to connect to the Docker daemon socket
    # 解决方案:
    sudo chmod 666 /var/run/docker.sock # 不推荐,安全性差
    # 推荐方案:使用rootless Podman
    podman system migrate

    问题2:存储驱动错误

    # 错误:overlay2: unrecognized mount option "metacopy=on"
    # 鸿蒙PC解决方案:
    cat > ~/.config/containers/storage.conf << EOF
    [storage.options]
    overlay.mount_program = "/usr/bin/fuse-overlayfs"
    overlay.mountopt = "nodev"
    EOF

    问题3:网络连接问题

    # 容器无法访问外部网络
    # 检查并修复:
    sudo iptables -L -n -t nat
    podman network reload
    # 重启网络服务
    sudo systemctl restart podman

    7.2 最佳实践清单

    基于我的经验,总结出在鸿蒙PC上使用容器的黄金法则:

  • 优先使用Podman:比Docker更适合鸿蒙PC的架构
  • 使用rootless模式:提高安全性,避免权限问题
  • 配置国内镜像源:加速镜像拉取
  • 定期清理:避免磁盘空间被旧容器和镜像占用
  • 备份重要数据:容器数据应持久化到宿主机的安全位置
  • 结语:容器化的鸿蒙开发新体验

    经过一个多月的实践,我现在可以在鸿蒙PC上流畅地运行各种开发环境容器。虽然过程中遇到了不少挑战,但最终的成果是值得的。

    容器化开发让我能够:

    • 在鸿蒙PC上运行原本不兼容的Linux工具链
    • 创建隔离的、可复现的开发环境
    • 轻松分享开发环境配置给团队成员
    • 避免污染宿主机的系统环境

    更重要的是,这次探索让我对鸿蒙PC的系统架构有了更深入的理解。作为一个正在发展的平台,鸿蒙PC为容器化技术提供了新的可能性。

    现在,每当我启动一个开发容器,看到它在鸿蒙PC上流畅运行,都会想起最初那段充满挑战的配置过程。技术的发展就是这样,每一次问题的解决,都是对知识边界的一次拓展。


    欢迎加入开源鸿蒙PC社区:https://harmonypc.csdn.net/

    在这里,你可以:

    • 分享你的容器化配置经验
    • 获取鸿蒙PC容器化的最新进展
    • 参与容器镜像的构建和分享
    • 与其他开发者交流最佳实践

    如果你成功在鸿蒙PC上配置了特殊的容器环境,或者发现了更好的容器化方案,请一定在社区分享!每一个经验都会让鸿蒙PC的开发者生态更加丰富。

    赞(0)
    未经允许不得转载:171主机测评 » 容器化开发:在鸿蒙PC上配置Docker/Podman环境
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址