Docker新手必看:5分钟搞定Memos+MySQL全栈部署(含常见错误排查)

在容器化技术席卷开发领域的今天,Docker已成为现代应用部署的标配工具。但对于刚接触容器的新手而言,从零开始部署一个包含数据库的全栈应用,往往会遇到各种"坑"。本文将手把手带你用最短时间完成Memos笔记系统与MySQL的协同部署,并针对实际部署中高频出现的网络配置、权限异常、端口冲突等问题提供即查即用的解决方案。

1. 环境准备与工具链检查

在开始部署前,我们需要确保基础环境符合要求。打开终端执行docker --versiondocker-compose --version,理想情况下应显示类似以下版本信息:

Docker version 24.0.5, build 24.0.5-0ubuntu1~22.04.1
docker-compose version 1.29.2, build unknown

常见版本问题排查

  • 若提示"command not found",需重新安装Docker引擎
  • 版本过旧可能导致兼容性问题,建议Docker≥20.10、Compose≥1.27
  • Windows/macOS用户建议使用Docker Desktop图形化管理工具

提示:生产环境推荐使用Linux发行版作为宿主机系统,可获得最佳性能表现

2. 全栈编排文件深度解析

下面这个增强版的docker-compose.yml不仅包含基础服务,还整合了健康检查、日志配置等生产级特性:

version: '3.8'

services:
  memos:
    image: neosmemo/memos:stable
    container_name: memos-prod
    restart: unless-stopped
    depends_on:
      mysql:
        condition: service_healthy
    networks:
      - memo_net
    volumes:
      - ./memos_data:/var/opt/memos
    ports:
      - "5230:5230"
    environment:
      MEMOS_DRIVER: mysql
      MEMOS_DSN: "memos_user:StrongPassword123@tcp(mysql:3306)/memos_db"
      TZ: Asia/Shanghai
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"

  mysql:
    image: mysql:8.0
    container_name: mysql-db
    restart: unless-stopped
    networks:
      - memo_net
    volumes:
      - ./mysql_data:/var/lib/mysql
      - ./mysql_conf.d:/etc/mysql/conf.d
    environment:
      MYSQL_ROOT_PASSWORD: SecureRootPass
      MYSQL_DATABASE: memos_db
      MYSQL_USER: memos_user
      MYSQL_PASSWORD: StrongPassword123
    ports:
      - "3306:3306"
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 5s
      timeout: 3s
      retries: 5

networks:
  memo_net:
    driver: bridge
    ipam:
      config:
        - subnet: 172.20.0.0/16

关键配置解析

配置项作用说明典型错误值
depends_on服务启动顺序控制缺少condition导致启动竞争
MEMOS_DSN数据库连接字符串使用localhost而非服务名
healthcheck服务健康监测检测命令配置错误
max-size日志滚动策略单位缺失(需"10m"而非10)

3. 部署实战与自动初始化

执行部署命令时,建议添加--build参数确保使用最新镜像:

docker-compose up -d --build

观察日志输出是否正常:

docker-compose logs -f --tail=50

首次启动常见问题处理流程

  1. 端口冲突错误

    • 使用netstat -tulnp | grep 5230检查端口占用
    • 解决方案:修改compose文件端口映射为"5231:5230"
  2. 数据库连接失败

    • 验证MySQL容器状态:docker exec -it mysql-db mysql -u root -p
    • 检查连接字符串特殊字符转义
  3. 权限拒绝错误

    chmod -R 755 ./mysql_data
    chown -R 999:999 ./mysql_data  # MySQL容器内用户UID
    

4. 高级维护与性能调优

数据库备份方案

# 每日凌晨备份
docker exec mysql-db sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > /backups/memos_$(date +%F).sql

内存限制配置示例

services:
  mysql:
    deploy:
      resources:
        limits:
          memory: 2G
          cpus: '1.5'

监控指标获取

# 查看容器资源占用
docker stats --no-stream mysql-db memos-prod

# 获取Memos健康状态
curl -s http://localhost:5230/api/status | jq .

5. 故障排查速查手册

错误现象:Memos界面无法打开

排查步骤:

  1. 检查容器状态:docker ps -a
  2. 查看Memos日志:docker logs memos-prod
  3. 验证网络连通性:
    docker exec -it memos-prod ping mysql-db
    

典型错误对照表

错误提示可能原因解决方案
"connection refused"数据库服务未启动检查MySQL容器状态
"access denied"密码错误/权限不足重置数据库密码
"too many connections"连接池耗尽增加max_connections参数
"no route to host"网络配置错误检查自定义网络设置

在长期运行维护中,建议将日志收集接入ELK等监控系统。对于高频访问场景,可以考虑在Memos前部署Nginx反向代理实现负载均衡。

更多推荐