[deepin exploration] docker二进制包隔离运行 容器 好处是不影响系统本身安装的docke
Tofloor
poster avatar
酷谷的谷子
deepin
a day ago
Author

这个纯属玩花活,有兴趣的可以自己捣鼓一下

docker 二进制包,这个不影响系统安装的docker

这个是麻烦了点,至于用处就是,镜像容器 docker都打包在一起,可以打包一些网页应用 懒人整合包 很适合 服务端整合包等

解决 特权端口问题 看豆包对话在最后面 https://www.doubao.com/thread/w917decadcc2d490b

服务文件和脚本.zip 整理好的脚本和服务配置文件

二进制包下载地址

https://download.docker.com/linux/static/stable/x86_64/docker-25.0.0.tgz

脚本需要ROOT权限,这个主要是自动开放端口 还有就是创建网桥需要ROOT权限

如果不使用root可以打包成DEB,这样可以把网桥安装部分提取出来,在安装deb的时候脚本自动处理,以及开放端口

#!/bin/bash
# 手动版Docker启动脚本(与系统服务版隔离)
# 二进制路径: /home/i8520/DOCKE_DATA
# 数据目录: /home/i8520/DOCKE_DATA/images
# 配置文件: /home/i8520/DOCKE_DATA/json/daemon.json
# 专用套接字: /home/i8520/DOCKE_DATA/docker.sock(避免冲突)

# 定义隔离参数(核心:与系统版完全不同的路径)
DOCKER_BIN_DIR="/home/i8520/DOCKE_DATA"
DATA_ROOT="/home/i8520/DOCKE_DATA/images"
CONFIG_FILE="/home/i8520/DOCKE_DATA/json/daemon.json"
DOCKER_SOCK="/home/i8520/DOCKE_DATA/docker.sock"  # 独立套接字
LOG_FILE="$DOCKER_BIN_DIR/docker_manual.log"
DOCKER_DAEMON="$DOCKER_BIN_DIR/dockerd"
DOCKER_CLIENT="$DOCKER_BIN_DIR/docker"  # 手动版客户端
PID_FILE="$DOCKER_BIN_DIR/docker.pid"  # 自定义PID文件路径
PID_FILE_LOG="$DOCKER_BIN_DIR/PID_FILE_LOG.log"
BRIDGE_NAME="docker0_manual"  # 网桥名称
BRIDGE_IP="172.88.0.1/16"     # 网桥IP及子网(与容器IP池匹配)


#创建网桥
create_bridge() {
    # 检查网桥是否已存在
    if ip link show "$BRIDGE_NAME" >/dev/null 2>&1; then
        echo "网桥 $BRIDGE_NAME 已存在,无需创建"
        return 0
    fi

    echo "创建网桥 $BRIDGE_NAME(IP: $BRIDGE_IP)..."
    # 创建网桥(普通用户可能需要cap_net_admin权限,若失败需手动授权)
    if ! ip link add name "$BRIDGE_NAME" type bridge; then
        echo "错误:创建网桥失败,可能需要网络权限(尝试执行: sudo setcap cap_net_admin+eip $DOCKER_DAEMON)"
        exit 1
    fi

    # 配置网桥IP
    ip addr add "$BRIDGE_IP" dev "$BRIDGE_NAME"
    # 启动网桥
    ip link set dev "$BRIDGE_NAME" up

    # 检查网桥状态
    if ip link show "$BRIDGE_NAME" | grep "UP" >/dev/null; then
        echo "网桥 $BRIDGE_NAME 创建成功"
    else
        echo "错误:网桥 $BRIDGE_NAME 启动失败"
        ip link delete "$BRIDGE_NAME"  # 清理失败的网桥
        exit 1
    fi
}
create_bridge



# 检查二进制文件
check_bin() {
    if [ ! -f "$DOCKER_DAEMON" ] || [ ! -f "$DOCKER_CLIENT" ]; then
        echo "错误:未找到Docker二进制文件(dockerd或docker)"
        exit 1
    fi
}

# 检查配置文件,若不存在则创建基础配置
check_config() {
    if [ ! -f "$CONFIG_FILE" ]; then
        echo "警告:未找到配置文件,创建默认隔离配置..."
        mkdir -p "$(dirname $CONFIG_FILE)"
        cat > "$CONFIG_FILE" </dev/null; then
        echo "手动版Docker已运行(套接字:$DOCKER_SOCK)"
        return 0
    fi

    # 准备目录
    mkdir -p "$DATA_ROOT"
    check_bin
    check_config

    # 启动命令(带隔离参数)
    echo "启动手动版Docker..."
    sudo nohup "$DOCKER_DAEMON" \
        --config-file "$CONFIG_FILE" \
        --data-root "$DATA_ROOT" \
        --pidfile "$PID_FILE" \
        --host "unix://$DOCKER_SOCK" > "$LOG_FILE" 2>&1 & \
          # 彻底脱离终端,避免阻塞
    # 等待启动
    sleep 3
    if pgrep -f "$DOCKER_DAEMON.*$DOCKER_SOCK" >/dev/null; then
  
        reset
        echo "OK"
        echo -e "\n启动成功!客户端连接命令:\nexport DOCKER_HOST=unix://$DOCKER_SOCK\nsudo $DOCKER_CLIENT info"
    else
        echo "启动失败,查看日志:$LOG_FILE"
        exit 1
    fi
}

# 停止手动版Docker
stop() {
    if ! pgrep -f "$DOCKER_DAEMON.*$DOCKER_SOCK" >/dev/null; then
        echo "手动版Docker未运行"
        return 0
    fi

    echo "停止手动版Docker..."
    sudo pkill -f "$DOCKER_DAEMON.*$DOCKER_SOCK"
    sleep 2
    if ! pgrep -f "$DOCKER_DAEMON.*$DOCKER_SOCK" >/dev/null; then
        echo "已停止"
    else
        sudo pkill -9 -f "$DOCKER_DAEMON.*$DOCKER_SOCK"
        echo "已强制停止"
    fi
}

# 查看状态
status() {
    if pgrep -f "$DOCKER_DAEMON.*$DOCKER_SOCK" >/dev/null; then
        echo "手动版Docker运行中(PID: $(pgrep -f "$DOCKER_DAEMON.*$DOCKER_SOCK"))"
        echo "套接字路径:$DOCKER_SOCK"
    else
        echo "手动版Docker未运行"
    fi
}

# 帮助信息
usage() {
    echo "用法:$0 [start|stop|status|restart]"
    echo "  start   - 启动手动版Docker(隔离模式)"
    echo "  stop    - 停止手动版Docker"
    echo "  status  - 查看手动版Docker状态"
    echo "  restart - 重启手动版Docker"
    exit 1
}

# 主逻辑
case "$1" in
    start) start ;;
    stop) stop ;;
    status) status ;;
    restart) stop && start ;;
    *) usage ;;
esac

Reply Favorite View the author
All Replies

No replies yet