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