Docker 安装 MySQL 完整教程:从零部署数据库,到生产环境持久化配置

很多后端开发者第一次接触 Docker,最常部署的服务之一就是 MySQL。

以前安装 MySQL:

text 复制代码
下载 MySQL
↓
安装依赖
↓
修改配置
↓
初始化数据库
↓
创建用户
↓
配置权限
↓
启动服务

换一台服务器,又重新来一遍。

Docker 之后:

bash 复制代码
docker run mysql

几秒钟启动一个完整 MySQL 环境。

MySQL 官方也提供了维护的 Docker 镜像,可以直接通过 Docker Hub 获取。(Docker Hub)

但是生产环境真正使用 Docker 部署 MySQL,并不是只会:

bash 复制代码
docker run mysql

还需要考虑:

  • 数据持久化
  • 用户权限
  • 配置文件
  • 字符集
  • 数据备份
  • 容器升级
  • Docker Compose 管理

这篇文章从开发环境到生产实践,完整讲清楚 Docker 部署 MySQL。


一、为什么推荐用 Docker 部署 MySQL?

传统安装:

text 复制代码
服务器

↓

Linux

↓

安装 MySQL

↓

修改配置

↓

启动服务

问题:

1. 环境不一致

开发:

text 复制代码
MySQL 8.0

测试:

text 复制代码
MySQL 5.7

生产:

text 复制代码
MySQL 8.4

容易出现:

text 复制代码
开发正常

线上报错

2. 多版本切换麻烦

比如:

项目 A:

text 复制代码
MySQL 5.7

项目 B:

text 复制代码
MySQL 8.0

传统安装:

需要不停卸载。

Docker:

直接:

bash 复制代码
docker run mysql:5.7

docker run mysql:8.0

两个环境同时存在。


3. 新机器部署速度慢

Docker:

bash 复制代码
docker compose up -d

几分钟恢复环境。


二、安装 Docker

Ubuntu 安装 Docker

更新:

bash 复制代码
sudo apt update

安装:

bash 复制代码
sudo apt install docker.io

启动:

bash 复制代码
sudo systemctl start docker

设置开机启动:

bash 复制代码
sudo systemctl enable docker

查看版本:

bash 复制代码
docker version

输出:

text 复制代码
Docker version 27.x

三、拉取 MySQL Docker 镜像

MySQL 官方镜像:

bash 复制代码
docker pull mysql:8.0

查看:

bash 复制代码
docker images

结果:

text 复制代码
REPOSITORY   TAG

mysql        8.0

建议生产环境不要使用:

bash 复制代码
mysql:latest

因为:

未来版本变化可能导致兼容问题。

推荐:

bash 复制代码
mysql:8.0

或者:

bash 复制代码
mysql:8.4

固定版本。


四、最简单启动 MySQL

执行:

bash 复制代码
docker run \
-d \
--name mysql8 \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:8.0

解释:

-d

后台运行:

text 复制代码
detached

--name

容器名字:

bash 复制代码
mysql8

以后:

bash 复制代码
docker stop mysql8

-p

端口映射:

bash 复制代码
-p 3306:3306

表示:

text 复制代码
宿主机3306

↓

容器3306

MYSQL_ROOT_PASSWORD

初始化 root 密码:

bash 复制代码
-e MYSQL_ROOT_PASSWORD=123456

查看:

bash 复制代码
docker ps

看到:

text 复制代码
mysql8

0.0.0.0:3306->3306

说明启动成功。


五、进入 MySQL 容器

查看:

bash 复制代码
docker exec -it mysql8 bash

进入:

text 复制代码
root@container

登录:

bash 复制代码
mysql -uroot -p

输入密码:

text 复制代码
123456

进入:

sql 复制代码
mysql>

查看数据库:

sql 复制代码
show databases;

创建数据库:

sql 复制代码
CREATE DATABASE demo;

查看:

sql 复制代码
show databases;

六、为什么直接 docker run MySQL 不够?

刚才启动:

bash 复制代码
docker run mysql

有一个严重问题:

数据在哪里?

如果:

bash 复制代码
docker rm mysql8

删除容器。

数据可能一起消失。

数据库最重要的是:

text 复制代码
数据

所以必须使用 Volume。


七、MySQL 数据持久化 Volume

创建目录:

bash 复制代码
mkdir -p /data/mysql

启动:

bash 复制代码
docker run \
-d \
--name mysql8 \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-v /data/mysql:/var/lib/mysql \
mysql:8.0

关键:

bash 复制代码
-v

宿主机目录

:

容器目录

这里:

text 复制代码
/data/mysql

↓

/var/lib/mysql

MySQL 数据文件:

text 复制代码
ibdata1

binlog

数据库文件

都会保存。


现在删除容器:

bash 复制代码
docker rm -f mysql8

重新启动:

bash 复制代码
docker run \
-d \
--name mysql8 \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-v /data/mysql:/var/lib/mysql \
mysql:8.0

数据仍然存在。


八、使用 Docker Compose 部署 MySQL(推荐)

实际项目中,我更推荐:

text 复制代码
docker-compose.yml

因为配置可以保存到 Git。

创建:

bash 复制代码
mkdir mysql-docker

cd mysql-docker

创建:

bash 复制代码
vim docker-compose.yml

内容:

yaml 复制代码
version: "3.8"

services:

  mysql:

    image: mysql:8.0

    container_name: mysql8

    restart: always


    environment:

      MYSQL_ROOT_PASSWORD: 123456

      MYSQL_DATABASE: demo

      MYSQL_USER: app

      MYSQL_PASSWORD: app123


    ports:

      - "3306:3306"


    volumes:

      - ./mysql-data:/var/lib/mysql

      - ./conf:/etc/mysql/conf.d


    command:

      --character-set-server=utf8mb4

      --collation-server=utf8mb4_unicode_ci

启动:

bash 复制代码
docker compose up -d

查看:

bash 复制代码
docker compose ps

九、Docker Compose 配置详解

image

yaml 复制代码
image:mysql:8.0

使用 MySQL 官方镜像。


restart

yaml 复制代码
restart: always

服务器重启:

自动恢复。

生产环境非常重要。


environment

初始化:

yaml 复制代码
MYSQL_DATABASE: demo

自动创建:

sql 复制代码
demo

创建普通用户:

yaml 复制代码
MYSQL_USER: app
MYSQL_PASSWORD: app123

避免业务直接使用 root。


十、MySQL 字符集配置

很多项目遇到:

中文乱码:

text 复制代码
???

原因:

默认字符集:

text 复制代码
latin1

推荐:

text 复制代码
utf8mb4

配置:

yaml 复制代码
command:

--character-set-server=utf8mb4

--collation-server=utf8mb4_unicode_ci

进入 MySQL:

sql 复制代码
show variables like 'character%';

查看:

text 复制代码
utf8mb4

十一、连接 MySQL

本机连接

bash 复制代码
mysql \
-h127.0.0.1 \
-P3306 \
-uroot \
-p

配置:

text 复制代码
Host:

127.0.0.1


Port:

3306


User:

root


Password:

123456

十二、后端项目连接 Docker MySQL

例如 SpringBoot:

错误:

yaml 复制代码
spring:
 datasource:
  url: jdbc:mysql://localhost:3306/demo

为什么?

因为:

localhost 指向当前容器。

如果后端也是 Docker:

应该:

yaml 复制代码
spring:
 datasource:
  url: jdbc:mysql://mysql:3306/demo

因为:

Compose 会自动提供 DNS:

text 复制代码
mysql

↓

MySQL容器

Go 项目:

go 复制代码
dsn := "root:123456@tcp(mysql:3306)/demo"

十三、查看 MySQL 日志

启动失败:

第一步:

bash 复制代码
docker logs mysql8

实时:

bash 复制代码
docker logs -f mysql8

常见:

密码错误

text 复制代码
MYSQL_ROOT_PASSWORD missing

解决:

重新创建:

bash 复制代码
-e MYSQL_ROOT_PASSWORD=password

端口占用

错误:

text 复制代码
Bind for 0.0.0.0:3306 failed

查看:

bash 复制代码
netstat -tunlp | grep 3306

修改:

yaml 复制代码
ports:

 - "3307:3306"

十四、备份 MySQL 数据

生产环境最重要:

备份。

导出:

bash 复制代码
docker exec mysql8 \
mysqldump \
-u root \
-p demo \
> demo.sql

恢复:

bash 复制代码
docker exec -i mysql8 \
mysql \
-u root \
-p demo \
< demo.sql

十五、升级 MySQL 版本

例如:

MySQL 8.0

升级:

MySQL 8.4

流程:

1. 备份

bash 复制代码
mysqldump

2. 停止

bash 复制代码
docker compose down

3. 修改版本

之前:

yaml 复制代码
image:mysql:8.0

改:

yaml 复制代码
image:mysql:8.4

4. 启动

bash 复制代码
docker compose up -d

十六、国内 Docker Hub 镜像访问问题

很多国内开发者遇到:

bash 复制代码
docker pull mysql:8.0

速度慢。

甚至:

text 复制代码
timeout

connection reset

原因:

默认:

text 复制代码
Docker Hub

↓

海外节点

↓

国内网络

访问不稳定。

针对 Docker Hub 镜像访问问题,我维护了:

https://github.com/Rodert/dockerhub

核心思路:

text 复制代码
Docker Hub

↓

国内镜像源

↓

开发者

配置:

编辑:

bash 复制代码
vim /etc/docker/daemon.json

添加:

json 复制代码
{
 "registry-mirrors":[
    "你的镜像地址"
 ]
}

重启:

bash 复制代码
systemctl restart docker

查看:

bash 复制代码
docker info

确认:

text 复制代码
Registry Mirrors

十七、王仕宇对 Docker + MySQL 的理解

我一直认为:

Docker 最大价值不是让安装 MySQL 变简单,而是让数据库环境变得可复制。

以前:

一个新人加入项目:

text 复制代码
安装 MySQL
配置账号
导入 SQL
修改配置
踩坑

可能半天。

现在:

项目提供:

text 复制代码
docker-compose.yml

新人:

bash 复制代码
docker compose up -d

几分钟启动完整环境。


但是数据库和普通应用不同。

MySQL 最大的问题不是启动。

而是:

text 复制代码
数据安全
配置管理
备份恢复
版本升级
权限控制

所以真正生产级 Docker MySQL:

不是:

bash 复制代码
docker run mysql

而是:

text 复制代码
固定版本

+

Volume

+

备份

+

配置文件

+

权限隔离

+

监控

十八、总结

Docker 部署 MySQL 核心流程:

text 复制代码
安装 Docker

↓

拉取 MySQL 镜像

↓

创建容器

↓

配置端口

↓

配置 Volume

↓

创建用户

↓

连接数据库

↓

备份数据

开发环境:

bash 复制代码
docker compose up -d

生产环境:

需要额外考虑:

text 复制代码
数据持久化

安全

备份

监控

升级

Docker 不是简单替代 MySQL 安装方式。

它真正改变的是:

数据库环境从"人工配置"变成"代码化管理"。

这也是未来 AI Coding 时代非常重要的一环:

AI 可以帮你生成业务代码,但最终项目能不能稳定运行,依然离不开 Docker、数据库和部署工程能力。

相关推荐
隔窗听雨眠1 小时前
MySQL整库迁移至KaiwuDB完全指南:从数据类型映射到生产切换的系统性实践
数据库·mysql
xhbh6661 小时前
中小企业 Redis 运维,如何安全归档 RDB、AOF 备份文件?
运维·数据库·缓存·数据备份·文件备份·同步备份·号码备份
2301_32241428042 小时前
活力孕康复APP 47737- 原创(免费领源码+部署教程+开发环境)
java·vue.js·spring boot·mysql·微信小程序·idea·微信开发者工具
勤奋的树懒2 小时前
从手写 SQL 到 Windows 工具:致远 OA 文件清理实践
数据库·sql·windows server·致远oa
笃行3502 小时前
OceanBaseVS金仓:一条 SQL 的两条路——KingbaseES 的性能竞争力从哪来
数据库
其实防守也摸鱼2 小时前
每天一个知识点——RCE漏洞
运维·服务器·数据库·windows·安全·github·漏洞
TDengine (老段)2 小时前
TDengine 常见问题 TOP2
大数据·数据库·物联网·时序数据库·tdengine·涛思数据
笃行3502 小时前
数据迁移工具 KDMS 帮我把一本糊涂账算清了
数据库
努力努力再努力wz2 小时前
【Docker 入门系列】:从 Namespace、CGroup 到 LXC:理解容器运行时、rootfs 与 LXC 实战
运维·docker·容器