Docker入门实战:部署MySQL容器详解

Docker极简入门实战 3w人浏览 29人参与

前言

Docker的容器化技术彻底改变了应用部署方式,其“一次构建、到处运行”的特性,能完美解决MySQL部署中的环境不一致、配置繁琐等问题。本文针对Docker入门者,从环境准备到生产级配置,全程实战讲解MySQL容器的部署、使用与优化,所有命令可直接复制执行。


一、核心概念铺垫

在动手操作前,先明确两个Docker核心概念,避免后续混淆:

  • 镜像(Image):MySQL的“安装包”,包含MySQL运行所需的系统环境、依赖库和程序文件,是创建容器的基础。
  • 容器(Container):镜像的“运行实例”,是独立的沙箱环境,MySQL服务实际在容器中运行,容器可随时启动、停止、删除。

核心逻辑:拉取MySQL镜像 → 基于镜像创建容器 → 配置容器内MySQL → 使用MySQL服务


二、环境准备:安装Docker

部署MySQL容器前,需先完成Docker环境搭建,以下是主流系统的安装方法:

2.1 Windows 10/11 安装(推荐WSL2后端)

  1. 启用WSL2:打开“控制面板→程序→启用或关闭Windows功能”,勾选“适用于Linux的Windows子系统”“虚拟机平台”,重启电脑。
  2. 安装WSL2内核:从微软官网下载并安装内核更新包。
  3. 安装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容器化不仅简化了安装流程,还解决了环境一致性问题,非常适合开发、测试及小规模生产环境。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一切皆有迹可循

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值