BZGOGO
V2EX  ›  Docker

🐳一键转换 Docker Run 命令和 Docker Compose 配置,实现"一容器一目录"的标准化管理。

  •  
  •   BZGOGO · 1 day ago · 532 views

    Compose Tool 🐳

    Docker Compose 配置转换工具 ->点击打开 Github 项目地址

    一键转换 Docker Run 命令和 Docker Compose 配置,实现"一容器一目录"的标准化管理。


    🖼️ 界面预览

    主界面

    🔗 在线演示Compose Tool | Docker 配置转换工具


    🏗️ 核心哲学:图纸与材料同屋存放

    问题

    装了几个 Docker 项目后,各种映射卷零零散散躺在宿主机的各个目录里,极其混乱:

    /root/data/          ← 有些项目装这里
    /home/user/docker/   ← 有些装这里
    /var/lib/myapp/      ← 有些装这里
    /tmp/test/           ← 还有些随手放的
    

    解决方案

    本工具的目标是把所有 Docker 项目的"图纸"( compose.yaml 配置文件)和"材料"(映射的数据目录)统一存放:

    /opt/docker/                        ← 统一大目录
    ├── vaultwarden/                    ← 每个容器一个子目录
    │   ├── compose.yaml                ← 图纸(配置文件)
    │   └── vw-data/                    ← 材料(容器数据)
    ├── portainer/
    │   ├── compose.yaml
    │   └── portainer-data/
    ├── compose-tool/                   ← 本项目自身也遵循此规范
    │   └── compose.yaml
    └── nextcloud/
        ├── compose.yaml
        └── data/
    

    好处

    • 备份极简:备份整个 /opt/docker 目录即可备份所有项目的配置和数据
    • 迁移无痛:打包 → 上传到新服务器 → 解压 → 一键启动,完整恢复
    • 管理清晰:进入任意子目录执行 docker compose up -d 即可启动对应项目

    本工具默认路径为 /opt/docker/{container_name},可通过 VOLUME_PREFIX 环境变量自定义。


    ✨ 核心特性

    特性 说明
    🔐 100% 隐私安全 纯前端实现,所有数据仅在浏览器本地处理,绝不上传
    🎯 自动路径规范化 自动清理 $(pwd)`、`${HOME}$PWD 等所有 Shell 变量
    🛡️ 系统路径白名单 45+ 系统级挂载(如 /var/run/docker.sock)自动识别保留
    🔄 双模式支持 同时支持 Docker Run 命令和 Docker Compose YAML 配置转换
    📦 一键部署命令 转换结果自动生成完整部署命令,复制粘贴即可执行
    📱 响应式设计 完美适配桌面端和移动端

    🚀 快速部署

    方式一:Docker Run (不推荐)

    docker run -d \
      --name compose-tool \
      --restart unless-stopped \
      -p 6688:80 \
      -e VOLUME_PREFIX=/opt/docker/{container_name} \
      ghcr.io/beacherz/compose-tool:latest
    

    方式二:Docker Compose (推荐,符合本工具理念)

    💡 自定义路径说明: 如果不想使用默认的 /opt/docker/ 路径,请在执行前将下面命令中所有的 /opt/docker/ 整体替换为你规划的路径(包括 mkdir 、cd 以及环境变量中的路径)。

    mkdir -p /opt/docker/compose-tool && cd /opt/docker/compose-tool && \
    cat > compose.yaml << 'EOF'
    services:
      compose-tool:
        image: ghcr.io/beacherz/compose-tool:latest
        container_name: compose-tool
        restart: unless-stopped
        ports:
          - "6688:80"  # 左边可改为你想要的端口
        environment:
          - TZ=Asia/Shanghai  # 时区
          - VOLUME_PREFIX=/opt/docker/{container_name}  # 默认卷映射路径,{container_name} 会自动替换为容器名
    EOF
    docker compose up -d
    

    访问:http://服务器 IP:6688

    关于 HTTPS:本工具为纯前端静态页面,所有数据在浏览器本地处理,HTTP 访问完全安全。

    如需 HTTPS ,可在前面套一层反向代理(如 Nginx Proxy Manager / Caddy / Traefik ),

    将域名指向 服务器 IP:6688 即可。

    常用管理命令

    cd /opt/docker/compose-tool      # 进入项目目录
    docker compose logs -f            # 查看运行日志
    docker compose pull               # 拉取最新镜像
    docker compose up -d              # 重新部署(更新后执行)
    docker compose down               # 停止并删除容器
    

    💡 本工具是纯静态网页,无数据持久化需求,无需挂载卷。


    🎯 使用流程

    1. 粘贴命令 - 从官方文档或 GitHub 复制 Docker Run 命令或 Compose 配置
    2. 点击转换 - 工具自动清理 Shell 变量、转换路径、添加标准配置
    3. 一键部署 - 转换结果分为两部分,各有独立复制按钮:
      • 🚀 一键部署命令:包含目录创建、文件生成、容器启动的完整命令
      • 📄 compose.yaml 内容:纯 YAML 配置,适合手动编辑

    📖 转换示例

    示例 1:Docker Run → Compose

    输入

    docker run -d --name vaultwarden \
      -p 8000:80 \
      -v $(pwd)/vw-data:/data \
      -e DOMAIN=https://vw.example.com \
      vaultwarden/server:latest
    

    输出(一键部署命令)

    mkdir -p /opt/docker/vaultwarden && cd /opt/docker/vaultwarden && \
    cat > compose.yaml << 'EOF'
    services:
      vaultwarden:
        image: vaultwarden/server:latest
        container_name: vaultwarden
        ports:
          - "8000:80"
        volumes:
          - "/opt/docker/vaultwarden/vw-data:/data"
        environment:
          - "DOMAIN=https://vw.example.com"
        restart: unless-stopped
    EOF
    docker compose up -d
    

    示例 2:官方 Compose → 标准化路径

    输入

    services:
      vaultwarden:
        image: vaultwarden/server:latest
        volumes:
          - ./vw-data:/data
        ports:
          - 8000:80
    

    输出

    mkdir -p /opt/docker/vaultwarden && cd /opt/docker/vaultwarden && \
    cat > compose.yaml << 'EOF'
    services:
      vaultwarden:
        image: vaultwarden/server:latest
        volumes:
          - "/opt/docker/vaultwarden/vw-data:/data"
        ports:
          - "8000:80"
        restart: unless-stopped
    EOF
    docker compose up -d
    

    示例 3:系统路径自动保留

    输入

    docker run -d \
      -v /var/run/docker.sock:/var/run/docker.sock \
      -v ~/portainer-data:/data \
      --name portainer \
      portainer/portainer-ce
    

    输出

    mkdir -p /opt/docker/portainer && cd /opt/docker/portainer && \
    cat > compose.yaml << 'EOF'
    services:
      portainer:
        image: portainer/portainer-ce
        container_name: portainer
        volumes:
          - "/var/run/docker.sock:/var/run/docker.sock"
          - "/opt/docker/portainer/portainer-data:/data"
        restart: unless-stopped
    EOF
    docker compose up -d
    

    /var/run/docker.sock 识别为系统路径,自动保留不转换。


    💾 备份与迁移

    备份单个项目

    # 备份 vaultwarden 项目(配置 + 数据)
    tar -czf /root/vaultwarden-backup.tar.gz /opt/docker/vaultwarden
    

    压缩包位置/root/vaultwarden-backup.tar.gz


    备份所有项目

    # 一次性备份所有 Docker 项目
    tar -czf /root/docker-all-backup.tar.gz /opt/docker
    

    压缩包位置/root/docker-all-backup.tar.gz


    下载备份到本地电脑

    使用 FileZillaWinSCP 等 FTP 工具:

    1. 连接到服务器(填写 IP 、用户名 root、密码)
    2. 进入 /root/ 目录
    3. 下载 .tar.gz 压缩包到本地电脑

    恢复单个项目

    # 在新服务器上传压缩包到`/root/` 目录后执行
    tar -xzf /root/vaultwarden-backup.tar.gz -C /
    
    # 进入目录启动容器
    cd /opt/docker/vaultwarden
    docker compose up -d
    

    迁移所有项目到新服务器

    第 1 步:新服务器安装 Docker

    curl -fsSL https://get.docker.com | sh
    

    第 2 步:上传压缩包到新服务器

    使用 FTP 工具将本地的 docker-all-backup.tar.gz 上传到新服务器的 /root/ 目录。

    第 3 步:解压并还原目录结构

    # 在新服务器执行
    tar -xzf /root/docker-all-backup.tar.gz -C /
    

    解压后目录结构自动恢复:

    /opt/docker/
    ├── vaultwarden/
    │   ├── compose.yaml
    │   └── vw-data/
    ├── portainer/
    │   ├── compose.yaml
    │   └── portainer-data/
    ├── compose-tool/
    │   └── compose.yaml
    └── ...
    

    第 4 步:一键启动所有容器

    for dir in /opt/docker/*/; do
      echo "正在启动: $dir"
      (cd "$dir" && docker compose up -d)
    done
    

    🔧 高级配置

    修改默认卷映射路径

    编辑服务器上的 compose.yaml,修改 VOLUME_PREFIX 环境变量:

    - VOLUME_PREFIX=/你的新路径/{container_name}
    

    重启容器:

    cd /opt/docker/compose-tool
    docker compose up -d --force-recreate
    

    自定义端口

    编辑 compose.yaml

    ports:
      - "你的端口:80"
    

    更新到最新版本

    cd /opt/docker/compose-tool
    docker compose pull
    docker compose up -d
    

    🛡️ 系统路径白名单

    以下路径自动识别保留,不做转换:

    分类 路径示例
    Docker /var/run/docker.sock/var/lib/docker/usr/bin/docker
    内核/设备 /proc/sys/dev/boot/lib/modules
    系统配置 /etc/localtime/etc/hosts/etc/resolv.conf/etc/timezone
    SSL 证书 /etc/ssl/etc/pki/etc/ca-certificates
    用户/组 /etc/passwd/etc/group/etc/shadow/etc/gshadow

    完整白名单包含 45+ 路径,覆盖所有常见系统级挂载。


    📜 开源协议

    本项目采用 MIT License 协议开源。

    2 replies    2026-08-15 17:41:42 +08:00
    goojia
        1
    goojia  
       1 day ago via Android
    我就是这样做的,不过不经常安装新 docker 容器,直接让 ai 改就行了。
    getadoggie
        2
    getadoggie  
       1 day ago via iPhone
    支持 podman 吗
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   894 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 19:55 · PVG 03:55 · LAX 12:55 · JFK 15:55
    ♥ Do have faith in what you're doing.