Docker新手必看:5分钟搞定Memos+MySQL全栈部署(含常见错误排查)
·
Docker新手必看:5分钟搞定Memos+MySQL全栈部署(含常见错误排查)
在容器化技术席卷开发领域的今天,Docker已成为现代应用部署的标配工具。但对于刚接触容器的新手而言,从零开始部署一个包含数据库的全栈应用,往往会遇到各种"坑"。本文将手把手带你用最短时间完成Memos笔记系统与MySQL的协同部署,并针对实际部署中高频出现的网络配置、权限异常、端口冲突等问题提供即查即用的解决方案。
1. 环境准备与工具链检查
在开始部署前,我们需要确保基础环境符合要求。打开终端执行docker --version和docker-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
首次启动常见问题处理流程:
-
端口冲突错误:
- 使用
netstat -tulnp | grep 5230检查端口占用 - 解决方案:修改compose文件端口映射为
"5231:5230"
- 使用
-
数据库连接失败:
- 验证MySQL容器状态:
docker exec -it mysql-db mysql -u root -p - 检查连接字符串特殊字符转义
- 验证MySQL容器状态:
-
权限拒绝错误:
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界面无法打开
排查步骤:
- 检查容器状态:
docker ps -a - 查看Memos日志:
docker logs memos-prod - 验证网络连通性:
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反向代理实现负载均衡。
更多推荐
所有评论(0)