在Docker上安装运行MySQL的详细步骤是什么

来源:网站建设作者:香港程序员头衔:程序员
导读:本期聚焦于香港程序员创作的《在Docker上安装运行MySQL的详细步骤是什么》,敬请观看详情。想在服务器上快速部署一套MySQL数据库,又不想经历繁琐的安装配置过程?Docker容器化方案是当前最省心的选择。本文详细讲解如何通过docker pull拉取MySQL官方镜像,用docker run命令启动容器并设置root密码、端口映射和数据持久化目录,同时介绍用docker-compose编排MySQL服务的写法。文中还整理了常见报错的处理办法,比如容器启动后自动退出、Navicat连接失败、字符集乱码等问题的排查思路,帮助你少走弯路,快速搭建稳定可用的容器化MySQL环境。

传统的MySQL安装方式需要在操作系统上下载安装包、配置环境变量、初始化数据目录,整个过程繁琐且容易出错,卸载残留也常常让人头疼。而使用Docker部署MySQL,只需要几条命令就能完成安装和启动,迁移环境时把容器和数据卷带走即可,非常方便。本文将从镜像拉取、容器启动、配置挂载、远程连接以及docker-compose编排几个方面,完整讲解在Docker上运行MySQL的全过程。

在Docker上安装运行MySQL的详细步骤是什么

一、拉取MySQL官方镜像

在启动容器之前,首先要从Docker Hub获取MySQL的官方镜像。MySQL官方镜像由Oracle维护,可靠性和更新频率都有保障。拉取镜像的命令很简单:

docker pull mysql:8.0

这里的8.0是镜像的版本标签,建议明确指定版本号而不是使用latest标签。因为latest指向的版本会随官方更新而变化,生产环境中使用不确定的版本号是大忌。如果不确定有哪些可用版本,可以到Docker Hub的官方页面查看Tags列表,常见的有8.0、8.4、5.7等。

拉取完成后,用下面的命令确认镜像已经存在于本地:

docker images | grep mysql

如果没有配置国内镜像加速,拉取速度可能非常慢甚至超时。可以在Docker的配置文件(Linux下一般是/etc/docker/daemon.json)中添加registry-mirrors地址,配置后执行systemctl restart docker重启Docker服务即可生效。这个配置是解决拉取超时问题的第一步,遇到拉取失败时优先检查这里。

二、启动MySQL容器并完成基础配置

镜像准备就绪后,就可以启动容器了。一条完整的启动命令如下:

docker run -d \
  --name mysql8 \
  -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD=your_password \
  -v /data/mysql/conf:/etc/mysql/conf.d \
  -v /data/mysql/data:/var/lib/mysql \
  --restart=unless-stopped \
  mysql:8.0

这条命令里有几个关键参数需要理解清楚。-d表示后台运行容器;--name给容器指定一个名字,方便后续管理;-p 3306:3306把宿主机的3306端口映射到容器的3306端口,冒号左边是宿主机端口,右边是容器端口,两者可以不同。

-e MYSQL_ROOT_PASSWORD用来设置root账户的初始密码,这是必填的环境变量,不设置的话容器会启动失败。-v参数做目录挂载,也就是数据持久化的关键:把容器内的数据目录和配置目录映射到宿主机上。如果不做挂载,容器一旦被删除,里面的所有数据都会跟着丢失,这在实际使用中是非常危险的。

另外还可以加一个常用环境变量MYSQL_DATABASE,容器首次启动时会自动创建指定的数据库,省去手动建库的步骤。如果宿主机的3306端口已被占用,把左边改成3307之类的端口即可,连接时注意使用对应端口。

启动后先检查容器状态,确认它是运行中的而不是反复重启:

docker ps -a | grep mysql8

如果状态显示Exited,可以用docker logs mysql8查看日志。最常见的原因是密码环境变量没写、端口冲突,或者挂载的配置文件里有语法错误,日志中一般都会给出明确提示。

三、进入容器、字符集配置与远程连接

容器跑起来之后,可以通过以下方式进入MySQL命令行进行验证:

docker exec -it mysql8 mysql -uroot -p

输入前面设置的root密码即可登录。登录后执行show databases;能看到系统库就说明服务正常。

接下来说说字符集问题。MySQL 8.0默认字符集已经是utf8mb4,一般不用额外配置;但如果使用的是5.7版本,默认还是latin1,插入中文会乱码。解决办法是在挂载的配置目录下新建一个my.cnf文件:

[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

[client]
default-character-set=utf8mb4

保存后重启容器docker restart mysql8即可生效,记得在挂载前就写好配置文件,或挂载后修改再重启。

默认情况下root只允许本地连接,如果要用Navicat等客户端从宿主机或远程机器连接,需要修改账户的host限制。登录MySQL后执行:

CREATE USER 'root'@'%' IDENTIFIED BY 'your_password';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
FLUSH PRIVILEGES;

如果远程连接时报错提示caching_sha2_password相关的认证插件问题,这是MySQL 8.0的新认证机制导致的,老版本客户端不兼容。可以在容器内把该用户的认证方式改回mysql_native_password:

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password';
FLUSH PRIVILEGES;

改完之后重新连接基本就能成功。如果还是连不上,依次检查防火墙或安全组是否放行了3306端口、容器是否处于运行状态、端口映射是否正确,这三个是最高频的原因。

四、用docker-compose编排MySQL服务

命令行参数一多就不好维护,实际项目中更推荐用docker-compose来管理。编写一个docker-compose.yml文件:

version: "3.8"
services:
  mysql:
    image: mysql:8.0
    container_name: mysql8
    restart: unless-stopped
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: your_password
      MYSQL_DATABASE: mydb
      TZ: Asia/Shanghai
    volumes:
      - /data/mysql/conf:/etc/mysql/conf.d
      - /data/mysql/data:/var/lib/mysql
    command:
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_unicode_ci

在这个文件里,environment中的TZ设置时区很重要,不设置的话容器内时间可能是UTC,导致日志时间和业务时间相差八小时。command字段可以直接追加MySQL的启动参数,相当于临时改配置,不需要写配置文件。

写好后在文件所在目录执行docker compose up -d即可启动,停止服务用docker compose down。需要注意的是,down命令默认不会删除挂载的数据目录,数据依然保留在宿主机上,这也是前面强调挂载目录的意义所在。

日常运维中还有几个常用命令值得记住:docker stats可以查看容器资源占用,方便评估内存配置;MySQL 8.0默认占用内存偏高,小内存服务器上可以在配置中限制innodb_buffer_pool_size来优化。掌握了以上内容,从单机开发到中小规模生产环境,用Docker跑MySQL都能应对自如。

Docker安装MySQLDocker容器数据库部署修改时间:2026-09-06 20:16:39

免责声明:已尽一切努力确保本网站所含信息的准确性。网站作品多为原创整理与精心创作,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们进行处理Email:chomcom@qq.com。
引用或转载本作品时,请注明当前出处:https://www.ipipp.com/html/20260906/51771.html,基于非商业用途的前提下,欢迎转载或二创本作品。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。