☰
VMware虚拟机CentOS7中用Docker安装MySQL完整实操指南
2026/10/6 22:55:15 网站建设 项目流程

最近好几个做后端的朋友都在折腾同一件事:在自己电脑的虚拟机里搭一套CentOS7,再用Docker把MySQL跑起来。这个组合在开发环境、学习场景里实在太常见了,不管是模拟生产、练手Linux,还是想给团队统一一套数据库环境,几乎都绕不过它。这篇内容就把我从零开始,在VMware虚拟机里装好CentOS7之后,装Docker、再装MySQL的完整过程写清楚,包括每个命令为什么要这么写、中间会踩哪些坑,适合刚接触Linux的开发者,也适合已经被“docker安装mysql失败”折磨过几次的运维新手。

我的习惯是先把结论放前面:这套东西并不难,难点全在看不见的细节上,比如网络通不通、yum源能不能用、端口有没有暴露、数据有没有挂载出来。下面按我实际操作的顺序来写,跟着走一遍能少走很多弯路。

1. 动手前先把三件事想清楚

1.1 为什么是“虚拟机 + CentOS7 + Docker + MySQL”这套组合

先从选型讲起。很多人拿到一台虚拟机就急着装MySQL,但我建议你先花两分钟搞清楚“为什么这么搭”,因为后面遇到问题时,这些判断能帮你快速定位到底出在哪个环节。

虚拟机解决的是“折腾不坏宿主机”的问题。你可以在里面随便装系统、乱配服务、反复删了重来,最多打个快照就回滚了,对Windows或macOS本体没有任何影响。而且虚拟机的网络模式(尤其是NAT模式)相当于给你一个独立的局域网环境,非常适合练习数据库端口映射、防火墙这些操作。

CentOS7是服务器场景里的“老熟人”。虽然它已经进入了维护周期的尾声,但大量线上服务器、公司内部文档、培训机构教材都还在用它。对想进运维或后端岗位的人来说,熟悉CentOS7的yum、systemd、firewalld这套操作,目前依然是刚需。

Docker在这里的价值可以用一句话概括:让MySQL以“可复制的黑盒”方式运行。传统rpm安装MySQL也不是不行,但你会遇到依赖冲突、多版本切换困难、卸载不干净、配置文件散落各处等问题。用Docker的话,镜像拉下来直接跑,删了重来只损失容器本身,数据通过数据卷保存在外部,底层系统始终干干净净。我经常拿装修来类比:rpm安装像自己买材料请工人,Docker像直接租了一套精装房,家具家电都给你配好,你只管拎包入住。

这套组合还有一个隐藏好处:方便模拟“本地和服务端一致”的环境。你在虚拟机里调好的这套MySQL配置,将来可以直接照搬到云服务器或者同事的机器上,只要大家用的都是CentOS7 + Docker,行为就基本一致,不会再出现“我本地能跑你本地跑不了”的尴尬。

1.2 解决CentOS7上网和yum源的“第一道坎”

很多人兴致勃勃装完CentOS7,敲了个yum install -y vim,结果卡了半天最后超时。这时候你去看,多半是网络没通,或者默认yum源慢到发指。

先说网络。虚拟机里CentOS7最常见的网络故障就是“ping不通百度”。我用VMware举例,排查顺序基本是固定的:

  1. 先看虚拟机的网络模式是不是NAT。在VMware里选中虚拟机,右键设置,网络适配器选“NAT模式”。NAT模式下虚拟机通过宿主机上网,对新手最友好,桥接模式反而容易因为路由器限制而连不上。
  2. 进系统后执行ip addr,看网卡有没有分配到IP。如果只有一个lo回环地址没有ens33或eth0的IP,说明网卡没起来。CentOS7里可以执行systemctl restart network重启网络服务,或者ifup ens33手动拉起网卡。
  3. 能ping通网关但ping不通外网,大概率是DNS问题。修改/etc/resolv.conf,加一行nameserver 223.5.5.5(阿里DNS)或者nameserver 8.8.8.8,再测ping -c 4 www.baidu.com。如果你以后建容器、拉镜像,DNS不对几乎一定失败。

注意:/etc/resolv.conf在某些情况下会被NetworkManager覆盖,如果改了又变回去,去/etc/sysconfig/network-scripts/ifcfg-ens33里把DNS1=223.5.5.5加上,再重启网络。

网络通了之后,立刻换国内yum源。CentOS7默认源在国外,下载速度经常只有几十KB,换源之后的体验是质的飞跃。操作很简单:

# 先备份原源文件 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak # 下载阿里云CentOS7源 curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo # 清缓存并重建 yum clean all yum makecache

顺手把常用软件包装上,后面都会用到:

yum install -y vim net-tools wget curl

这里有个细节必须提醒:如果你的虚拟机是刚装好的最小化系统,可能连curl都没有。那就换个思路,把repo文件里的地址记下来,直接在宿主机浏览器下载Centos-7.repo,再通过共享文件夹或者拖拽方式放进虚拟机。别笑,我真的见过有人在最小化系统里卡在这一步卡了半小时。

2. 安装Docker:三种来源怎么选,装完必做的三件事

2.1 官方源、国内镜像源、离线rpm:我为什么选国内镜像源

Docker在CentOS7上的安装方式,常见的有三种:CentOS自带yum源里的老版本Docker、Docker官方源、国内镜像源,以及内网环境的离线rpm包。

先避开一个坑:直接用yum install docker装出来的通常是Docker 1.13,版本太老,很多新特性不支持,跑MySQL虽然能用,但后续管理起来麻烦。所以不建议这个方式。

Docker官方源download.docker.com/linux/centos/docker-ce.repo是最权威的,但国内服务器或虚拟机访问它经常超时,尤其是刚配好的虚拟机,网络质量本来就一般,不建议把时间耗在这里。我的选择是直接用阿里云的Docker社区版源,速度快、稳定,配置方式也不复杂。

如果你在内网或者离线环境,那就只能用离线rpm包。去能联网的机器上下载docker-ce、docker-ce-cli、containerd.io等几个rpm,拷进去用rpm -ivh按依赖顺序安装,或者yum localinstall *.rpm自动解决依赖。这个方案我没展开细讲,因为对新手来说,先保证能联网才是王道。

阿里云源的安装命令是这样:

# 安装依赖工具 yum install -y yum-utils device-mapper-persistent-data lvm2 # 添加阿里云docker-ce源 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 安装docker-ce yum install -y docker-ce docker-ce-cli containerd.io

yum-config-manager来自yum-utils,所以顺序不能乱,先装工具再添加repo。安装过程如果看到一堆依赖被自动处理,就说明源正常工作。

2.2 启动服务、配置加速器、免sudo,一个都不能少

Docker安装好之后不要急着拉MySQL镜像,先做三件收尾工作。

第一,启动Docker并设置开机自启:

systemctl start docker systemctl enable docker

enable这一步很重要,否则虚拟机重启后Docker不会自动启动,容器自然也起不来。检查是否成功:

systemctl status docker

第二,配置镜像加速器。这一步解决的是“拉镜像慢”的问题。Docker默认从Docker Hub拉镜像,国内网络环境经常慢到无法接受。修改/etc/docker/daemon.json:

{ "registry-mirrors": [ "https://你个人加速器地址.mirror.aliyuncs.com" ] }

加速器地址需要自己去阿里云容器镜像服务控制台查看,每个人绑定的地址不同。修改后重启Docker:

systemctl daemon-reload systemctl restart docker docker info | grep -A5 "Registry Mirrors"

能看到加速器列表就说明生效了。

第三,把当前用户加进docker组,省得每次敲命令都要加sudo:

usermod -aG docker $USER newgrp docker

这里注意,newgrp docker之后当前终端临时生效,如果你用的是SSH连接,可能需要退出重登一下。加完之后直接docker version测试,能输出就说明没问题。

个人经验:过去我图省事,经常直接顶着root用户操作Docker,后来发现生产环境里这种习惯很危险。容器里有漏洞就等于宿主机被突破了,一定不要用root身份跑日常命令。现在加docker组这个动作已经是我的新环境初始化标配。

3. MySQL版本和容器启动参数拆解

3.1 5.7还是8.0:先给项目“体检”再选版本

MySQL镜像选择是很多人纠结的地方,其实核心就两个版本:5.7和8.0。

我见过太多人上来就docker pull mysql:latest,结果拉下来是8.0,项目里的老代码用的还是5.7的方言,连接驱动也是旧版,启动一通报错。反过来,新项目用5.7也不是不行,但以后迟早要面临升级迁移。

先看个对比:

对比项MySQL 5.7MySQL 8.0
默认认证插件mysql_native_passwordcaching_sha2_password
老客户端兼容性很好老客户端可能连不上
性能表现稳定扎实整体更强,优化器进步明显
窗口函数、CTE不支持支持
JSON能力基础完善
官方维护状态已过常规维护期持续维护

所以我的建议很明确:如果你是跟着教程学、在虚拟机上练手、或者跑老项目,直接用5.7,具体点可以写mysql:5.7.44,锁一个大版本里相对新的子版本,避免遇到历史bug;如果你是新项目、新团队,又不依赖老驱动,直接8.0。

有一点必须强调:不要用latest标签。这个标签指向的版本会变,今天拉的是8.0.x,过几个月再拉一次可能变成8.x.y,配置文件、默认行为都可能不一样,你的生产环境不应该建立在“不确定”之上。指定精确版本号或者至少指定大版本,是容器化部署的基本素养。

3.2 docker run 参数逐个拆开看

选好版本后,真正决定成败的是docker run的参数。我第一次跑MySQL时随手写了个最简单的命令,结果数据全在容器里,容器一删全没了。后来才老老实实把每个参数搞明白。

先看我平时用的完整命令:

docker run -d \ --name mysql57 \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD='YourStrongPass@123' \ -e MYSQL_ROOT_HOST='%' \ -e TZ=Asia/Shanghai \ -v mysql_data:/var/lib/mysql \ -v /opt/mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf \ --restart=always \ mysql:5.7.44

逐个拆开讲:

-d是后台运行,不加的话终端会被MySQL日志刷屏,而且Ctrl+C会把容器停掉。

--name mysql57是给容器起名字,后面所有docker exec、docker logs、docker stop都靠这个名字来定位,比用容器ID方便得多。

-p 3306:3306是端口映射。宿主机3306端口映射到容器内3306端口,外部程序通过虚拟机IP加3306就能连到MySQL。这里多说一句,生产环境不要把端口暴露到所有网卡上,否则宿主机上任何进程都能访问,后面6.3节会专门讲怎么收口。

-e MYSQL_ROOT_PASSWORD是设置MySQL root密码,这是官方镜像的初始化机制。在容器首次启动时,它会自动执行初始化脚本,把这个环境变量里的值作为root密码写入数据库。环境变量属于进程级别的配置,容器停止后这个值还存在,但删除容器重来就失效了,所以密码别只写在命令行里,最好配合环境变量文件使用。

-e MYSQL_ROOT_HOST='%'是允许root从任意主机远程登录。不加这个的话,默认root可能只能从容器内部连接,你在宿主机或者Navicat里根本连不上。%表示所有IP,练手和学习阶段用这个最省事,生产环境建议把它换成具体的IP网段。

-e TZ=Asia/Shanghai是把容器时区设置成东八区,避免MySQL的时间和宿主机时间差8个小时。虽然MySQL内部也有时区变量,但容器时区不对的话,很多事情都会莫名其妙。

-v mysql_data:/var/lib/mysql是核心中的核心。这行把MySQL的数据目录挂载到Docker的命名卷mysql_data上。MySQL的所有库表文件都写在/var/lib/mysql下,如果不挂载出来,数据就存在容器可写层里,容器被删除时数据跟着没。挂载之后,哪怕容器删了重建,数据依然在,新容器挂载同一卷就能无缝接续。命名卷的位置在宿主机/var/lib/docker/volumes/mysql_data/_data,比直接在宿主机指定一个路径更规范。

-v /opt/mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf是配置文件挂载。官方镜像默认会读取/etc/mysql/conf.d/下的配置文件,我们把自己准备好的my.cnf放进去,就可以自定义字符集、排序规则、时区参数等。这样改配置不用重新build镜像,直接改宿主机文件,重启容器即可。

--restart=always是设置容器自动重启策略。虚拟机重启后Docker会跟着启动,这个参数能保证Docker一启动就把MySQL容器带起来,不用你手动一个个docker start。

mysql:5.7.44是镜像标签,前面已经说了,锁死版本。

这里我再补一个细节:如果不想用外部配置文件,也可以在docker run命令末尾直接追加参数:

docker run ... mysql:5.7.44 \ --character-set-server=utf8mb4 \ --collation-server=utf8mb4_unicode_ci

这两种方式效果一样。我习惯用配置文件,因为以后调整参数时不用翻bash历史记录,直接vim改文件就行。

4. 完整跑通:从拉镜像到远程连接

4.1 启动容器,先看懂初始化日志

参数都确认没问题后,开始拉镜像:

docker pull mysql:5.7.44

网络正常情况下几秒钟就能拉完。如果卡住不动,大概率是加速器没生效,或者网络还没完全打通,先回头检查。

拉完镜像后,把3.2节的docker run命令老老实实执行一遍,然后立刻看日志:

docker logs mysql57

这一步很多人会跳过,我建议一定看。MySQL官方镜像首次启动时会做初始化动作:初始化数据目录、创建系统表、设置root密码。日志里会有一条类似mysqld: ready for connections或者port: 3306的记录,看到这个说明初始化完成,可以开始连接了。

如果你在日志里看到[ERROR] [MY-000000] ...之类的报错,先别急着到处搜,按下面顺序快速自查:

  • 端口被占用了?netstat -tlnp | grep 3306,然后把宿主机上占用3306的进程停掉,或者把映射端口改成3307。
  • 数据目录已经有残留数据?docker rm mysql57清掉再重新run,或者换一个新卷名。
  • 密码策略太弱报错?官方镜像默认有密码校验策略,太简单的密码会被拒绝,尽量用大小写字母加数字加特殊符号的组合。

4.2 进容器授权,再让Navicat连上来

容器启动完成后,先进入容器内部测试连接:

docker exec -it mysql57 mysql -uroot -p

输入刚才设置的密码,能进入MySQL命令行就说明服务正常。此时跑一句:

SELECT VERSION();

如果输出5.7.44,环境和版本都没问题。

接下来验证远程连接能力。虽然我们设置了MYSQL_ROOT_HOST='%',但稳妥起见还是手动确认一下授权:

SELECT user, host FROM mysql.user WHERE user='root';

如果看到root对应的host为%,说明远程登录已经放开了。如果还是localhost,则手动补一条授权:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '你的密码'; FLUSH PRIVILEGES;

在宿主机上用MySQL客户端测一下(宿主机没装mysql客户端的话,可以用Python的pymysql,或者直接开Navicat):

mysql -h 虚拟机IP -P 3306 -uroot -p

看到密码输入提示就说明网络链路通了。Navicat这类GUI工具的连接方式也一样,主机填虚拟机IP,端口3306,用户名root,密码填设置好的那个。

提醒:在真正的生产环境,不建议直接用root远程连数据库。更规范的做法是新建一个业务专用账号,只授权具体的库。但就虚拟机练手这个场景来说,root直连能省去很多麻烦,先把流程跑通了再谈安全加固。

5. 踩坑实录:安装和连接MySQL的常见问题

5.1 docker安装MySQL失败的几种典型报错

我在折腾这些环境时,见过最多的报错大概有下面几种,整理成速查表:

报错特征大概率原因解决办法
manifest for mysql:xxx not found镜像tag不存在先docker search mysql或去Docker Hub确认版本号
port is already allocated宿主机3306被其他程序占用netstat -tlnp查占用,换映射端口或停掉占用进程
ERROR: Got permission denied当前用户不在docker组重新登出登录,或用sudo docker
Error response from daemon: pull access denied镜像名拼错或私有仓库未登录检查docker login和镜像名
容器启动秒退,日志写着initialize specified but the data directory has files数据目录已经有数据,和本次初始化冲突换一个空的数据卷,或者删掉残留数据

从经验来看,新手最容易忽略的还是数据目录冲突。比如你第一次docker run时挂载了mysql_data:/var/lib/mysql,初始化好后不满意想重新跑,于是docker rm容器,但卷还在。第二次run时又指定同一个卷,新容器发现里面有旧数据,就又不会执行初始化脚本,结果密码跟你环境变量里设置的不一样,连不上。这种情况其实不是故障,是官方镜像的初始化规则在起作用:数据目录有数据就跳过初始化。解决办法很简单:把卷清空,或者换一个新卷名。

5.2 容器起来了却连不上?先查这三处

容器状态明明是Up,但宿主机或者Navicat就是连不上,这个问题出现频率极高。我一般按“防火墙、监听、认证”三处顺序排查。

第一,防火墙。CentOS7默认开着firewalld,如果你没放行3306端口,外部连接会被直接拒绝:

# 查看当前防火墙状态 systemctl status firewalld # 放行3306 firewall-cmd --permanent --add-port=3306/tcp firewall-cmd --reload # 确认放行结果 firewall-cmd --list-ports

也有人图省事直接systemctl stop firewalld,但我建议别这么干。你将来还要跑Nginx、Redis、其他项目,一次性把规则配好比彻底关闭安全得多。练习环境关了倒无所谓,就怕形成习惯,到生产环境也随手关防火墙,那就真要出事了。

第二,监听地址。容器里MySQL的默认监听地址其实是0.0.0.0,因为Docker端口映射需要它监听在容器内所有网卡上,否则映射不会生效。如果你看到某个教程让你去容器里改bind-address=127.0.0.1,大概率会把自己的连接搞挂,这个操作千万别随意做。

第三,认证方式。最容易翻车的地方。MySQL 8.0默认使用caching_sha2_password加密方式,而老版本的Navicat、Python的pymysql、某些旧JDBC驱动只认mysql_native_password,结果就是“密码明明是对的,但连接失败”。如果实在不想换客户端,可以执行:

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '你的密码'; FLUSH PRIVILEGES;

但这只是临时方案,生产环境还是尽量用新客户端去适配caching_sha2_password。

这里还顺便说一下热词里那个频繁出现的“mysql ssl连接错误”。很多客户端默认会尝试SSL加密连接,如果MySQL端SSL配置和客户端不匹配,就会报SSL connection error。开发环境里最简单的处理就是在连接串里把SSL关掉,比如JDBC连接最后加useSSL=false&allowPublicKeyRetrieval=true。生产环境反过来,必须开启SSL并保证证书链路完整,这是安全底线,不能为了省事牺牲。

5.3 容器一删数据全没?挂载和自启一起检查

“MySQL数据丢失”是容器化数据库最容易被吐槽的点,但绝大多数时候不是Docker的问题,而是使用方式的问题。

我见过一个真实案例:同事在服务器上用docker run mysql跑了一周的业务数据,然后嫌端口不对,直接docker rm -f mysql重建,结果跑完命令才反应过来数据全没了。原因就是他没有做任何卷挂载,数据全写在容器可写层里。容器删除后,这层数据也被一起清理了。

解决办法前面已经提到,就是-v mysql_data:/var/lib/mysql这行参数。但这里还有个隐藏坑:-v后面写的卷名如果没创建过,Docker会自动创建,这点很方便;可是如果你换了一台机器,或者把Docker的数据目录整体备份恢复,命名卷的丢失概率很高。所以我后来更推荐直接把数据放到宿主机明确的目录下,比如:

-v /opt/mysql/data:/var/lib/mysql

这样数据位置一目了然,备份的时候直接压缩/opt/mysql目录就行,不用去Docker卷目录里翻。

自动重启策略也要一起检查。很多人虚拟机重启后MySQL容器没跟着起来,第一反应是MySQL坏了,其实只是重启策略没配。补一下:

docker update --restart=always mysql57

5.4 时区、中文乱码和性能焦虑

这几个问题听起来不致命,但会让人很烦。

时区问题典型表现是:MySQL里NOW()返回的时间和宿主机差了8小时。容器启动时设置了-e TZ=Asia/Shanghai一般就能解决,但如果你对时区敏感(比如业务要统计凌晨的数据),最好在MySQL里再确认一下:

SELECT NOW(); SELECT @@global.time_zone;

如果@@global.time_zone还是+00:00,可以在my.cnf里加default-time-zone = '+08:00',然后重启容器。

中文乱码问题,十有八九是字符集没设对。MySQL默认的utf8实际上是utf8mb3,只能存三字节的字符,一些生僻字、emoji表情根本存不进去。所以从建库开始就该统一使用utf8mb4。如果你的容器已经跑起来了,可以在my.cnf里配置:

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

然后重启容器。已经存在的库和表还要单独改一遍:

ALTER DATABASE 你的库名 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ALTER TABLE 你的表名 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

性能焦虑这块,我见过很多人在虚拟机里给MySQL分配大量内存和CPU,其实没必要。虚拟机本身性能就比物理机差一截,MySQL容器初期用默认配置完全够,真遇到慢查询先看SQL语句和索引,别急着加资源。

6. 上线前的最后几道工序

6.1 开机自启、资源上限都配好

MySQL容器稳定跑起来只是第一步,想要它“省心”长期跑,还需要做几个小配置。

开机自启已经讲过了,--restart=always或docker update --restart=always mysql57必须配上。这样虚拟机一启动,Docker自动起来,MySQL也会跟着拉起。我遇到过不少虚拟机重启后忘配这个参数,数据库起不来,业务方疯狂反馈问题的场景。

资源限制这个容易被忽略。虚拟机的内存是固定的,如果你同时跑了MySQL、Nginx、Redis好几个容器,某个容器出现内存泄漏就可能把宿主机拖垮。Docker其实支持给容器设上限:

# 限制内存最多2G,CPU最多2核 docker update --memory 2g --cpus 2 mysql57

docker stats可以实时查看容器资源占用,建议定期看一眼,尤其是刚上线那几天,能直观发现有没有异常。

6.2 定时备份MySQL,别再裸奔

数据库不备份,等于把全部身家放在一个没有气囊的车里。虽然是用Docker跑的MySQL,但备份方式其实和普通MySQL差不多。

最简单的逻辑备份用mysqldump。在宿主机上直接执行:

docker exec mysql57 sh -c 'exec mysqldump --single-transaction -uroot -p"$MYSQL_ROOT_PASSWORD" --all-databases' > /opt/mysql/backup/all_$(date +%F).sql

这条命令会把所有数据库导成一个SQL文件,--single-transaction保证导出过程中不锁业务表。密码通过环境变量$MYSQL_ROOT_PASSWORD从容器里取,不需要明文写在命令里。

恢复的时候反过来:

docker exec -i mysql57 sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD"' < /opt/mysql/backup/all_2025-01-01.sql

定时备份推荐用crontab。编辑 crontab:

crontab -e

加一行,每天凌晨3点执行:

0 3 * * * docker exec mysql57 sh -c 'exec mysqldump --single-transaction -uroot -p"$MYSQL_ROOT_PASSWORD" --all-databases' > /opt/mysql/backup/all_$(date +\%F).sql 2>&1

注意crontab里%需要转义成\%,否则会被当成换行符。备份文件建议保留最近7天或30天,再写个find命令清理旧文件:

find /opt/mysql/backup -name "*.sql" -mtime +7 -exec rm {} \;

这套流程虽然朴素,但真到了误删数据、容器损坏的时候,能救命的往往就是这么简单的备份。

6.3 端口暴露范围收一收

之前为了练手方便,我在docker run里写的是-p 3306:3306,意思是宿主机所有网卡都暴露3306端口。如果虚拟机设置了桥接网络,相当于局域网里其他机器也能直接访问这个数据库,只要密码被爆破就是事故。

生产环境或者长期使用的虚拟机,建议把端口绑定到指定IP,比如只允许本机访问:

-p 127.0.0.1:3306:3306

这样只有宿主机能连接,外部机器完全访问不到。如果应用也在同一台虚拟机上跑,这个方案完全够用。如果确实需要远程访问,再放开到具体内网IP:

-p 192.168.1.100:3306:3306

这个细节看似无关紧要,但它是判断你有没有“容器安全”意识的一个重要分界线。

6.4 写在最后:一点个人建议

这套环境我前前后后搭过不下十遍,每次都能踩到一两个新的小坑。最近一次帮朋友排查时发现,他装完Docker没配镜像加速器,拉MySQL镜像用了四十分钟,还以为自己网速不行,其实换个镜像源一分钟就完事。

我自己最大的体会是:Docker装MySQL本身不难,难的是想清楚数据存哪里、配置怎么改、重启之后会发生什么。把这三个问题想明白了,后面基本一马平川。如果你也在虚拟机上第一次折腾这套装环境,强烈建议装好CentOS7后先打个快照,后面随便造,造坏了秒回滚。镜像拉下来、容器跑起来、远程连上来之后,再回头做一遍那几道“收尾工序”,您的MySQL环境就很扎实了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询