用 Docker 安装并启动 MySQL:从零到实战的完整指南
MySQL 是目前最流行的关系型数据库之一,广泛应用于各类应用系统中。使用 Docker 部署 MySQL 可以极大简化环境配置,保证开发、测试和生产环境的一致性。本文将详细介绍如何使用 Docker 安装、配置和管理 MySQL 容器,适合初学者快速上手。
一、准备工作:安装 Docker 环境
在开始之前,请确保你的系统已经安装了 Docker。如果尚未安装,可以按照以下步骤操作:
1. 安装 Docker(以 Ubuntu 为例)
bash
# 更新系统包索引
sudo apt-get update
# 安装必要的依赖包
sudo apt-get install -y ca-certificates curl gnupg lsb-release
# 添加Docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 设置Docker稳定版仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装Docker引擎
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
# 启动Docker服务并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker
# 验证Docker是否安装成功
sudo docker --version
2. 安装 Docker(以 CentOS 为例)
bash
# 更新系统包
sudo yum update -y
# 安装Docker依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加Docker软件源
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装Docker引擎
sudo yum install -y docker-ce docker-ce-cli containerd.io
# 启动Docker服务并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker
# 验证Docker是否安装成功
sudo docker --version
3. 非 root 用户配置(可选)
为了避免每次使用docker
命令都需要sudo
权限,可以将当前用户添加到docker
用户组:
bash
sudo usermod -aG docker $USER
# 生效配置(需要重新登录)
newgrp docker
二、Docker 安装 MySQL:两种常用方式
方式 1:快速启动默认配置的 MySQL
如果只需要临时使用 MySQL 进行测试,最简单的方式是直接运行官方镜像:
bash
docker run --name mysql-test -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql:latest
参数说明:
--name mysql-test
:给容器命名为mysql-test
-e MYSQL_ROOT_PASSWORD=root
:设置 root 用户密码为 root-p 3306:3306
:将主机的 3306 端口映射到容器的 3306 端口-d
:后台运行容器mysql:latest
:使用最新版本的 MySQL 官方镜像
方式 2:自定义配置启动 MySQL(推荐生产环境)
对于实际生产环境,我们需要自定义 MySQL 配置,并确保数据持久化到主机,避免容器删除后数据丢失。
步骤 1:创建配置文件和数据目录
bash
# 创建存放MySQL配置、数据和日志的目录
mkdir -p /opt/mysql/{conf,data,logs}
# 设置目录权限(确保容器内用户可以读写)
sudo chmod -R 777 /opt/mysql
步骤 2:编写 MySQL 配置文件
创建并编辑 MySQL 配置文件:
bash
vi /opt/mysql/conf/my.cnf
添加以下基础配置(可根据需求调整):
ini
[mysqld]
# 数据库默认字符集
character-set-server=utf8mb4
# 数据库字符集对应一些排序等规则,注意要和character-set-server对应
collation-server=utf8mb4_unicode_ci
# 服务端口号
port=3306
# 数据库存储路径(容器内路径)
datadir=/var/lib/mysql
# 日志文件路径(容器内路径)
log-error=/var/log/mysql/error.log
# 允许最大连接数
max_connections=1000
# SQL模式
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
[client]
# 客户端默认字符集
default-character-set=utf8mb4
[mysql]
# MySQL客户端默认字符集
default-character-set=utf8mb4
步骤 3:启动 MySQL 容器
bash
docker run -d \
--name mysql \
--restart=always \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=your_secure_password \
-e TZ=Asia/Shanghai \
-v /opt/mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf \
-v /opt/mysql/data:/var/lib/mysql \
-v /opt/mysql/logs:/var/log/mysql \
mysql:8.0
参数详解:
--name mysql
:容器名称为 mysql--restart=always
:容器退出时自动重启-p 3306:3306
:端口映射,主机端口:容器端口-e MYSQL_ROOT_PASSWORD=your_secure_password
:设置 root 用户密码-e TZ=Asia/Shanghai
:设置时区为上海-v /opt/mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf
:挂载配置文件-v /opt/mysql/data:/var/lib/mysql
:挂载数据目录,实现数据持久化-v /opt/mysql/logs:/var/log/mysql
:挂载日志目录mysql:8.0
:使用 MySQL 8.0 版本(生产环境建议指定具体版本)
三、验证 MySQL 容器是否正常运行
1. 查看容器状态
bash
# 查看容器运行状态
docker ps | grep mysql
# 查看容器详细日志
docker logs mysql
如果看到类似ready for connections
的日志,说明 MySQL 启动成功。
2. 连接 MySQL 进行测试
bash
# 进入MySQL容器
docker exec -it mysql mysql -u root -p
# 输入密码后,测试创建数据库和表
mysql> CREATE DATABASE testdb;
mysql> USE testdb;
mysql> CREATE TABLE users (id INT, name VARCHAR(50));
mysql> INSERT INTO users VALUES (1, 'Docker MySQL');
mysql> SELECT * FROM users;
如果能正常执行以上 SQL 命令,说明 MySQL 工作正常。
四、MySQL 容器管理常用命令
1. 基本操作
bash
# 启动已停止的MySQL容器
docker start mysql
# 停止运行中的MySQL容器
docker stop mysql
# 重启MySQL容器
docker restart mysql
# 查看容器详细信息
docker inspect mysql
2. 配置文件更新
当需要修改 MySQL 配置时,只需更新主机上的/opt/mysql/conf/my.cnf
文件,然后重启容器即可:
bash
# 编辑配置文件
vi /opt/mysql/conf/my.cnf
# 重启容器使配置生效
docker restart mysql
3. 升级 MySQL 版本
bash
# 1. 停止并备份当前容器数据(关键步骤)
docker stop mysql
sudo cp -r /opt/mysql/data /opt/mysql/data_backup
# 2. 删除当前容器
docker rm mysql
# 3. 拉取新版本镜像
docker pull mysql:8.0.33 # 替换为目标版本
# 4. 使用相同命令启动新容器
docker run -d \
--name mysql \
--restart=always \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=your_secure_password \
-e TZ=Asia/Shanghai \
-v /opt/mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf \
-v /opt/mysql/data:/var/lib/mysql \
-v /opt/mysql/logs:/var/log/mysql \
mysql:8.0.33 # 使用新拉取的版本
五、安全最佳实践
- 设置强密码:务必为 root 用户设置复杂密码,避免使用简单密码
- 限制网络访问:生产环境建议通过防火墙限制 3306 端口的访问来源
- 使用固定版本镜像:避免使用
latest
标签,应指定具体版本(如mysql:8.0.33
) - 定期备份数据:虽然数据已持久化到主机,仍建议定期备份
/opt/mysql/data
目录 - 最小权限原则:运行容器时可考虑添加
--user
参数指定非 root 用户运行 - 启用 SSL 连接:生产环境应配置 MySQL 使用 SSL 加密客户端连接
- 定期更新镜像:及时更新 MySQL 镜像以获取安全补丁
六、常见问题解决
1. 容器启动后立即退出
检查日志定位问题:
bash
docker logs mysql
常见原因:配置文件错误、目录权限不足(可尝试调整/opt/mysql
目录权限)
2. 无法远程连接 MySQL
- 检查主机防火墙是否开放 3306 端口
- 确认 MySQL 用户是否允许远程连接(默认 root 用户只允许本地连接):
sql
-- 进入MySQL后执行 use mysql; update user set host = '%' where user = 'root'; flush privileges;
3. 数据持久化失败
- 确认挂载目录权限正确
- 检查日志文件是否有相关错误信息
- 确保启动命令中的数据目录挂载正确
4. 中文乱码问题
- 确保配置文件中已正确设置
character-set-server=utf8mb4
- 新建数据库和表时指定字符集:
sql
CREATE DATABASE testdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
总结
通过 Docker 安装和管理 MySQL 可以显著简化部署流程,提高环境一致性。本文介绍的方法既适用于开发测试环境,也可通过适当调整配置应用于生产环境。核心在于理解数据持久化的实现方式和容器与主机的交互机制,以便更好地管理和维护 MySQL 服务。