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: "
}4. 启动容器
- 终端(或终点):
/containers//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//stop - 方法:
POST - 描述停止正在运行的Docker容器。
- 路径参数:
name(要停止的容器的名称) - 响应(200 OK):
{
"message": "Container 'name' stopped successfully"
}- 错误响应(404 未找到):
{
"error": "Failed to stop container 'name' or container not found"
}6. 移除容器
- 终端点/终点:
/containers//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: "
}8. 重启容器
- 终端节点:
/containers//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//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它的功能/作用
- 连接到 Docker验证Docker是否正在运行且可访问
- 创建初始容器创建3个具有唯一名称和端口映射的容器
- 节目概要列出所有已创建的容器及其详细信息
- 交互式菜单提供管理容器的选项
菜单选项
- 创建新容器 - 创建具有自动生成名称的额外容器
- 列出容器 - 显示所有正在运行的容器
- 测试容器应用 - 测试Node.js应用程序是否响应
- 停止容器 - 停止特定的容器
- 移除容器 - 移除特定容器
- 清理所有容器 - 一次性移除所有容器
- 退出 - 退出应用程序
港口管理
- 集装箱港口所有容器都在内部通过端口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
- 当前时间戳
- 欢迎信息
你可以通过以下方式测试它们:
- 使用菜单选项3(测试容器应用)
- 打开浏览器以访问
http://localhost:4000,http://localhost:4001等。 - 向映射的端口发送HTTP请求
模块化结构的优势
- 关注点分离(或译为:职责分离)每个文件都有特定的职责
- 可维护性更容易修改和扩展单个组件
- 可重用性类可以在其他项目中导入并使用
- 测试各个组件可以单独进行测试
- 配置轻松修改设置,无需触及核心逻辑
许可证
这个项目采用MIT许可证授权——详见 许可证 详情请查阅文件。
