马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
用 Docker 起一个 MySQL 是最省事的数据库落地方式:不用编译、不用处理依赖,一条 docker pull 加一条 docker run 就跑起来。但容器里的数据库有两个绕不开的话题——数据怎么留在容器外面、端口怎么通到外面。这篇把下载镜像、启动容器、脚本化启动、连库验证以及几个容易踩的坑一次讲清。
一、先看自己已经拉了哪些镜像
开始之前先确认本地镜像状态:
docker images
没有 mysql 的话就先拉,推荐锁定具体版本而不是直接用 latest,避免下次重启容器时拉到不兼容的新版:
docker pull mysql:5.7
二、方法一:直接一条命令启动
docker run -p 3306:3306 --name mysql --restart=always \
-v /usr/local/docker/mysql/log:/var/log/mysql \
-v /usr/local/mysql/data:/var/lib/mysql \
-v /usr/local/mysql/conf:/etc/mysql \
-v /etc/localtime:/etc/localtime:ro \
-e MYSQL_ROOT_PASSWORD=你的强密码 -d mysql:5.7
几个参数的含义逐个说清楚:
- -p 3306:3306:把宿主机的 3306 映射到容器的 3306,外部程序连宿主机这个端口就能进数据库。
- --name mysql:给容器起个固定名字,后面 docker stop mysql、docker logs mysql 都靠它。
- --restart=always:宿主机重启后容器自动跟着起来,生产环境几乎必选。
- 四个 -v:分别把日志
、数据、配置和宿主机时钟挂进容器。数据目录一定要挂出来,否则删容器等于删库。
- -v /etc/localtime:/etc/localtime:ro:让容器时钟跟宿主机一致,避免时区导致的日志
记录和定时任务偏移,ro 是只读。
- -e MYSQL_ROOT_PASSWORD=...:设置 root 初始密码,这是唯一一次能在这条命令里设密码的机会,容器重建后这个环境变量就失效了。
- -d:后台运行。
三、方法二:写成脚本反复用
同一套参数每次敲容易敲错,不如固化成脚本。新建启动脚本:
vim startMysql.sh
把上面那段 docker run 原样粘进去,保存后赋权:
chmod 755 startMysql.sh
./startMysql.sh
以后换机器、重装系统,只要把这段脚本复制过去改两处路径就能复用。
四、确认容器正常并连库
docker ps
docker logs mysql
状态是 Up、日志 里出现 ready for connections 就说明起来了。然后用一个客户端填四项:连接名随便起、主机填宿主机 IP(虚拟机里就是虚拟机的 IP)、用户名 root、密码是刚才设的那个,测试通过就装完了。
五、连不进去时依次查这四项
- 容器是不是真的在跑:docker ps 看状态,不在就 docker logs mysql 找启动失败原因。
- 宿主机 3306 有没有放行:云服务器要去安全组放行 3306,本机虚拟机不需要。
- 端口映射对不对:docker ps 看 PORTS 列,显示 0.0.0.0:3306->3306/tcp 才对。
- 防火墙:iptables 或 firewalld 有没有拦,用 sudo ss -lntp | grep 3306 看监听。
六、几个必须提醒的坑
- 密码别设成 123456 这种,容器一对外就是全网的扫描目标,几分钟内就会被试出来。
- 别用 --privileged=true。原文章里为了省事加了它,这等于把宿主机的 root 权限直接给容器,风险极高,正常情况下卷映射加普通用户权限就够了。
- log 和 data 两个挂载路径在原文里写得不一致(一个 /usr/local/docker/mysql/log,一个 /usr/local/mysql/data),照抄时要统一,不然后面清理目录很容易误删数据。
- 数据目录的属主要跟容器里 mysql 用户的 uid 对上,否则会报 InnoDB: Operating system error number 28 之类的权限错。
- 备份要单独做,容器只解决「跑得起来」,不解决「数据安全」,定期 mysqldump 或做卷快照是必须的。
qidao123.com企服评测-应用市场 编辑提示
|