2024年macOS Big Sur开发者必备:用Docker部署MySQL+Ollama全栈方案

云信安装大师
90
AI 质量分
11 5 月, 2025
4 分钟阅读
0 阅读

2024年macOS Big Sur开发者必备:用Docker部署MySQL+Ollama全栈方案

引言

在当今全栈开发领域,快速搭建可靠的数据库和AI服务环境是每个开发者的刚需。本文将带你使用Docker在macOS Big Sur上部署MySQL数据库和Ollama AI服务,构建一个完整的开发环境。这种方案的优势在于:

  • 环境隔离,不污染主机系统
  • 一键启动/停止所有服务
  • 跨团队环境一致性
  • 资源占用可控

准备工作

系统要求

  • macOS Big Sur (11.0)或更高版本
  • 至少8GB内存(推荐16GB)
  • 50GB可用磁盘空间

需要安装的软件

  1. Docker Desktop for Mac
  2. Homebrew(macOS包管理器)
代码片段
# 检查Docker是否安装成功
docker --version
# Docker version 24.0.6, build ed223bc

# 检查Docker Compose版本
docker compose version
# Docker Compose version v2.21.0

第一步:安装和配置Docker

  1. 下载并安装Docker Desktop

    • 访问Docker官网
    • 选择Apple Chip(M1/M2)或Intel版本下载
  2. 基本配置
    打开Docker Desktop后,进入设置:

    • Resources → Memory:建议设置为4GB以上
    • Features → Enable VirtioFS:勾选(提高文件系统性能)
  3. 验证安装

代码片段
docker run hello-world

你应该看到”Hello from Docker!”的消息。

第二步:创建Docker Compose项目

我们将使用Docker Compose来管理多个容器服务。创建一个新目录并添加docker-compose.yml文件:

代码片段
mkdir ollama-mysql-stack && cd ollama-mysql-stack
touch docker-compose.yml

编辑docker-compose.yml文件:

代码片段
version: '3.8'

services:
  mysql:
    image: mysql:8.0
    container_name: mysql_container
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword123
      MYSQL_DATABASE: ollamadb
      MYSQL_USER: ollamauser
      MYSQL_PASSWORD: userpassword123
    ports:
      - "3306:3306"
    volumes:
      - mysql_data:/var/lib/mysql
    restart: unless-stopped

  ollama:
    image: ollama/ollama:latest
    container_name: ollama_container 
    ports:
      - "11434:11434"
    volumes:
      - ollama_data:/root/.ollama 
    restart: unless-stopped

volumes:
  mysql_data:
  ollama_data:

配置说明:

  1. MySQL服务

    • mysql:8.0:使用官方MySQL 8.0镜像
    • volumes:持久化数据库数据,防止容器重启后丢失
  2. Ollama服务

    • ollama/ollama:官方Ollama镜像(用于运行本地LLM模型)
    • 11434端口是Ollama的默认API端口

第三步:启动服务

代码片段
# 启动所有服务(在后台运行)
docker compose up -d

# 查看运行状态(应该看到两个容器都是"running"状态)
docker compose ps

# NAME                COMMAND                  SERVICE             STATUS              PORTS
# mysql_container     "docker-entrypoint.s…"   mysql               running             0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 
# ollama_container    "/bin/ollama serve"      ollama              running             0.0.0.0:11434->11434/tcp, :::11434->11434/tcp 

第四步:验证MySQL连接

我们可以使用命令行或GUI工具连接MySQL:

代码片段
# MySQL命令行连接(密码是上面设置的userpassword123)
docker exec -it mysql_container mysql -uollamauser -puserpassword123 ollamadb

# MySQL命令行中执行简单查询测试连接:
mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| ollamadb           |
+--------------------+
2 rows in set (0.00 sec)

或者使用TablePlus等GUI工具连接:
– Host: localhost (或127.0.0.1)
– Port: 3306
– Username: ollamauser
– Password: userpassword123
– Database: ollamadb

第五步:与Ollama交互

Ollama是一个开源的本地大语言模型运行框架。让我们测试它是否正常工作:

  1. 首先下载一个模型(这里以Llama2为例):
代码片段
docker exec -it ollama_container ollama pull llama2 # ~3GB大小,视网络情况可能需要较长时间 
  1. 运行模型进行测试
代码片段
curl http://localhost:11434/api/generate -d '{
 "model": "llama2",
 "prompt": "为什么天空是蓝色的?",
 "stream": false,
 "options": {
   "temperature": 0,
   "num_predict":50  
 }
}'

你应该会得到一个JSON格式的响应,包含模型的回答。

MySQL与Ollama集成示例

让我们创建一个简单的Python脚本,将MySQL中的数据通过Ollama进行处理:

  1. 创建Python虚拟环境
代码片段
python3 -m venv venv 
source venv/bin/activate # macOS/Linux激活方式不同注意区分 
pip install pymysql requests python-dotenv 
  1. 创建.env文件存储凭证
代码片段
MYSQL_HOST=localhost  
MYSQL_USER=ollamauser  
MYSQL_PASSWORD=userpassword123  
MYSQL_DB=ollamadb  
OLLAMA_URL=http://localhost:11434  
  1. 创建示例Python脚本demo.py
代码片段
import pymysql  
import requests  
import json  
from dotenv import load_dotenv  
import os  

load_dotenv()  

def get_db_connection():  
    return pymysql.connect(  
        host=os.getenv('MYSQL_HOST'),  
        user=os.getenv('MYSQL_USER'),  
        password=os.getenv('MYSQL_PASSWORD'),  
        database=os.getenv('MYSQL_DB')  
    )  

def setup_database():  
    conn = get_db_connection()  
    cursor = conn.cursor()  

    # Create table if not exists  
    cursor.execute("""CREATE TABLE IF NOT EXISTS products (
        id INT AUTO_INCREMENT PRIMARY KEY,
        name VARCHAR(255),
        description TEXT,
        ai_summary TEXT)""")  

    # Insert sample data if empty  
    cursor.execute("SELECT COUNT(*) FROM products")  
    if cursor.fetchone()[0] == 0:
        products = [
            ("MacBook Pro", "Apple笔记本电脑,16英寸屏幕"),
            ("iPhone15", "最新款苹果手机"),
            ("AirPods Pro", "降噪无线耳机")
        ]
        cursor.executemany("INSERT INTO products (name, description) VALUES (%s, %s)", products)  

    conn.commit()  
    conn.close()  

def generate_ai_summary(text):  
    payload = {    
        "model": "llama2",    
        "prompt": f"用一句话总结这个产品描述:'{text}'",    
        "stream": False    
    }    

    response = requests.post(f"{os.getenv('OLLAMA_URL')}/api/generate", json=payload)    

    if response.status_code == 200:    
        return json.loads(response.text)["response"]    

if __name__ == "__main__":   
     setup_database()   

     conn = get_db_connection()   
     cursor = conn.cursor(pymysql.cursors.DictCursor)   

     # Get products without AI summary   
     cursor.execute("SELECT * FROM products WHERE ai_summary IS NULL")   
     products = cursor.fetchall()   

     for product in products[:3]: # Limit to first3 to avoid too many requests   
         print(f"Processing product:{product['name']}")   
         summary = generate_ai_summary(product['description'])   

         # Update the product with AI summary   
         cursor.execute("UPDATE products SET ai_summary=%s WHERE id=%s",(summary, product['id']))   

     conn.commit()   

     # Display results   
     cursor.execute("SELECT name, ai_summary FROM products WHERE ai_summary IS NOT NULL")   
     for row in cursor.fetchall():   
         print(f"{row['name']}:{row['ai_summary']}")   

     conn.close()

运行脚本:

代码片段
python demo.py 

输出示例:

代码片段
MacBook Pro:这是一款16英寸屏幕的Apple笔记本电脑。
iPhone15:这是最新款的苹果手机。
AirPods Pro:这是一款具有降噪功能的无线耳机。

Docker管理常用命令参考表

Command Description
docker compose up -d Start all services in background
docker compose down Stop and remove all containers
docker compose logs [service] View logs of a service
docker compose ps List running containers
docker volume ls List all volumes

Troubleshooting常见问题解决

1️⃣ 端口冲突问题
如果遇到端口已被占用的错误(如3306或11434),可以:
lsof -i :3306查找占用进程并终止它
– Or修改compose文件中的端口映射为其他值(如”3307:3306″)

2️⃣ 内存不足
如果遇到容器频繁崩溃或响应缓慢:
– Docker Desktop → Settings → Resources → Increase Memory limit

3️⃣ MySQL连接问题
确保使用正确的用户名密码组合(root用户只能在容器内访问)

4️⃣ 模型下载慢
可以使用国内镜像源加速下载(仅限中国用户):

代码片段
docker exec olalma_container env OLLAMA_MIRROR=https://ollamamirror.example.com ollamma pull llama2 

5️⃣ 数据持久化
所有重要数据都存储在命名卷中(mysql_data,ollamma_data) ,即使删除容器也不会丢失数据。查看卷位置:

代码片段
docker volume inspect olalma-mysql-stack_mysql_data 

macOS特定优化建议

💡 性能调优
1️⃣ VirtioFS文件系统比gRPC FUSE快30%以上(Docker Desktop设置中启用)
2️⃣ Rosetta转译模式对于x86镜像的性能影响很大(M系列芯片用户注意)

💡 资源监控
使用Activity Monitor观察”Docker Desktop”和”qemu-system-aarch64″(如果是Apple Silicon)的CPU/内存占用情况。

💡 电池优化
开发时插电使用,Docker在高负载下会显著增加能耗。

Clean Up清理资源

当不再需要这个开发环境时:

代码片段
# Stop and remove containers but keep volumes(data)
docker compose down 

# Remove everything including volumes(WARNING!)
docker compose down --volumes 

# Remove unused resources to free disk space(especially useful after pulling large models)
docker system prune --volumes --force 

Conclusion总结

通过本教程,你已经学会了如何在macOS Big Sur上:

✅ Docker Compose编排多容器应用(Mysql + Ollamma)
✅ MySQL数据库的配置和使用最佳实践
✅ Ollamma本地大语言模型的部署和集成方法
✅ Python脚本桥接传统数据库与AI能力

这种全栈方案特别适合需要同时处理结构化数据和自然语言处理的现代应用开发场景。

原创 高质量