Docker Node.js沙箱管理器

一个用于创建和管理多个Node.js Docker容器的Python应用程序,具有唯一命名和智能端口映射功能。

  • by Prakash2459
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 Prakash2459/Docker-Sandbox-with-MCP-Terminal

使用说明

Docker Node.js 沙盒管理器

一个Python应用程序,用于创建和管理多个带有Node.js镜像的Docker容器,每个容器都有唯一的名称和端口映射。

特点/特性

  • 🐳(海豚或鲸鱼的图案,常用于表情符号中表示可爱或俏皮) Docker 容器管理创建、列出、停止和删除容器
  • 🔢 表示“数字”或“计算器按键”,在中文中可以翻译为“数字”或根据上下文具体描述为“计算器上的数字键”等。 唯一命名每个容器都会获得一个包含时间戳和UUID的唯一名称
  • 🌐 代表“互联网”或“世界万维网”的符号。 智能端口映射自动查找可用端口并将它们映射到容器端口3000
  • 🚀 表示火箭或快速上升、前进的意思,也可以用来形容速度非常快或充满活力的事物。 Node.js 应用程序每个容器都在3000端口上运行一个简单的HTTP服务器
  • 🧪 表示“实验”或“试管”的符号。 测试测试应用程序是否正在运行并作出响应
  • 簸箕 清理移除单个容器或一次性全部清理

项目结构

docker-sandbox/
├── api.py              # Main application entry point for the Flask server
├── docker_sandbox.py   # DockerSandbox class for container management
├── menu.py             # Interactive menu system
├── config.py           # Configuration settings
├── main.py             # Original monolithic file (kept for reference)
├── pyproject.toml      # Project dependencies
└── README.md           # This file

文件描述

api.py

  • Flask服务器的主要应用程序入口点。
  • 初始化并运行Flask应用程序。
  • 包含用于管理Docker容器(创建、列出、停止、移除)的端点。

docker_sandbox.py

  • DockerSandbox 具备所有容器管理功能的类
  • 端口管理和可用性检查
  • 容器的创建、列出、停止和移除
  • 应用程序测试能力

menu.py

  • MenuManager 用于交互式菜单系统的类
  • 处理用户输入和菜单导航
  • 将操作委托给沙盒实例

config.py

  • 配置设置和常量
  • 图像、端口、命令的默认值
  • 菜单选项和应用程序元数据

API终端点

Docker沙盒管理器公开了以下API端点:

1. 健康检查

  • 终点;终端: /
  • 方法: GET
  • 描述检查API是否正在运行。
  • 回应:
    {
      "status": "ok",
      "message": "Docker Sandbox API is running!"
    }
    

2. 创建容器

  • 终端节点: /containers
  • 方法: POST
  • 描述创建一个新的 Node.js Docker 容器。
  • 请求体:
    {
      "name": "optional-container-name"
    }
    
    (如果 name 如果没有提供,将自动生成一个唯一名称。)
  • 响应(201 Created,即“已创建”):
    {
      "message": "Container created successfully",
      "name": "generated-or-provided-name",
      "id": "short-container-id"
    }
    
  • 错误响应(500 内部服务器错误):
    {
      "error": "Failed to create container"
    }
    

3. 列出容器

  • 终端节点: /containers
  • 方法: GET
  • 描述列出所有受管理的Docker容器。
  • 响应(200 OK):
    [
      {
        "id": "container-id",
        "name": "container-name",
        "image": "image-name",
        "status": "running",
        "ports": {
          "3000/tcp": host-port-3000,
          "8080/tcp": host-port-8080
        },
        "volume_name": "volume-name",
        "volume_mount_path": "mount-path"
      },
      // ... more containers
    ]
    
  • 错误响应(500 内部服务器错误):
    {
      "error": "Failed to list containers: An unexpected error occurred: <error-details>"
    }
    

4. 启动容器

  • 终端(或终点): /containers/<name>/start
  • 方法: POST
  • 描述启动一个已停止的容器。如果容器已经在运行,则尝试使用新的端口映射重新创建它。
  • 路径参数: name (要启动的容器的名称)
  • 响应(200 OK):
    {
      "message": "Container started successfully with new ports",
      "name": "container-name",
      "id": "short-container-id",
      "ports": {
        "3000/tcp": new-host-port-3000,
        "8080/tcp": new-host-port-8080
      }
    }
    
  • 错误响应(404 找不到):
    {
      "error": "Container 'name' not found."
    }
    
  • 错误响应(500 内部服务器错误):
    {
      "error": "Container 'name': Volume information missing."
    }
    

5. 停止容器

  • 终端(或端点): /containers/<name>/stop
  • 方法: POST
  • 描述停止正在运行的Docker容器。
  • 路径参数: name (要停止的容器的名称)
  • 响应(200 OK):
    {
      "message": "Container 'name' stopped successfully"
    }
    
  • 错误响应(404 未找到):
    {
      "error": "Failed to stop container 'name' or container not found"
    }
    

6. 移除容器

  • 终端点/终点: /containers/<name>/remove
  • 方法: DELETE
  • 描述删除一个 Docker 容器及其关联的卷。
  • 路径参数: name (要移除的容器的名称)
  • 响应(200 OK):
    {
      "message": "Container 'name' and its volume removed successfully"
    }
    
  • 错误响应(404 未找到):
    {
      "error": "Failed to remove container 'name' or container not found"
    }
    

7. 清理所有容器

  • 终端节点: /containers/cleanup
  • 方法: POST
  • 描述停止并移除沙箱管理的所有Docker容器。
  • 响应(200 OK):
    {
      "message": "Cleaned up N containers and their associated volumes"
    }
    
  • 错误响应(500 内部服务器错误):
    {
      "error": "An unexpected error occurred during cleanup: <error-details>"
    }
    

8. 重启容器

  • 终端节点: /containers/<name>/restart
  • 方法: POST
  • 描述重启一个Docker容器。这包括删除旧容器(保留卷)并创建一个同名但可能使用新端口的新容器。
  • 路径参数: name (要重启的容器的名称)
  • 响应(200 正常):
    {
      "message": "Container restarted successfully with new ports",
      "name": "container-name",
      "id": "short-container-id",
      "ports": {
        "3000/tcp": new-host-port-3000,
        "8080/tcp": new-host-port-8080
      }
    }
    
  • 错误响应(404 未找到):
    {
      "error": "Container 'name' not found."
    }
    
  • 错误响应(500 内部服务器错误):
    {
      "error": "Container 'name': Volume information missing."
    }
    

9. 获取容器状态

  • 终端节点: /containers/<name>/status
  • 方法: GET
  • 描述获取特定Docker容器的当前状态和详细信息。
  • 路径参数: name (要获取状态的容器名称)
  • 响应(200 正常):
    {
      "id": "container-id",
      "name": "container-name",
      "image": "image-name",
      "status": "running",
      "ports": {
        "3000/tcp": host-port-3000,
        "8080/tcp": host-port-8080
      },
      "volume_name": "volume-name",
      "volume_mount_path": "mount-path"
    }
    
  • 错误响应(404 未找到):
    {
      "error": "Container 'name' not found."
    }
    

用法

运行应用程序

python api.py

它的功能/作用

  1. 连接到 Docker验证Docker是否正在运行且可访问
  2. 创建初始容器创建3个具有唯一名称和端口映射的容器
  3. 节目概要列出所有已创建的容器及其详细信息
  4. 交互式菜单提供管理容器的选项

菜单选项

  1. 创建新容器 - 创建具有自动生成名称的额外容器
  2. 列出容器 - 显示所有正在运行的容器
  3. 测试容器应用 - 测试Node.js应用程序是否响应
  4. 停止容器 - 停止特定的容器
  5. 移除容器 - 移除特定容器
  6. 清理所有容器 - 一次性移除所有容器
  7. 退出 - 退出应用程序

港口管理

  • 集装箱港口所有容器都在内部通过端口3000运行Node.js应用程序
  • 主机端口映射到从4000开始的可用端口(4000、4001、4002等)
  • 智能检测自动避开Docker或系统已使用的端口
  • 冲突解决如果首选端口已被占用,则查找下一个可用端口

示例输出

🐳 Docker Node.js Sandbox Manager
========================================
✅ Connected to Docker successfully!

📦 Creating 3 Node.js containers...

--- Creating Container 1 ---
   Using container port 3000 -> host port 4000
🚀 Creating container 'node-sandbox-20251008-074401-fd242fc8' with image 'node:18-alpine'...
✅ Container 'node-sandbox-20251008-074401-fd242fc8' created successfully!

📋 Listing all sandbox containers:
Found 3 containers:
  1. node-sandbox-20251008-074401-fd242fc8
     ID: b566d5b9ae48
     Status: running
     Image: node:18-alpine

要求

  • Python 3.10及以上版本
  • Docker正在运行且可访问
  • docker-py 库(包含在 pyproject.toml 中)

安装

# Install dependencies
pip install -e .

# Or using uv (recommended)
uv sync

测试应用程序

每个容器都运行一个简单的Node.js HTTP服务器,该服务器会响应:

  • 集装箱ID
  • 当前时间戳
  • 欢迎信息

你可以通过以下方式测试它们:

  1. 使用菜单选项3(测试容器应用)
  2. 打开浏览器以访问 http://localhost:4000, http://localhost:4001等。
  3. 向映射的端口发送HTTP请求

模块化结构的优势

  • **关注点分离(或译为:职责分离)**每个文件都有特定的职责
  • 可维护性更容易修改和扩展单个组件
  • 可重用性类可以在其他项目中导入并使用
  • 测试各个组件可以单独进行测试
  • 配置轻松修改设置,无需触及核心逻辑

许可证

这个项目采用MIT许可证授权——详见 许可证 详情请查阅文件。