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 的优势在于:

  1. 环境一致性:容器内的 MySQL 环境与官方镜像完全一致,避免因宿主机配置差异导致的问题。
  2. 快速部署:通过一行命令即可启动 MySQL 服务,省去手动安装时间。
  3. 隔离性:每个容器相互独立,即使多个 MySQL 实例运行在同一台机器上,也不会互相干扰。
  4. 版本控制: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 端口已被其他进程占用。可通过以下方式解决:

  1. 更换端口映射
    docker run -p 3307:3306 ...  
    

    此时,MySQL 服务将通过宿主机的 3307 端口对外提供。

  2. 停止占用进程
    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 用于兼容性测试。

步骤:

  1. 创建两个容器,分别指定不同版本和端口:

    # 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  
    
  2. 通过不同端口访问两个实例:

    # 连接 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 管理多容器依赖

若有任何疑问或需要进一步优化配置,欢迎在评论区留言讨论!

最新发布