Docker - 离线+无root环境安装 docker-rootless

Docker - 离线+无root环境安装 docker-rootless

系统:麒麟v10 Linux  |  架构:arm64  |  权限:无root

一. 下载 Docker 静态二进制包

下面这二个都要下载:

二. 部署

在服务器上执行以下操作:

  1. 把下载好的文件复制到 /data/wtools
    • docker-rootless-extras-28.3.3.tgz
    • docker-28.3.3.tgz
  2. 解压:
    tar -xzvf /data/wtools/docker-rootless-extras-28.3.3.tgz -C /data/winstall
  3. 配置:
    cd /data/winstall
    mv docker-rootless-extras docker
    tar -xzvf /data/wtools/docker-28.3.3.tgz
    which newuidmap newgidmap
  4. 设置环境变量:
    echo 'export PATH="/data/winstall/docker:$PATH"' >> ~/.bashrc
    echo 'export DOCKER_HOST=unix:///data/winstall/docker/runtime/docker.sock' >> ~/.bashrc
    source ~/.bashrc

三. 生成脚本

1) 启动脚本

#!/bin/bash
# 基础路径
DOCKER_HOME=/data/winstall/docker

# 环境变量(固定死,免得每次都 export)
export PATH=$DOCKER_HOME:$PATH
export XDG_RUNTIME_DIR=$DOCKER_HOME/runtime
export DOCKERD_ROOTLESS_ROOT=$DOCKER_HOME/rootless
export DOCKER_HOST=unix://$DOCKERD_ROOTLESS_ROOT/docker.sock

mkdir -p $XDG_RUNTIME_DIR $DOCKERD_ROOTLESS_ROOT $DOCKER_HOME/data

# 后台启动并写日志
nohup $DOCKER_HOME/dockerd-rootless.sh --data-root=$DOCKER_HOME/data > $DOCKER_HOME/docker.log 2>&1 &
echo $! > $DOCKER_HOME/docker.pid
echo "Rootless Docker started, PID=$(cat $DOCKER_HOME/docker.pid)"

2) 停止脚本

#!/bin/bash
DOCKER_HOME=/data/winstall/docker
PID_FILE=$DOCKER_HOME/docker.pid

if [ ! -f "$PID_FILE" ]; then
  echo "❌ No PID file found at $PID_FILE. Is Docker running?"
  exit 1
fi

PID=$(cat $PID_FILE)

if ps -p $PID > /dev/null 2>&1; then
  echo "Stopping Rootless Docker (PID=$PID)..."
  kill $PID
  sleep 2
  if ps -p $PID > /dev/null 2>&1; then
    echo "Process still running, force killing..."
    kill -9 $PID
  fi
  rm -f $PID_FILE
  echo "✅ Rootless Docker stopped."
else
  echo "⚠️ No process found with PID=$PID. Removing stale PID file."
  rm -f $PID_FILE
fi

四. 设置权限

  1. 脚本权限:
    chmod +x /data/winstall/docker/start-docker.sh
    chmod +x /data/winstall/docker/stop-docker.sh
  2. 管理员权限(需要root):
    su - root
    echo "tailweb:100000:65536" | tee -a /etc/subuid
    echo "tailweb:100000:65536" | tee -a /etc/subgid
    exit

五. 启动

▶ 启动: /data/winstall/docker/start-docker.sh

⏹ 停止: /data/winstall/docker/stop-docker.sh

六. 切换网络驱动

docker-rootless 默认使用 vpnkit 网络驱动,该驱动会随运行时间持续占用内存。推荐替换为 slirp4netns,降低资源开销。

📊 三大网络驱动对比
🚀 吞吐量:
pasta(最优,高带宽场景)> slirp4netns(中等)> vpnkit(略低)
⏱ 网络延迟:
pasta(最低)< slirp4netns(适中)< vpnkit(略高)
💾 资源占用:
slirp4netns(最小,CPU/内存最优)< pasta(适中)< vpnkit(偏高)

查看 Linux 当前内存占用最高的进程

  ps -eo pid,user,comm,%mem,rss --sort=-rss | head -20

image

1. 下载部署 slirp4netns

ARM64 架构下载地址:https://github.com/rootless-containers/slirp4netns/releases

本次选用版本:v1.3.4,下载文件 slirp4netns-aarch64,并重命名为 slirp4netns

将文件上传至目录:/data/winstall/docker/

添加执行权限:

chmod +x /data/winstall/docker/slirp4netns

版本校验:

/data/winstall/docker/slirp4netns --version

正常输出参考:

slirp4netns version 1.3.4
commit: 129916bd8dc2b8eaf621671b3431799c827d689e
libslirp: 4.9.2
SLIRP_CONFIG_VERSION_MAX: 6
libseccomp: 2.5.3

检查文件路径:

which slirp4netns

预期返回:

/data/winstall/docker/slirp4netns

2. 修改启动脚本切换驱动

先停止当前运行的 Docker:

/data/winstall/docker/stop-docker.sh

编辑启动脚本 /data/winstall/docker/start-docker.sh,新增网络驱动环境变量,完整内容如下:

#!/bin/bash

DOCKER_HOME=/data/winstall/docker

export PATH=$DOCKER_HOME:$PATH
export XDG_RUNTIME_DIR=$DOCKER_HOME/runtime
export DOCKERD_ROOTLESS_ROOT=$DOCKER_HOME/rootless
export DOCKER_HOST=unix://$DOCKERD_ROOTLESS_ROOT/docker.sock

# 指定使用 slirp4netns 网络驱动
export DOCKERD_ROOTLESS_ROOTLESSKIT_NET=slirp4netns

mkdir -p "$XDG_RUNTIME_DIR"
mkdir -p "$DOCKERD_ROOTLESS_ROOT"
mkdir -p "$DOCKER_HOME/data"

echo "Using network driver: slirp4netns"

nohup "$DOCKER_HOME/dockerd-rootless.sh" --data-root="$DOCKER_HOME/data" > "$DOCKER_HOME/docker.log" 2>&1 &

echo $! > "$DOCKER_HOME/docker.pid"

sleep 3

echo "Rootless Docker started, PID=$(cat "$DOCKER_HOME/docker.pid")"

3. 重启并验证配置

重新启动 Docker:

/data/winstall/docker/start-docker.sh

启动日志参考:

Using network driver: slirp4netns
Rootless Docker started, PID=3785812

查看进程确认驱动生效:

ps -ef | grep rootlesskit | grep -v grep

进程输出参考:

tailweb  3785812       1  0 15:02 pts/0    00:00:00 rootlesskit --state-dir=/data/winstall/docker/runtime/dockerd-rootless --net=slirp4netns --mtu=1500 --slirp4netns-sandbox=auto --slirp4netns-seccomp=auto --disable-host-loopback --port-driver=builtin --copy-up=/etc --copy-up=/run --propagation=rslave /data/winstall/docker/dockerd-rootless.sh --data-root=/data/winstall/docker/data

✅ 若进程中包含 --net=slirp4netns,说明网络驱动切换成功。


end.

posted @ 2026-06-11 10:37  无心々菜  阅读(36)  评论(0)    收藏  举报