文章目录
-
- 为什么用Docker部署MySQL
- Docker部署MySQL的优势
- 三种部署方式
-
- [一 快速部署,临时测试](#一 快速部署,临时测试)
- [二 挂载存储目录,单机部署](#二 挂载存储目录,单机部署)
- [三 docker-compose 部署](#三 docker-compose 部署)
-
- 安装docker-compose服务
- [第一步:编写 docker-compose.yml 文件](#第一步:编写 docker-compose.yml 文件)
- 第二步:启动服务
为什么用Docker部署MySQL
传统部署MySQL需手动配置系统依赖、权限、端口等环境,易因操作系统版本、依赖库差异出现"本地可运行、线上部署失败"的问题;且多版本MySQL共存时易产生端口冲突、依赖冲突。而Docker通过"容器化"技术,将MySQL及其所有依赖(如系统库、配置模板)打包为独立镜像,可在任意支持Docker的环境中标准化运行,从根源解决环境一致性问题,同时大幅简化部署流程。
Docker部署MySQL的优势
- 环境一致:镜像包含完整运行依赖,确保开发、测试、生产环境无差异,避免"环境适配"问题;
- 隔离安全:MySQL容器与宿主机及其他服务完全隔离,不占用宿主机全局资源,避免端口、依赖冲突;
- 部署高效:通过一行命令或配置文件即可启动服务,版本切换仅需更换镜像标签,无需重装环境;
- 资源轻量化:容器相比虚拟机占用更少CPU、内存资源,适合单机多服务部署;
- 数据可控:支持数据卷挂载,将核心数据存储在宿主机,避免容器删除导致数据丢失,且便于备份与跨环境迁移。
三种部署方式
拉取指定版本镜像
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