Docker快速部署Mysql的三种方法——实操篇

文章目录

为什么用Docker部署MySQL

传统部署MySQL需手动配置系统依赖、权限、端口等环境,易因操作系统版本、依赖库差异出现"本地可运行、线上部署失败"的问题;且多版本MySQL共存时易产生端口冲突、依赖冲突。而Docker通过"容器化"技术,将MySQL及其所有依赖(如系统库、配置模板)打包为独立镜像,可在任意支持Docker的环境中标准化运行,从根源解决环境一致性问题,同时大幅简化部署流程。

Docker部署MySQL的优势

  1. 环境一致:镜像包含完整运行依赖,确保开发、测试、生产环境无差异,避免"环境适配"问题;
  2. 隔离安全:MySQL容器与宿主机及其他服务完全隔离,不占用宿主机全局资源,避免端口、依赖冲突;
  3. 部署高效:通过一行命令或配置文件即可启动服务,版本切换仅需更换镜像标签,无需重装环境;
  4. 资源轻量化:容器相比虚拟机占用更少CPU、内存资源,适合单机多服务部署;
  5. 数据可控:支持数据卷挂载,将核心数据存储在宿主机,避免容器删除导致数据丢失,且便于备份与跨环境迁移。

三种部署方式

拉取指定版本镜像

复制代码
docker pull mysql:8.0.36
docker images

一 快速部署,临时测试

复制代码
docker run -d --name mysql-test -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 --memory=1g --cpus=1 --ulimit nofile=65535:65535 --log-opt max-size=100m --log-opt max-file=3  mysql:8.0.36

参数说明

  • --name mysql-test:指定容器名称为 mysql-test
  • -e MYSQL_ROOT_PASSWORD=123456:设置 MySQL root 用户密码(必须配置,测试环境临时使用,生产环境需用强密码)
  • -p 3306:3306:将宿主机的 3306 端口映射到容器内的 3306 端口(仅测试用,生产禁用公网映射)
    生产环境请使用 16 位以上随机强密码(含大小写字母、数字、特殊符号),并妥善存储于密码管理工具,切勿明文记录。
  • -d:让容器在后台运行
  • --memory=1g --cpus=1:限制容器最大使用 1G 内存、1 核 CPU,避免拖垮宿主机
  • --ulimit nofile=65535:65535:提升容器文件描述符限制,适配高并发场景
  • --log-opt:限制容器日志大小(单文件100M,最多保留3个),避免占满磁盘

验证

进入容器内的 MySQL 终端,验证服务:

复制代码
docker ps 
docker exec -it mysql-test mysql -uroot -p

二 挂载存储目录,单机部署

适合单机生产环境或低风险业务,对外服务前,必须结合防火墙、安全组、最小权限用户使用。通过数据卷挂载 将 MySQL 的配置、数据、日志目录映射到宿主机,实现 数据持久化配置可控,避免容器删除后数据丢失。

创建存储目录

创建用于存储 MySQL 配置、数据、日志的目录:

复制代码
mkdir -p /home/mysql/{conf,data,logs}
  • conf:存放 MySQL 配置文件
  • data:存放 MySQL 数据文件(核心目录,确保权限充足)
  • logs:存放 MySQL 日志文件

启动服务并挂载

复制代码
docker run -d --name mysql-prod   -e MYSQL_ROOT_PASSWORD=123456   -e TZ=Asia/Shanghai \
  -p 13306:3306 \
  -v /home/mysql/conf:/etc/mysql/conf.d \
  -v /home/mysql/data:/var/lib/mysql \
  -v /home/mysql/logs:/var/log/mysql \
  --memory=2g --cpus=1 --ulimit nofile=65535:65535 \
  --log-opt max-size=100m --log-opt max-file=3 \
  library/mysql:8.0.36

注意:-p 宿主机IP:端口:容器端口 中的 IP 必须是宿主机真实网卡 IP,而非容器IP,否则命令会执行失败。容器默认以非特权模式运行,生产环境严禁添加 --privileged 参数,避免提升容器权限带来安全风险。

设置配置文件

在宿主机的 /home/mysql/conf 目录下新建配置文件my.cnf

bash 复制代码
[mysqld]
# ⚠️ 以下参数仅为示例,请根据 容器内可用内存 / 业务并发模型 调整,勿直接照搬
# 生产推荐写法(最稳定):绑定所有地址,通过Docker网络隔离、防火墙实现安全控制
bind-address = 0.0.0.0
# bind-address = 0.0.0.0 并不等于"对公网开放"
# 实际可访问范围由 Docker 网络、端口映射、防火墙/安全组共同决定
# 极端安全场景备选:仅允许同容器或socket访问,需通过docker exec操作
# bind-address = 127.0.0.1
# 不要将 bind-address 绑定为容器 IP(如 172.x.x.x),否则容器重启可能导致 MySQL 无法启动
# 最大连接数(根据业务并发调整,单机生产建议 300-800)
max_connections = 500
# 密码认证插件(兼容旧版本客户端)
default_authentication_plugin = mysql_native_password
# MySQL 8.0 性能优化参数(建议为容器内存的50%-70%,2G容器推荐1G)
innodb_buffer_pool_size = 1G
# 日志优化:开启慢查询日志,便于问题排查
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
# 生产必备:统一字符集与排序规则,避免数据乱码及迁移异常
character-set-server = utf8mb4
collation-server = utf8mb4_0900_ai_ci

修改配置后,需重启容器使配置生效:

bash 复制代码
docker restart mysql-prod

三 docker-compose 部署

安装docker-compose服务
bash 复制代码
# 下载最新版本的Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 添加执行权限
sudo chmod +x /usr/local/bin/docker-compose

# 验证安装
docker-compose --version  # 应显示版本号
第一步:编写 docker-compose.yml 文件
bash 复制代码
version: '3.8'  # 兼容的 docker-compose 版本
services:
  mysql:
    # ⚠️ 8.0 为浮动tag,小版本升级可能引入行为变化,生产建议固定到具体小版本
    image: mysql:8.0  # 生产推荐:固定小版本(如8.0.36),ARM架构改为arm64v8/mysql:8.0.36
    container_name: mysql-service  # 容器名称
    restart: always  # 容器异常退出时自动重启
    # 生产环境禁用公网端口映射,仅允许Docker内部网络访问
    ports:
       - "23306:3306"
    environment:
      # 初始化环境变量(容器首次启动时生效)
      MYSQL_ROOT_PASSWORD: StrongPass123!  # root 用户密码(强密码)
      MYSQL_DATABASE: appdb  # 自动创建的数据库名称 
      MYSQL_USER: appuser  # 自动创建的业务普通用户(避免用root)
      MYSQL_PASSWORD: AppPass@2026  # 普通用户密码(强密码)
      TZ: Asia/Shanghai  # 时区设置为上海
    volumes:
      # 目录挂载(宿主机目录:容器目录)
      - ./mysql/conf:/etc/mysql/conf.d  # 配置文件目录(相对路径,与 yml 同目录)
      - ./mysql/data:/var/lib/mysql     # 数据文件目录
      - ./mysql/logs:/var/log/mysql     # 日志文件目录
      - ./mysql/conf/my.cnf:/root/.my.cnf    # 挂载MySQL客户端配置文件,避免明文密码
    deploy:
      resources:
        limits:
          cpus: '1'  # 限制最大使用2核CPU
          memory: 2G  # 限制最大使用2G内存
      # ⚠️ 注意:deploy.resources 在非 Swarm 模式下仅作为文档约束
      # ⚠️ 非 Swarm 模式下,此处不会真正限制资源
      # 如需强制限制资源(非 Swarm):
      # 1. 改用 docker run 命令,通过 --memory/--cpus 参数实现强制限制
      # 2. 在 Docker Desktop/daemon 层配置全局资源限制(适用于所有容器)
      # 因此,单机生产如需强制资源限制,优先使用 docker run 方式
    ulimits:
      nofile:
        soft: 65535
        hard: 65535
    logging:
      driver: "json-file"
      options:
        max-size: "100m"  # 单日志文件最大100M
        max-file: "3"     # 最多保留3个日志文件
    networks:
      - app-network  # 自定义Docker网络,仅同网络服务可访问

# 自定义Docker网络,隔离服务访问
networks:
  app-network:
    driver: bridge
第二步:启动服务
bash 复制代码
docker-compose up -d

#停止服务指令
docker compose down
相关推荐
数据库小学妹7 小时前
MySQL在线DDL实战:ALGORITHM三种算法对比+gh-ost变更管理SOP
mysql·dba·数据库运维·在线ddl·mdl锁·sql变更管理
梦远青城7 小时前
Docker 部署python的paddle进行OCR文字识别身份证
python·docker·ocr·paddle·身份证识别
Ethan01078 小时前
隔离级别管读,乐观锁管写——RC/RR 与写冲突的本质
mysql
java_logo8 小时前
ELK Docker Compose 部署指南:轻松搭建日志检索平台
elk·elasticsearch·docker·容器·kibana·logstash·轩辕镜像
ShallWeL9 小时前
Orin 上用 Docker 跑通目标检测功能
人工智能·目标检测·docker·容器
熊文豪9 小时前
【金仓数据库征文】不装中间件的 MySQL→金仓在线迁移,mysql_fdw 全流程,和一个差点漏掉的 emoji
数据库·mysql·中间件·电科金仓
C++、Java和Python的菜鸟9 小时前
第5章 后端Web基础 (MySQL基础)
前端·mysql·adb
IT瑞先生11 小时前
MariaDB与Mysql差异及版本对照
数据库·mysql·mariadb
看-是灰机11 小时前
使用go语言实现对接
linux·开发语言·后端·docker·语言模型·golang·飞书