搭建docker虚拟机测试服
搭建Docker虚拟机测试服:从零到实战的完整指南
在软件开发过程中,测试环境的搭建往往是一个令人头疼的问题。传统虚拟机占用资源大、启动慢,而直接在本机测试又可能污染开发环境。Docker虚拟化技术完美地解决了这个痛点。本文将带你从实战角度出发,搭建一个完整的Docker虚拟机测试服务器。### 为什么选择Docker作为测试虚拟机Docker相比传统虚拟机(如VMware、VirtualBox)具有显著优势:- 启动速度:毫秒级启动,传统虚拟机需数分钟- 资源占用:共享宿主机内核,内存和磁盘占用极小- 一致性:开发、测试、生产环境完全一致- 隔离性:每个容器独立运行,互不干扰### 环境准备:安装Docker首先,我们需要在宿主机上安装Docker。以下是在Ubuntu系统上的安装命令:bash# 更新包索引sudo apt-get update# 安装依赖包sudo apt-get install -y \ apt-transport-https \ ca-certificates \ curl \ gnupg \ lsb-release# 添加Docker官方GPG密钥curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \ sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg# 设置稳定版仓库echo \ "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] \ https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null# 安装Docker引擎sudo apt-get updatesudo apt-get install -y docker-ce docker-ce-cli containerd.io# 启动Docker并设置开机自启sudo systemctl start dockersudo systemctl enable docker# 验证安装成功sudo docker run hello-world### 实战一:搭建Nginx测试虚拟机让我们从最简单的Web服务器开始。创建一个包含Nginx的Docker容器作为测试环境。dockerfile# 文件:Dockerfile.nginx# 基于官方Nginx镜像FROM nginx:alpine# 维护者信息LABEL maintainer="test@example.com"# 复制自定义配置文件COPY nginx.conf /etc/nginx/nginx.conf# 复制测试网站文件COPY ./website /usr/share/nginx/html# 暴露80端口EXPOSE 80# 设置健康检查HEALTHCHECK --interval=30s --timeout=3s --retries=3 \ CMD wget -qO- http://localhost/ || exit 1# 默认启动命令CMD ["nginx", "-g", "daemon off;"]创建配套的测试网站文件:html<!-- website/index.html --><!DOCTYPE html><html><head> <title>Docker测试虚拟机</title> <style> body { font-family: Arial, sans-serif; margin: 40px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; } .container { max-width: 800px; margin: 0 auto; padding: 20px; background: rgba(255,255,255,0.1); border-radius: 10px; } h1 { text-align: center; } </style></head><body> <div class="container"> <h1>🎉 Docker测试虚拟机运行成功!</h1> <p>这是通过Docker容器运行的测试网站。</p> <p>当前时间: <span id="time"></span></p> </div> <script> document.getElementById('time').innerText = new Date().toLocaleString(); </script></body></html>构建并运行这个Nginx容器:bash# 构建镜像docker build -t test-nginx:1.0 -f Dockerfile.nginx .# 运行容器,将宿主机8080端口映射到容器80端口docker run -d \ --name nginx-test-vm \ -p 8080:80 \ --restart always \ test-nginx:1.0# 验证容器运行状态docker ps | grep nginx-test-vm# 访问测试页面curl http://localhost:8080### 实战二:搭建完整的LAMP测试环境接下来我们搭建一个更复杂的LAMP(Linux + Apache + MySQL + PHP)测试环境,使用docker-compose编排多个容器。yaml# 文件:docker-compose.ymlversion: '3.8'services: # Web服务器服务 web: image: php:7.4-apache container_name: test-web volumes: # 挂载网站代码目录 - ./www:/var/www/html # 挂载Apache配置文件 - ./apache-config:/etc/apache2/sites-enabled ports: - "8080:80" environment: - APACHE_DOCUMENT_ROOT=/var/www/html - PHP_MEMORY_LIMIT=256M depends_on: - db networks: - test-network restart: unless-stopped # 数据库服务 db: image: mysql:8.0 container_name: test-db volumes: # 持久化数据库数据 - db-data:/var/lib/mysql # 初始化SQL脚本 - ./sql-init:/docker-entrypoint-initdb.d environment: MYSQL_ROOT_PASSWORD: root123 MYSQL_DATABASE: testdb MYSQL_USER: testuser MYSQL_PASSWORD: testpass ports: - "3306:3306" networks: - test-network restart: unless-stopped # PHPMyAdmin管理工具 phpmyadmin: image: phpmyadmin/phpmyadmin container_name: test-phpmyadmin environment: PMA_HOST: db PMA_PORT: 3306 UPLOAD_LIMIT: 100M ports: - "8081:80" depends_on: - db networks: - test-network restart: unless-stopped# 数据卷定义volumes: db-data:# 自定义网络networks: test-network: driver: bridge创建测试用的PHP文件:php<?php// www/index.php// 测试数据库连接$servername = "db";$username = "testuser";$password = "testpass";$dbname = "testdb";try { // 创建PDO连接 $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 创建测试表 $sql = "CREATE TABLE IF NOT EXISTS test_table ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, name VARCHAR(30) NOT NULL, email VARCHAR(50), reg_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP )"; $conn->exec($sql); // 插入测试数据 $stmt = $conn->prepare("INSERT INTO test_table (name, email) VALUES (:name, :email)"); $stmt->execute(['name' => 'Docker测试', 'email' => 'test@docker.com']); // 查询数据 $stmt = $conn->query("SELECT * FROM test_table"); $results = $stmt->fetchAll(PDO::FETCH_ASSOC); echo "<h1>🌟 Docker LAMP测试环境运行正常</h1>"; echo "<h2>数据库连接成功!</h2>"; echo "<table border='1'>"; echo "<tr><th>ID</th><th>名称</th><th>邮箱</th><th>注册时间</th></tr>"; foreach ($results as $row) { echo "<tr>"; echo "<td>" . $row['id'] . "</td>"; echo "<td>" . $row['name'] . "</td>"; echo "<td>" . $row['email'] . "</td>"; echo "<td>" . $row['reg_date'] . "</td>"; echo "</tr>"; } echo "</table>"; } catch(PDOException $e) { echo "连接失败: " . $e->getMessage();}// 输出PHP信息phpinfo();?>启动整个LAMP测试环境:bash# 创建必要的目录结构mkdir -p www apache-config sql-init# 启动所有服务docker-compose up -d# 查看服务状态docker-compose ps# 查看日志docker-compose logs -f web# 访问测试页面# Web服务: http://localhost:8080# PHPMyAdmin: http://localhost:8081### 管理Docker测试虚拟机日常维护常用命令:bash# 停止所有容器docker-compose stop# 重新启动特定服务docker-compose restart web# 查看容器资源使用docker stats# 进入容器内部调试docker exec -it test-web bash# 清理未使用的资源docker system prune -a# 备份数据库docker exec test-db mysqldump -u root -proot123 testdb > backup.sql### 总结通过本文的实战演示,我们成功搭建了两个完整的Docker测试环境:一个轻量级的Nginx服务器和一个企业级的LAMP全栈环境。Docker虚拟机的核心优势在于:1. 快速部署:使用预先构建的镜像,几分钟内即可启动完整测试环境2. 环境一致性:通过Dockerfile和docker-compose.yml确保环境配置可重复3. 资源隔离:每个容器独立运行,不影响宿主机和其他容器4. 易于管理:提供丰富的命令和工具链,方便监控和维护在实际项目开发中,建议将Docker测试环境作为标准配置,配合CI/CD流水线使用,可以显著提升开发效率和代码质量。记住,一个良好的测试环境是软件质量的基石。
更多推荐
所有评论(0)