🎯 核心理念
- 數據存儲:原始 YAML 內容,無需手動縮進
- 格式處理:查詢時自動添加正確縮進
- 用戶友好:編輯時只需關注配置內容,不用擔心格式
📊 完整 SQL 建立腳本
sql
-- Docker 配置管理系統 v2.2 - 智能縮進版本
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
START TRANSACTION;
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
--
-- 資料庫: `repiddeploy`
--
-- --------------------------------------------------------
--
-- Docker 配置主表 v2.2 - 智能縮進版
--
CREATE TABLE `docker_configs` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`config_name` varchar(100) NOT NULL COMMENT '配置名稱 如:main-stack',
`service` varchar(50) NOT NULL COMMENT '服務名稱:apache, mariadb, phpmyadmin, composer, redis 等',
`description` text DEFAULT NULL COMMENT '服務描述',
`config_data` longtext NOT NULL COMMENT '服務的原始YAML配置內容(無需手動縮進)',
`service_order` tinyint(3) DEFAULT 0 COMMENT '服務在 compose 中的排序順序',
`is_active` tinyint(1) DEFAULT 1 COMMENT '是否啟用',
`created_at` timestamp NOT NULL DEFAULT current_timestamp() COMMENT '創建時間',
`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp() COMMENT '更新時間',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_config_service` (`config_name`, `service`),
KEY `idx_config_active` (`config_name`, `is_active`),
KEY `idx_service_type` (`service`),
KEY `idx_order` (`config_name`, `service_order`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Docker配置主表-智能縮進版';
-- --------------------------------------------------------
--
-- Docker 檔案管理表 v2.2
--
CREATE TABLE `docker_files` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`config_name` varchar(100) NOT NULL COMMENT '配置名稱',
`service` varchar(50) DEFAULT NULL COMMENT '關聯服務名稱(可為空)',
`file_name` varchar(255) NOT NULL COMMENT '檔案名稱',
`file_path` varchar(500) DEFAULT NULL COMMENT '檔案路徑',
`file_type` enum('dockerfile','config','script','compose','other') NOT NULL DEFAULT 'other' COMMENT '檔案類型',
`file_content` longtext NOT NULL COMMENT '檔案內容',
`description` text DEFAULT NULL COMMENT '檔案描述',
`is_active` tinyint(1) DEFAULT 1 COMMENT '是否啟用',
`created_at` timestamp NOT NULL DEFAULT current_timestamp() COMMENT '創建時間',
`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp() COMMENT '更新時間',
PRIMARY KEY (`id`),
KEY `idx_config_service` (`config_name`, `service`),
KEY `idx_type_active` (`file_type`, `is_active`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Docker相關檔案表';
-- --------------------------------------------------------
--
-- 配置備份表 v2.2
--
CREATE TABLE `docker_configs_backup` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`config_name` varchar(100) NOT NULL COMMENT '配置名稱',
`service` varchar(50) NOT NULL COMMENT '服務名稱',
`config_data` longtext NOT NULL COMMENT '備份的配置數據',
`backup_note` varchar(255) DEFAULT NULL COMMENT '備份備註',
`backup_type` enum('manual','auto','pre_update') DEFAULT 'manual' COMMENT '備份類型',
`created_at` timestamp NOT NULL DEFAULT current_timestamp() COMMENT '備份時間',
PRIMARY KEY (`id`),
KEY `idx_config_service_time` (`config_name`, `service`, `created_at` DESC)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='配置備份表';
-- --------------------------------------------------------
--
-- 插入示例數據(原始格式,無需手動縮進)
--
-- 插入 main-stack 配置的各個服務
INSERT INTO `docker_configs` (`config_name`, `service`, `description`, `config_data`, `service_order`) VALUES
('main-stack', 'apache', 'PHP 8.4 Apache 服務',
'build:
context: .
dockerfile: Dockerfile
container_name: apache
environment:
- TZ=Asia/Hong_Kong
ports:
- "8080:80"
volumes:
- /home/docker/www:/var/www/html
- /home/docker/php.ini:/usr/local/etc/php/php.ini
- /etc/localtime:/etc/localtime:ro
- /home/docker/logs/cron.log:/home/docker/logs/cron.log
depends_on:
- mariadb
restart: always', 1),
('main-stack', 'mariadb', 'MariaDB 資料庫服務',
'image: mariadb:latest
container_name: mariadb
restart: always
environment:
MYSQL_ROOT_PASSWORD: ********
MYSQL_DATABASE: repiddeploy
MYSQL_USER: repiddeploy
MYSQL_PASSWORD: ********
TZ: Asia/Hong_Kong
ports:
- "3306:3306"
volumes:
- /home/docker/db_data:/var/lib/mysql
- /etc/localtime:/etc/localtime:ro', 2),
('main-stack', 'phpmyadmin', 'phpMyAdmin 管理介面',
'image: phpmyadmin/phpmyadmin
container_name: phpmyadmin
restart: always
environment:
PMA_HOST: mariadb
PMA_PORT: 3306
MYSQL_ROOT_PASSWORD: ********
ports:
- "8081:80"
depends_on:
- mariadb', 3),
('main-stack', 'composer', 'Composer PHP 依賴管理',
'image: composer:latest
container_name: composer
working_dir: /app
volumes:
- /home/docker/www:/app', 4);
-- 插入 Dockerfile
INSERT INTO `docker_files` (`config_name`, `service`, `file_name`, `file_path`, `file_type`, `file_content`, `description`) VALUES
('main-stack', 'apache', 'Dockerfile', './Dockerfile', 'dockerfile',
'FROM php:8.4-apache
# 安裝 APCu、Nano 和其他 PHP 擴展
RUN apt-get update && apt-get install -y \\
nano \\
mariadb-client \\
libicu-dev \\
libzip-dev \\
libfreetype6-dev \\
libjpeg62-turbo-dev \\
libpng-dev \\
libwebp-dev \\
unzip \\
&& docker-php-ext-install intl zip mysqli gd \\
&& pecl install apcu redis \\
&& docker-php-ext-enable apcu redis \\
&& apt-get clean && rm -rf /var/lib/apt/lists/*
RUN docker-php-ext-install opcache
# 設置 ServerName
RUN echo "ServerName localhost" >> /etc/apache2/apache2.conf
# 啟用必要的 Apache 模組,包括 mod_rewrite
RUN a2enmod rewrite
# 設置網站目錄權限(根據需要)
WORKDIR /var/www/html',
'PHP 8.4 Apache with extensions');
COMMIT;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
🚀 核心查詢操作
📋 生成完整 docker-compose.yml(智能縮進)
sql
-- 智能縮進版:自動處理所有格式
SELECT
CONCAT(
'services:\n',
GROUP_CONCAT(
CONCAT(' ', service, ':\n ', REPLACE(config_data, '\n', '\n '))
ORDER BY service_order, service
SEPARATOR '\n'
)
) as docker_compose_yml
FROM docker_configs
WHERE config_name = 'main-stack' AND is_active = 1;
🔍 查看所有服務
sql
-- 查看配置中的所有服務
SELECT
service,
description,
is_active,
service_order,
updated_at
FROM docker_configs
WHERE config_name = 'main-stack'
ORDER BY service_order, service;
🎯 查看單一服務配置
sql
-- 查看 Apache 服務的詳細配置
SELECT
service,
description,
config_data,
service_order,
updated_at
FROM docker_configs
WHERE config_name = 'main-stack'
AND service = 'apache'
AND is_active = 1;
📊 配置概覽
sql
-- 配置統計概覽
SELECT
config_name,
COUNT(*) as total_services,
COUNT(CASE WHEN is_active = 1 THEN 1 END) as active_services,
MAX(updated_at) as last_modified
FROM docker_configs
GROUP BY config_name;
✏️ 編輯操作 — 用戶友好版
➕ 添加新服務(原始格式,無需縮進)
sql
-- 添加 Redis 服務 - 用戶只需輸入原始內容
INSERT INTO docker_configs (config_name, service, description, config_data, service_order) VALUES
('main-stack', 'redis', 'Redis 記憶體資料庫',
'image: redis:7-alpine
container_name: redis
restart: always
ports:
- "6379:6379"
volumes:
- /home/docker/redis-data:/data
command: redis-server --appendonly yes', 5);
🔧 編輯服務配置(原始格式)
sql
-- 修改 Apache 服務端口 - 直接編輯原始內容
UPDATE docker_configs
SET config_data = 'build:
context: .
dockerfile: Dockerfile
container_name: apache
environment:
- TZ=Asia/Hong_Kong
ports:
- "8888:80"
volumes:
- /home/docker/www:/var/www/html
- /home/docker/php.ini:/usr/local/etc/php/php.ini
- /etc/localtime:/etc/localtime:ro
depends_on:
- mariadb
restart: always',
updated_at = NOW()
WHERE config_name = 'main-stack' AND service = 'apache';
❌ 移除服務
sql
-- 停用服務(軟刪除)
UPDATE docker_configs
SET is_active = 0, updated_at = NOW()
WHERE config_name = 'main-stack' AND service = 'phpmyadmin';
-- 永久刪除服務
DELETE FROM docker_configs
WHERE config_name = 'main-stack' AND service = 'phpmyadmin';
🔄 調整服務順序
sql
-- 重新排列服務順序
UPDATE docker_configs SET service_order = 1 WHERE config_name = 'main-stack' AND service = 'mariadb';
UPDATE docker_configs SET service_order = 2 WHERE config_name = 'main-stack' AND service = 'apache';
UPDATE docker_configs SET service_order = 3 WHERE config_name = 'main-stack' AND service = 'phpmyadmin';
UPDATE docker_configs SET service_order = 4 WHERE config_name = 'main-stack' AND service = 'composer';
🔀 批量操作
sql
-- 批量端口替換
UPDATE docker_configs
SET config_data = REPLACE(config_data, '"8080:80"', '"9080:80"'),
updated_at = NOW()
WHERE config_name = 'main-stack' AND service = 'apache';
-- 批量環境變數替換
UPDATE docker_configs
SET config_data = REPLACE(config_data, 'TZ: Asia/Hong_Kong', 'TZ: Asia/Taipei'),
updated_at = NOW()
WHERE config_name = 'main-stack';
🔧 實用工具查詢
💾 備份操作
sql
-- 備份整個配置
INSERT INTO docker_configs_backup (config_name, service, config_data, backup_note, backup_type)
SELECT config_name, service, config_data, '升級前備份', 'pre_update'
FROM docker_configs
WHERE config_name = 'main-stack' AND is_active = 1;
-- 備份單一服務
INSERT INTO docker_configs_backup (config_name, service, config_data, backup_note)
SELECT config_name, service, config_data, '手動備份 Apache'
FROM docker_configs
WHERE config_name = 'main-stack' AND service = 'apache';
📦 生成完整部署包
sql
-- 獲取完整部署包(包含所有檔案)
SELECT
'docker-compose.yml' as filename,
'compose' as file_type,
(SELECT
CONCAT(
'services:\n',
GROUP_CONCAT(
CONCAT(' ', service, ':\n ', REPLACE(config_data, '\n', '\n '))
ORDER BY service_order, service
SEPARATOR '\n'
)
)
FROM docker_configs
WHERE config_name = 'main-stack' AND is_active = 1
) as file_content
UNION ALL
SELECT
df.file_name as filename,
df.file_type,
df.file_content
FROM docker_files df
WHERE df.config_name = 'main-stack' AND df.is_active = 1
ORDER BY
CASE WHEN filename = 'docker-compose.yml' THEN 1 ELSE 2 END,
filename;
🔍 服務依賴分析
sql
-- 分析服務依賴關係
SELECT
service,
CASE
WHEN config_data LIKE '%depends_on:%' THEN
TRIM(SUBSTRING(
config_data,
LOCATE('depends_on:', config_data) + 11,
CASE
WHEN LOCATE('\n', config_data, LOCATE('depends_on:', config_data) + 11) > 0
THEN LOCATE('\n', config_data, LOCATE('depends_on:', config_data) + 11) - LOCATE('depends_on:', config_data) - 11
ELSE LENGTH(config_data)
END
))
ELSE 'No dependencies'
END as dependencies
FROM docker_configs
WHERE config_name = 'main-stack' AND is_active = 1;
📈 配置變更歷史
sql
-- 查看配置變更歷史
SELECT
service,
backup_note,
backup_type,
created_at as backup_time
FROM docker_configs_backup
WHERE config_name = 'main-stack'
ORDER BY created_at DESC;
✅ 配置驗證
sql
-- 檢查配置完整性
SELECT
service,
CASE
WHEN config_data LIKE '%image:%' OR config_data LIKE '%build:%' THEN '✓ 有'
ELSE '✗ 缺少'
END as has_source,
CASE
WHEN config_data LIKE '%container_name:%' THEN '✓ 有'
ELSE '✗ 缺少'
END as has_container_name,
CASE
WHEN config_data LIKE '%ports:%' THEN '✓ 有'
ELSE '⚠ 無'
END as has_ports,
service_order,
is_active
FROM docker_configs
WHERE config_name = 'main-stack'
ORDER BY service_order;
💡 基本 PHP 整合示例
php
<?php
class DockerConfigManager {
private $pdo;
public function __construct($pdo) {
$this->pdo = $pdo;
}
// 生成 docker-compose.yml
public function generateCompose($configName) {
$sql = "SELECT CONCAT('services:\n', GROUP_CONCAT(CONCAT(' ', service, ':\n ', REPLACE(config_data, '\n', '\n ')) ORDER BY service_order, service SEPARATOR '\n')) as compose FROM docker_configs WHERE config_name = ? AND is_active = 1";
$stmt = $this->pdo->prepare($sql);
$stmt->execute([$configName]);
return $stmt->fetchColumn();
}
// 獲取所有服務
public function getServices($configName) {
$sql = "SELECT * FROM docker_configs WHERE config_name = ? ORDER BY service_order, service";
$stmt = $this->pdo->prepare($sql);
$stmt->execute([$configName]);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
// 添加服務
public function addService($configName, $service, $configData, $description = null, $order = 999) {
$sql = "INSERT INTO docker_configs (config_name, service, description, config_data, service_order) VALUES (?, ?, ?, ?, ?)";
$stmt = $this->pdo->prepare($sql);
return $stmt->execute([$configName, $service, $description, $configData, $order]);
}
// 更新服務
public function updateService($configName, $service, $configData) {
$sql = "UPDATE docker_configs SET config_data = ?, updated_at = NOW() WHERE config_name = ? AND service = ?";
$stmt = $this->pdo->prepare($sql);
return $stmt->execute([$configData, $configName, $service]);
}
// 刪除服務
public function removeService($configName, $service) {
$sql = "DELETE FROM docker_configs WHERE config_name = ? AND service = ?";
$stmt = $this->pdo->prepare($sql);
return $stmt->execute([$configName, $service]);
}
}
// 使用示例
$pdo = new PDO("mysql:host=localhost;dbname=repiddeploy", $username, $password);
$manager = new DockerConfigManager($pdo);
// 生成 docker-compose.yml
echo $manager->generateCompose('main-stack');
// 添加新服務
$nginxConfig = 'image: nginx:alpine
container_name: nginx
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf';
$manager->addService('main-stack', 'nginx', $nginxConfig, 'Nginx reverse proxy');
?>
🎯 新版本特點
✅ 極簡設計
- 只保留核心功能和查詢
- 移除複雜的功能,專注實用性
✅ 用戶友好
- 編輯時無需考慮縮進格式
- 智能查詢自動處理所有格式
✅ 高效查詢
- 單一查詢生成完美 docker-compose.yml
- 簡潔的 SQL,易於維護
✅ 擴展便利
- 清晰的表結構
- 標準的操作模式
- 便於後續功能添加
這個精簡版本保持了核心功能的完整性,同時去除了不必要的複雜性!