Docker 小记 — MySQL 与 Redis 配置
本篇文章给大家分享《Docker 小记 — MySQL 与 Redis 配置》,覆盖了数据库的常见基础知识,其实一个语言的全部知识点一篇文章是不可能说完的,但希望通过这些问题,让读者对自己的掌握程度有一定的认识(B 数),从而弥补自己的不足,更好的掌握它。
1. 部署准备
一般部署这些 db_service 容器都应该配套其管理工具(我不否认可以通过命令行完成所有的操作,而且功能更多,权限更大,但是非 DBA 的童鞋还是乖乖使用 UI 吧,耍酷浪费太多时间也不值当🤣),因此,这里我选择的镜像组合是 mysql、adminer 与 redis、erikdubbelboer/phpredisadmin。
Ps:这节太短了,就插一些题外话吧。现在爽 Docker 的同时其实也在为过去的自己默哀,想当年初入编程的时候还没普及云服务器和各种打包好的云服务方案,当然也没有 Docker,想做点什么实验和测试都得在本机。本本性能不行还得一天到晚折腾各种安装环境,就拿 db_service 来说吧,当时选择的是 SQL Server,流行的版本是 05、08 和 08 r2 等,客户要求啥版本的都有。那开发的时候得在本地装呀,要命的是这家伙根本无法彻底卸载,版本之间还有兼容问题,啥错误都遇到过,解决不了最后的终极方案就是重装系统,然后呢... 还得再装呀... 这一下子就是半天到一天的时间。使用虚拟机吧,打开几个 IDE 再启动几个虚拟机,不要说那时候了,就是现在的主流机也扛不动呀,编程体验几乎为零。这里算是忆苦思甜了,想想那时候,现在简直太幸福了。
2. 配置
adminer 与 phpredisadmin 都可以在集群内访问需要代理的服务,如果是在服务器上也不用额外暴露 3306 和 6379 端口,以下是我的 docker-compose 配置:
MySQL
mysql: image: mysql networks: - proxy - youclk volumes: - /mnt/nas/db/mysql:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: db_password deploy: restart_policy: condition: any max_attempts: 3 update_config: delay: 5s order: start-first resources: limits: cpus: '0.50' memory: 1g
mysql_admin: image: adminer networks: - proxy - youclk depends_on: - mysql deploy: labels: - com.df.notify=true - com.df.port=8080 - com.df.serviceDomain=mysql.youclk.com restart_policy: condition: any max_attempts: 3 update_config: delay: 5s order: start-first resources: limits: cpus: '0.50' memory: 1g
启动后 UI 展示如下:


Redis
redis: image: redis networks: - proxy - youclk deploy: restart_policy: condition: any max_attempts: 3 update_config: delay: 5s order: start-first resources: limits: cpus: '0.50' memory: 1g
redis_admin: image: erikdubbelboer/phpredisadmin networks: - proxy - youclk environment: - REDIS_1_HOST=redis - REDIS_1_NAME=redis depends_on: - redis deploy: labels: - com.df.notify=true - com.df.port=80 - com.df.serviceDomain=redis.youclk.com restart_policy: condition: any max_attempts: 3 update_config: delay: 5s order: start-first resources: limits: cpus: '0.50' memory: 1g
启动后 UI 展示如下:

如果看过我之前的两篇博文或者对 Compose 有一定了解的话,以上参数一目了然,此处不做过多赘述。
但如果是部署在本地的话,各种 db_service 工具或者是集群外的其他服务也可能需要连接 db,所以得暴露其各自的端口,我倾向于再编写一个 docker-compose.local.yml ,用于放置本地配置,如下:
version: '3.5' services: mysql: ports: - 3306:3306 volumes: - /Users/Jermey/Documents/data/db/mysql:/var/lib/mysql mysql_admin: deploy: labels: - com.df.notify=true - com.df.port=8080 - com.df.serviceDomain=local-mysql.youclk.com redis: ports: - 6379:6379 redis_admin: deploy: labels: - com.df.notify=true - com.df.port=80 - com.df.serviceDomain=local-redis.youclk.com
然后再编写一个启动脚本,根据当前的系统环境判断是否合并多个配置文件(我的写法比较粗暴,若有更优雅的方案欢迎留言交流):
if [ -z "`uname -a | grep 'Linux'`" ];then docker-compose -f ../src/docker-compose.yml \ -f ../src/docker-compose.local.yml \ config > docker-stack.yml docker stack deploy -c docker-stack.yml --with-registry-auth db else docker stack deploy -c ../src/docker-compose.yml --with-registry-auth db fi
3. MySQL 异常事故记录
开门见山先说结果吧,最后确认是导致异常的原因是使用 NFS 存储 MySQL 的数据。起初服务一直能非常稳定在我本地的集群中运行,但在测试服务器上却时不时突然挂掉且无法重启,开始的时候一头雾水,本地和测试环境的配置文件完全一致呀,而且都是 Docker Swarm 集群,不应该有任何系统因素相关的干扰。而且它不是启动过后立马会挂,而是运行一段时间之后,期间我发了疯地去排除一个个可能导致 MySQL 宕机的其他服务,而因 NFS 能够正常挂载却被我最先排除(期间的心塞程度有 BUG 经历的工友应当能理解)。
直到我在 MySQL 官网看到了这则申明:
Caution is advised when considering using NFS with MySQL. Potential issues, which vary by operating system and NFS version, include:
- MySQL data and log files placed on NFS volumes becoming locked and unavailable for use. Locking issues may occur in cases where multiple instances of MySQL access the same data directory or where MySQL is shut down improperly, due to a power outage, for example. NFS version 4 addresses underlying locking issues with the introduction of advisory and lease-based locking. However, sharing a data directory among MySQL instances is not recommended.
- Data inconsistencies introduced due to messages received out of order or lost network traffic. To avoid this issue, use TCP with hard and intr mount options.
- Maximum file size limitations. NFS Version 2 clients can only access the lowest 2GB of a file (signed 32 bit offset). NFS Version 3 clients support larger files (up to 64 bit offsets). The maximum supported file size also depends on the local file system of the NFS server.
Using NFS within a professional SAN environment or other storage system tends to offer greater reliability than using NFS outside of such an environment. However, NFS within a SAN environment may be slower than directly attached or bus-attached non-rotational storage.
If you choose to use NFS, NFS Version 4 or later is recommended, as is testing your NFS setup thoroughly before deploying into a production environment.
官方文档非常直白地警告 NFS 有风险,使用需谨慎。这下总算松了一口气,终于知道问题源头了,反正是测试环境,随便指定 MySQL 挂载集群中一个节点的目录就行。但不死心的我又尝试了下先将 NFS 挂载到主机,然后由 MySQL 容器再去挂载已经挂载了 NFS 的主机目录,现在是已经正常运行好几天了没有再宕机。
Ps:可以将挂载的命令写入初始配置脚本,新服务器到手之后只需执行一行代码就可以愉快地玩耍了,有兴趣可以看我这篇随笔:“Ubuntu 自动化配置”。
结语
编程的乐趣非程序员不能体会,一行行代码造就了这缤纷多彩的世界,而且其最大的魅力在于我们的产品复用几乎是无成本的。也正因如此,无论我现今生活质量如何,我都能始终怀揣带有一些梦幻色彩的理想,并为之奋斗。而程序员的悲哀也非他人能轻易理解,你可能认为你在处理一个伟大的问题,到头来,可能仅仅是一个符号在作祟。本篇随笔抒情的废话比较多,感谢阅读 :)
我的公众号《捷义》

以上就是《Docker 小记 — MySQL 与 Redis 配置》的详细内容,更多关于mysql的资料请关注golang学习网公众号!

- 上一篇
- MySql高级(一)

- 下一篇
- 聊一聊 MySQL 数据库中的那些锁
-
- 慈祥的老师
- 很好,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,帮助很大,总算是懂了,感谢up主分享文章!
- 2023-03-23 02:10:19
-
- 等待的棒棒糖
- 这篇技术文章真及时,很详细,太给力了,已收藏,关注博主了!希望博主能多写数据库相关的文章。
- 2023-03-18 11:48:10
-
- 踏实的长颈鹿
- 这篇文章出现的刚刚好,作者大大加油!
- 2023-03-15 02:12:33
-
- 欣喜的天空
- 这篇技术文章太及时了,作者大大加油!
- 2023-03-08 08:40:47
-
- 纯真的飞鸟
- 赞 👍👍,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,看完之后很有帮助,总算是懂了,感谢作者大大分享博文!
- 2023-02-14 07:00:21
-
- 土豪的小鸽子
- 很详细,mark,感谢师傅的这篇技术文章,我会继续支持!
- 2023-02-02 19:55:28
-
- 单纯的雪糕
- 细节满满,已收藏,感谢大佬的这篇文章,我会继续支持!
- 2023-02-02 08:04:07
-
- 哭泣的芝麻
- 很好,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,看完之后很有帮助,总算是懂了,感谢作者分享文章!
- 2023-01-23 22:44:59
-
- 冷傲的中心
- 这篇技术文章出现的刚刚好,很详细,感谢大佬分享,码起来,关注作者大大了!希望作者大大能多写数据库相关的文章。
- 2023-01-18 06:35:38
-
- 完美的黑米
- 太详细了,已加入收藏夹了,感谢up主的这篇技术贴,我会继续支持!
- 2023-01-16 15:00:51
-
- 糊涂的苗条
- 这篇技术文章出现的刚刚好,太详细了,很棒,已加入收藏夹了,关注师傅了!希望师傅能多写数据库相关的文章。
- 2023-01-15 15:28:06
-
- 数据库 · MySQL | 8小时前 | 索引 数据类型 字符集 存储引擎 CREATETABLE
- MySQL新建表操作指南与建表技巧
- 462浏览 收藏
-
- 数据库 · MySQL | 1个月前 | 条件判断
- CASEWHEN条件判断的嵌套使用详解与实战场景分析
- 469浏览 收藏
-
- 数据库 · MySQL | 1个月前 | java php
- CSV文件批量导入MySQL的性能优化秘籍大揭秘
- 289浏览 收藏
-
- 数据库 · MySQL | 1个月前 |
- GaleraCluster多主集群配置与冲突解决攻略
- 239浏览 收藏
-
- 数据库 · MySQL | 1个月前 | 窗口函数实战
- MySQL窗口函数实战案例深度剖析
- 315浏览 收藏
-
- 数据库 · MySQL | 1个月前 | 自定义函数
- MySQL插件开发入门:自定义函数(UDF)编写指南
- 184浏览 收藏
-
- 数据库 · MySQL | 1个月前 |
- Windows系统MySQL8.0免安装版配置攻略
- 227浏览 收藏
-
- 数据库 · MySQL | 1个月前 | MySQL错误 数据库诊断
- 深度解析错误代码1045/1217/1205的根本原因及解决方案
- 202浏览 收藏
-
- 数据库 · MySQL | 1个月前 | sql注入 编码规范
- 防范SQL注入必备:编码规范与工具推荐指南
- 140浏览 收藏
-
- 数据库 · MySQL | 1个月前 | 日期函数大全
- MySQL日期函数全集及使用技巧大全
- 111浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 508次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- 笔灵AI生成答辩PPT
- 探索笔灵AI生成答辩PPT的强大功能,快速制作高质量答辩PPT。精准内容提取、多样模板匹配、数据可视化、配套自述稿生成,让您的学术和职场展示更加专业与高效。
- 12次使用
-
- 知网AIGC检测服务系统
- 知网AIGC检测服务系统,专注于检测学术文本中的疑似AI生成内容。依托知网海量高质量文献资源,结合先进的“知识增强AIGC检测技术”,系统能够从语言模式和语义逻辑两方面精准识别AI生成内容,适用于学术研究、教育和企业领域,确保文本的真实性和原创性。
- 22次使用
-
- AIGC检测-Aibiye
- AIbiye官网推出的AIGC检测服务,专注于检测ChatGPT、Gemini、Claude等AIGC工具生成的文本,帮助用户确保论文的原创性和学术规范。支持txt和doc(x)格式,检测范围为论文正文,提供高准确性和便捷的用户体验。
- 30次使用
-
- 易笔AI论文
- 易笔AI论文平台提供自动写作、格式校对、查重检测等功能,支持多种学术领域的论文生成。价格优惠,界面友好,操作简便,适用于学术研究者、学生及论文辅导机构。
- 38次使用
-
- 笔启AI论文写作平台
- 笔启AI论文写作平台提供多类型论文生成服务,支持多语言写作,满足学术研究者、学生和职场人士的需求。平台采用AI 4.0版本,确保论文质量和原创性,并提供查重保障和隐私保护。
- 35次使用
-
- golang MySQL实现对数据库表存储获取操作示例
- 2022-12-22 499浏览
-
- golang进程内存控制避免docker内oom
- 2022-12-22 160浏览
-
- golang进程在docker中OOM后hang住问题解析
- 2022-12-22 105浏览
-
- 分享Redis高可用架构设计实践
- 2023-01-24 286浏览
-
- 搞一个自娱自乐的博客(二) 架构搭建
- 2023-02-16 244浏览