Docker 安装 MySQL(长文讲解)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观
前言
在现代软件开发中,数据库的部署与管理是开发者必须掌握的核心技能之一。MySQL 作为全球最受欢迎的关系型数据库之一,其安装与配置过程常因环境差异导致问题。而 Docker 的出现,为这一流程带来了革命性变化——它通过容器化技术,将复杂环境依赖封装为标准化的“黑匣子”,让开发者能够快速、安全地运行 MySQL 服务。
本文将以 Docker 安装 MySQL 为核心,从零开始讲解技术原理、操作步骤与进阶配置。无论是编程初学者还是中级开发者,都能通过本文掌握如何利用 Docker 快速搭建 MySQL 环境,并解决常见问题。
技术背景与核心概念
什么是 Docker?
Docker 是一种容器化技术,它允许开发者将应用程序及其依赖项打包到一个独立的容器中。你可以将容器想象为一个“迷你操作系统”——它包含运行程序所需的所有资源(如文件、库、环境变量),但体积小巧且启动迅速。通过 Docker,开发者无需关心宿主机(物理或虚拟机)的环境差异,只需专注于应用程序本身。
为什么选择 Docker 安装 MySQL?
传统安装 MySQL 的流程通常涉及配置操作系统、安装依赖库、手动设置权限等步骤,稍有不慎就可能导致兼容性问题。而 Docker 的优势在于:
- 环境一致性:容器内的 MySQL 环境与官方镜像完全一致,避免因宿主机配置差异导致的问题。
- 快速部署:通过一行命令即可启动 MySQL 服务,省去手动安装时间。
- 隔离性:每个容器相互独立,即使多个 MySQL 实例运行在同一台机器上,也不会互相干扰。
- 版本控制:Docker Hub 提供了 MySQL 各版本的官方镜像,方便开发者按需选择(例如 MySQL 5.7 或 8.0)。
步骤 1:安装 Docker
系统要求
确保你的操作系统支持 Docker。本文以 Ubuntu 22.04 LTS 为例,其他系统(如 macOS 或 Windows)的安装步骤可参考 Docker 官方文档。
安装命令
sudo apt-get update
sudo apt-get install docker.io
docker --version
若输出类似 Docker version 20.10.7, build f0df350
,则说明 Docker 已成功安装。
步骤 2:拉取 MySQL 官方镜像
Docker Hub 是 Docker 镜像的官方仓库。MySQL 官方镜像提供了经过认证的数据库环境,避免了手动安装的繁琐流程。
拉取镜像命令
docker pull mysql:latest
此命令会下载最新版本的 MySQL 镜像。若需指定版本(如 5.7
),可替换为:
docker pull mysql:5.7
验证镜像
docker images
输出结果中应包含 mysql
长的镜像列表,如:
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest abc123... 2 weeks ago 512MB
步骤 3:运行 MySQL 容器
基础运行命令
使用 docker run
命令启动容器,核心参数说明如下:
-d
:后台运行容器-p 3306:3306
:将容器的 3306 端口映射到宿主机的 3306 端口-e MYSQL_ROOT_PASSWORD
:设置 MySQL 根用户密码--name mysql_container
:指定容器名称
docker run \
-d \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=my-secret-pw \
--name mysql_container \
mysql:latest
参数详解与比喻
- 端口映射
-p
:如同在房子墙上开一个“窗口”,让外部网络能够通过宿主机的 3306 端口访问容器内的 MySQL 服务。 - 环境变量
-e
:容器内的 MySQL 需要密码才能启动,-e
参数的作用类似于“传递钥匙”,确保容器能安全启动。 - 容器名称
--name
:方便后续通过名称管理容器(如停止、删除)。
步骤 4:验证 MySQL 服务
检查容器状态
docker ps
若容器运行正常,输出中应包含 mysql_container
,且 STATUS
列显示为 Up X minutes
。
连接 MySQL
通过 docker exec
命令进入容器内部,使用 MySQL 客户端连接:
docker exec -it mysql_container mysql -u root -p
输入之前设置的密码(my-secret-pw
),若成功进入 MySQL 命令行界面,则安装完成。
进阶配置:数据持久化与自定义设置
问题:容器删除后数据丢失怎么办?
Docker 容器的默认数据存储在内存中,若容器被删除或崩溃,数据将丢失。因此,需通过 数据卷(Volumes) 或 绑定挂载(Bind Mounts) 实现数据持久化。
方法 1:使用数据卷
docker run \
-d \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=my-secret-pw \
-v mysql_data:/var/lib/mysql \
--name mysql_container \
mysql:latest
-v mysql_data:/var/lib/mysql
表示:
- 将宿主机上的数据卷
mysql_data
挂载到容器的/var/lib/mysql
(MySQL 默认数据目录)。 - 即使容器被删除,数据卷中的数据仍会保留。
方法 2:绑定挂载自定义目录
docker run \
-d \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=my-secret-pw \
-v /path/to/local/data:/var/lib/mysql \
--name mysql_container \
mysql:latest
此命令将宿主机的 /path/to/local/data
目录直接挂载到容器,适合需要手动管理数据的场景。
常见问题与解决方案
问题 1:端口已被占用
若运行容器时提示 port is already allocated
,说明宿主机的 3306 端口已被其他进程占用。可通过以下方式解决:
- 更换端口映射:
docker run -p 3307:3306 ...
此时,MySQL 服务将通过宿主机的 3307 端口对外提供。
- 停止占用进程:
sudo netstat -tulpn | grep :3306 sudo kill -9 <PID>
问题 2:忘记 MySQL 密码
若未设置环境变量 MYSQL_ROOT_PASSWORD
,MySQL 会随机生成一个临时密码,该密码存储在容器的日志中。可通过以下命令查看:
docker logs mysql_container
在日志中搜索 A temporary password
,找到密码后通过以下步骤重置:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new-password';
实战案例:搭建多版本 MySQL 开发环境
场景需求
假设你需要同时运行 MySQL 8.0 和 5.7 用于兼容性测试。
步骤:
-
创建两个容器,分别指定不同版本和端口:
# MySQL 8.0(默认端口 3306) docker run -d -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=pass8 \ --name mysql_8 \ mysql:8.0 # MySQL 5.7(指定端口 3307) docker run -d -p 3307:3306 \ -e MYSQL_ROOT_PASSWORD=pass5 \ --name mysql_5_7 \ mysql:5.7
-
通过不同端口访问两个实例:
# 连接 MySQL 8.0 mysql -h 127.0.0.1 -P 3306 -u root -p # 连接 MySQL 5.7 mysql -h 127.0.0.1 -P 3307 -u root -p
结论
通过本文的讲解,你已掌握了 Docker 安装 MySQL 的全流程,包括环境准备、镜像拉取、容器运行、数据持久化及多版本管理。Docker 的容器化技术不仅简化了部署流程,还通过标准化环境降低了开发与运维的复杂度。
对于开发者而言,Docker 安装 MySQL 是提升效率、保障环境一致性的理想选择。无论是个人项目还是团队协作,这一方案都能快速落地。接下来,你可以尝试将此技能应用于实际开发中,例如:
- 在本地搭建完整的微服务数据库集群
- 配合 CI/CD 流水线实现自动化部署
- 通过 Docker Compose 管理多容器依赖
若有任何疑问或需要进一步优化配置,欢迎在评论区留言讨论!