这个纯属玩花活,有兴趣的可以自己捣鼓一下
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
No replies yet
Featured Collection
Popular Ranking
Popular Events
这个纯属玩花活,有兴趣的可以自己捣鼓一下
docker 二进制包,这个不影响系统安装的docker
这个是麻烦了点,至于用处就是,镜像容器 docker都打包在一起,可以打包一些网页应用 懒人整合包 很适合 服务端整合包等
解决 特权端口问题 看豆包对话在最后面 https://www.doubao.com/thread/w917decadcc2d490b
服务文件和脚本.zip 整理好的脚本和服务配置文件
二进制包下载地址
脚本需要ROOT权限,这个主要是自动开放端口 还有就是创建网桥需要ROOT权限
如果不使用root可以打包成DEB,这样可以把网桥安装部分提取出来,在安装deb的时候脚本自动处理,以及开放端口