mysql到底需不需要容器化?

前言:在容器化的时代,当然一切皆可容器化。在docker官网首页赫然有下面这几个大字。足以知道docker的优势。那么且问,mysql适合跑在docker中吗?

当然,这个问题有人说可以,也有人说不可以。下面我们就正反都来看下各自的观点。

1. 不可以容器化

大部分人的理由有2:

  • 其一,数据安全性不能保障

    在容器或者docker出现故障时,不易恢复。即使使用数据卷挂载(volume)也会在容器故障时产生数据问题,共享的数据卷且对宿主机也会有损伤。即数据的持久化和完整性不能保证。docker适合无状态的服务,不适合有数据状态的mysql。

  • 其二,影响mysql性能

    mysql我们常用来读写,那么IO性能就会受docker影响,最终瓶颈出现在写(在做了挂载情况下);且如果物理机其他应用占用过多资源,也会影响到容器。

当然,以上的问题,也都有对应的解决方案,但时也足够复杂;对研发力量不足的企业来说,如果盲目容器化的话,可能会捡了芝麻,丢了西瓜。

2. 可以容器化

有的小伙伴就会说了,同样是服务,业务服务都是跑在docker中的,数据库服务有何不可? 我只要配置下数据卷挂载,解决掉数据持久化问题,基本上就问题不大了。

比如:

bash 复制代码
docker run -p 3306:3306 --name mysql 
-v /mydata/mysql/log:/var/log/mysql 
-v /mydata/mysql/data:/var/lib/mysql 
-v /mydata/mysql/conf:/etc/mysql
-e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

亦或是docker官方给的mysql容器化的配置sample(sample原文

dockerfile 复制代码
services:
  backend:
    build: backend
    ports:
      - 8080:8080
    secrets:
      - db-password
  db:
    # We use a mariadb image which supports both amd64 & arm64 architecture
    image: mariadb:10.6.4-focal
    # If you really want to use MySQL, uncomment the following line
    #image: mysql:8.0.27
    restart: always
    secrets:
      - db-password
    volumes:
      - db-data:/var/lib/mysql
    environment:
      - MYSQL_DATABASE=example
      - MYSQL_ROOT_PASSWORD_FILE=/run/secrets/db-password
    expose:
      - 3306
      - 33060   
volumes:
  db-data:
secrets:
  db-password:
    file: db/password.txt

两个例子都是通过-v把mysql相关目录数据做好挂载,那么在容器出现故障或者被删除时,能够保证相关数据在宿主机中存在。让数据恢复成为了可能性。注意!是可能性

当然还有docker天然的优势:

  • 简化部署,可移植性高
  • 保证环境一致性

这两个优势 就足以促使很多人去做容器化部署。(估计大家都被手动部署,迁移,多环境问题搞得头大过)

在我看来,两种观点或者是叫两种方案没有对错。也不应该有争论。而应该实事求是,根据当前的业务发展,研发力量来决策。

如果没有那个技术力量,就老老实实部署在物理机上,成本和风险更小。只是"万事开头难"而已。

如果有实力,有技术,那么需要设计出一个好的架构方案;比如需要考虑镜像管理,监控,容器灾备,存储扩展,k8s等

技术的潮流一定是容器化,serverless化。作为技术人们要拥抱变化,要去踏浪,否则只会被淹没在历史的浪潮里。

相关推荐
2301_794333912 小时前
实验室服务器配置|通过Docker实现Linux系统多用户隔离与安全防控
linux·服务器·docker·实验室
JCGKS3 小时前
Docker|“ssh: connect to host xxx.xxx.xxx.xxx port 8000: Connection refused“问题解决
docker·ssh·端口·listen·tcp三次握手
惜.己4 小时前
Docker启动失败 Failed to start Docker Application Container Engine.
spring cloud·docker·eureka
半夏陌离4 小时前
SQL 拓展指南:不同数据库差异对比(MySQL/Oracle/SQL Server 基础区别)
大数据·数据库·sql·mysql·oracle·数据库架构
scugxl4 小时前
centos7 docker离线安装
运维·docker·容器
敬业小码哥5 小时前
记一次:mysql的json及json数组使用组合使用
数据库·mysql·json
练小杰5 小时前
【Mysql-installer-community-8.0.26.0】Mysql 社区版(8.0.26.0) 在Window 系统的默认安装配置
数据库·sql·mysql·adb·配置文件·mysql安装·关系型数据库
计算机小手6 小时前
AI 驱动数据分析:开源 SQLBot 项目探索,基于大模型和 RAG 实现精准问数与图表挖掘
经验分享·docker·开源软件
AI大模型7 小时前
基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程
docker·llm·deepseek
感哥7 小时前
MySQL多表查询
mysql