前言
Docker的容器化技术彻底改变了应用部署方式,其“一次构建、到处运行”的特性,能完美解决MySQL部署中的环境不一致、配置繁琐等问题。本文针对Docker入门者,从环境准备到生产级配置,全程实战讲解MySQL容器的部署、使用与优化,所有命令可直接复制执行。
一、核心概念铺垫
在动手操作前,先明确两个Docker核心概念,避免后续混淆:
- 镜像(Image):MySQL的“安装包”,包含MySQL运行所需的系统环境、依赖库和程序文件,是创建容器的基础。
- 容器(Container):镜像的“运行实例”,是独立的沙箱环境,MySQL服务实际在容器中运行,容器可随时启动、停止、删除。
核心逻辑:拉取MySQL镜像 → 基于镜像创建容器 → 配置容器内MySQL → 使用MySQL服务
二、环境准备:安装Docker
部署MySQL容器前,需先完成Docker环境搭建,以下是主流系统的安装方法:
2.1 Windows 10/11 安装(推荐WSL2后端)
- 启用WSL2:打开“控制面板→程序→启用或关闭Windows功能”,勾选“适用于Linux的Windows子系统”“虚拟机平台”,重启电脑。
- 安装WSL2内核:从微软官网下载并安装内核更新包。
- 安装Docker Desktop:从Docker官网下载安装,启动后在设置中确认“使用WSL2基于引擎”已勾选。
2.2 macOS 安装
直接从Docker官网下载对应芯片版本(Intel芯片/M1/M2芯片)的Docker Desktop,拖拽安装后启动即可。
2.3 Linux(以CentOS 7为例)安装
# 1. 卸载旧版本(如有)
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
# 2. 安装依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 3. 设置Docker仓库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 4. 安装Docker Engine
sudo yum install -y docker-ce docker-ce-cli containerd.io
# 5. 启动Docker并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker
# 6. 验证安装(出现版本信息即为成功)
docker --version
sudo docker run hello-world # 运行测试镜像,验证Docker可用
三、MySQL容器部署全流程实战
本章节以MySQL 8.0为例(最常用版本),从镜像拉取到容器运行,每一步都附详细说明。
3.1 拉取MySQL镜像
Docker镜像从Docker Hub仓库获取,先搜索MySQL镜像确认版本,再拉取指定版本(避免使用latest,版本不可控):
# 1. 搜索MySQL镜像
docker search mysql
# 2. 拉取MySQL 8.0镜像(:8.0指定版本)
docker pull mysql:8.0
# 3. 查看本地已拉取的镜像
docker images
# 输出类似如下结果,说明拉取成功
# REPOSITORY TAG IMAGE ID CREATED SIZE
# mysql 8.0 3218b38490ce 2 weeks ago 514MB
3.2 创建并启动MySQL容器
这是核心步骤,需通过命令指定MySQL的密码、端口映射、数据持久化等关键配置。先看基础版命令,再讲解进阶配置:
3.2.1 基础版:快速启动(适合测试)
# 格式:docker run [参数] 镜像名:版本
docker run -d \
--name mysql8 \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=Root@123456 \
mysql:8.0
参数解释:
-
-d:后台运行容器(守护进程模式),避免终端关闭后容器停止。 -
--name mysql8:给容器起别名“mysql8”,后续操作可直接用别名代替容器ID。 -
-p 3306:3306:端口映射,将宿主机的3306端口映射到容器的3306端口(宿主机端口:容器端口),外部通过宿主机3306访问MySQL。 -
-e MYSQL_ROOT_PASSWORD=Root@123456:设置MySQL的root用户密码(必须配置,否则容器启动失败)。
3.2.2 进阶版:数据持久化+字符集配置(适合开发/生产)
基础版有个致命问题:容器删除后MySQL数据会丢失。需通过“数据卷”将容器内的数据挂载到宿主机,同时配置UTF8字符集避免中文乱码:
# 1. 先在宿主机创建数据存储目录和配置目录(Linux/macOS)
mkdir -p /docker/mysql8/data /docker/mysql8/conf
# Windows(PowerShell)
# New-Item -Path "C:\docker\mysql8\data" -ItemType Directory -Force
# New-Item -Path "C:\docker\mysql8\conf" -ItemType Directory -Force
# 2. 创建并启动容器(Linux/macOS版本)
docker run -d \
--name mysql8 \
-p 3306:3306 \
-v /docker/mysql8/data:/var/lib/mysql \ # 数据卷挂载:宿主机目录:容器内MySQL数据目录
-v /docker/mysql8/conf:/etc/mysql/conf.d \ # 配置文件挂载
-e MYSQL_ROOT_PASSWORD=Root@123456 \
-e MYSQL_CHARSET=utf8mb4 \ # 数据库默认字符集
-e MYSQL_COLLATION=utf8mb4_general_ci \ # 数据库默认排序规则
--restart=always \ # 宿主机重启后,容器自动启动
mysql:8.0
Windows版本命令(仅修改挂载路径):
docker run -d `
--name mysql8 `
-p 3306:3306 `
-v C:\docker\mysql8\data:/var/lib/mysql `
-v C:\docker\mysql8\conf:/etc/mysql/conf.d `
-e MYSQL_ROOT_PASSWORD=Root@123456 `
-e MYSQL_CHARSET=utf8mb4 `
-e MYSQL_COLLATION=utf8mb4_general_ci `
--restart=always `
mysql:8.0
3.2.3 验证容器启动状态
# 1. 查看容器运行状态(Up状态表示正常)
docker ps
# 输出类似:
# CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# a1b2c3d4e5f6 mysql:8.0 "docker-entrypoint.s…" 5 minutes ago Up 5 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp mysql8
# 2. 查看容器日志(排查启动失败问题)
docker logs mysql8
# 若出现“Ready for connections”,说明MySQL服务已正常启动
四、MySQL容器核心操作实战
容器启动后,需掌握进入容器、操作MySQL、备份数据等常用命令,这些是日常开发的必备技能。
4.1 进入容器内操作MySQL
通过docker exec命令进入容器的终端,然后使用MySQL客户端连接:
# 1. 进入mysql8容器的bash终端(交互模式)
docker exec -it mysql8 /bin/bash
# 2. 在容器内登录MySQL(输入密码时无回显,输完回车即可)
mysql -u root -p
# 输入密码:Root@123456
# 3. 登录后执行MySQL命令(示例)
show databases; # 查看所有数据库
create database test_db; # 创建测试数据库
use test_db; # 切换到测试数据库
create table user(id int primary key auto_increment, name varchar(20)); # 创建表
insert into user(name) values('Docker'); # 插入数据
select * from user; # 查询数据
# 4. 退出MySQL和容器
exit # 退出MySQL客户端
exit # 退出容器终端
4.2 外部工具连接容器内MySQL
开发时更常用Navicat、DataGrip等工具远程连接,连接配置如下:
-
主机:宿主机IP(本地开发填localhost或127.0.0.1;远程服务器填服务器公网IP)。
-
端口:3306(即我们映射的宿主机端口)。
-
用户名:root。
-
密码:Root@123456(创建容器时设置的密码)。
-
数据库:可填具体数据库名(如test_db)或留空后续选择。
注意:若远程连接失败,需检查两点:① 宿主机防火墙是否开放3306端口;② MySQL是否允许root远程登录(MySQL 8.0默认允许,旧版本需手动授权)。
4.3 MySQL数据备份与恢复
基于数据卷挂载的特性,可直接备份宿主机挂载目录,也可通过Docker命令导出SQL文件:
4.3.1 备份:导出MySQL数据为SQL文件
# 格式:docker exec 容器名 mysqldump -u用户名 -p密码 数据库名 > 宿主机备份路径
# 示例:备份test_db数据库到宿主机的/docker/backup目录
mkdir -p /docker/backup # 先创建备份目录
docker exec mysql8 mysqldump -u root -pRoot@123456 test_db > /docker/backup/test_db_$(date +%Y%m%d).sql
# Windows版本(PowerShell)
# New-Item -Path "C:\docker\backup" -ItemType Directory -Force
# docker exec mysql8 mysqldump -u root -pRoot@123456 test_db > C:\docker\backup\test_db_$(Get-Date -Format 'yyyyMMdd').sql
4.3.2 恢复:从SQL文件导入数据
# 1. 先在MySQL中创建空数据库(若不存在)
docker exec -it mysql8 mysql -u root -p -e "create database if not exists test_db;"
# 2. 导入SQL文件到数据库
# 格式:cat 宿主机SQL路径 | docker exec -i 容器名 mysql -u用户名 -p密码 数据库名
cat /docker/backup/test_db_20240520.sql | docker exec -i mysql8 mysql -u root -pRoot@123456 test_db
# Windows版本(PowerShell)
# Get-Content C:\docker\backup\test_db_20240520.sql | docker exec -i mysql8 mysql -u root -pRoot@123456 test_db
4.4 容器日常管理命令
# 1. 停止容器
docker stop mysql8
# 2. 启动已停止的容器
docker start mysql8
# 3. 重启容器
docker restart mysql8
# 4. 查看容器详细信息(包括IP、挂载、网络等)
docker inspect mysql8
# 5. 删除容器(需先停止,-f强制删除运行中的容器)
docker stop mysql8
docker rm mysql8
# 6. 删除MySQL镜像(需先删除依赖该镜像的所有容器)
docker rmi mysql:8.0
五、进阶配置:自定义MySQL参数
实际开发中常需修改MySQL配置(如最大连接数、超时时间),可通过挂载配置文件实现:
# 1. 在宿主机的配置目录创建MySQL配置文件
vi /docker/mysql8/conf/my.cnf # Linux/macOS
# Windows:直接在C:\docker\mysql8\conf创建my.cnf文件
# 2. 写入自定义配置(示例)
[mysqld]
max_connections = 1000 # 最大连接数
wait_timeout = 600 # 连接超时时间(秒)
interactive_timeout = 600
default-storage-engine = InnoDB # 默认存储引擎
# 3. 重启容器使配置生效
docker restart mysql8
# 4. 验证配置是否生效(进入容器内执行)
docker exec -it mysql8 mysql -u root -p -e "show variables like 'max_connections';"
六、常见问题排查
-
容器启动失败,日志提示“Access denied for user ‘root’@‘localhost’”:密码设置不符合MySQL 8.0的强度要求(需包含大小写字母、数字、特殊符号),重新创建容器并设置强密码。
-
外部工具连接超时:① 检查容器是否正常运行(docker ps);② 检查宿主机防火墙是否开放3306端口(Linux:sudo firewall-cmd --zone=public --add-port=3306/tcp --permanent);③ 远程服务器需在安全组开放3306端口。
-
容器删除后数据丢失:未配置数据卷挂载,需重新创建容器并加上-v参数挂载数据目录。
-
MySQL中文乱码:创建容器时未配置字符集,需重新创建容器并指定MYSQL_CHARSET和MYSQL_COLLATION环境变量。
总结
Docker部署MySQL的核心是“镜像拉取-容器创建-数据持久化”三大步骤,关键在于掌握docker run的参数配置(尤其是端口映射、数据卷、环境变量)。相比传统部署方式,Docker容器化不仅简化了安装流程,还解决了环境一致性问题,非常适合开发、测试及小规模生产环境。
918

被折叠的 条评论
为什么被折叠?



