1、准备工作
如果不想看前面的废话请直接右边目录跳到
运行容器
处
默认你已经有 docker 环境。
Windows 推荐 Docker Desktop (下载地址)并基于 WSL2 运行 Docker 环境
mac 推荐 Orbstack (下载地址)(这个很节省资源,尤其对于 16GB 内存的用户,个人用户免费,也支持 K8S,更厉害的是,随便创建 Linux 虚拟机数量,不需要再安装别的虚拟机软件再去找一个 iso 镜像文件安装 Linux 系统)
本人以 mac 环境演示
简单放两张图给大家看看这个 Orbstack,Docker Desktop 相信很多同学都有。
如果这个虚拟机再搞个克隆功能就好了,把一台的基础环境搭建好之后克隆多台再配置差异化的东西,就非常快了。
2、正题开始
2.1、寻找镜像
- 直接使用
docker search
命令搜索 MySQL 的镜像
如果安装那个mariadb
其实也是一样的。引用亚马逊云关于 MySQL 与 MariaDB 的区别链接:
MariaDB 是 MySQL 的修改版本。在 MySQL 被 Oracle 公司收购后,出于许可和分发方面的问题,MySQL 的原始开发团队制作了 MariaDB。自收购以来,MySQL 和 MariaDB 经历了不同的发展。但是,MariaDB 采用 MySQL 的数据和表定义文件,还使用相同的客户端协议、客户端 API、端口和套接字。这是为了让 MySQL 用户能够轻松切换到 MariaDB。
- 使用 DockerHub 地址查找
直接使用
docker pull mysql
的话默认会拉取最新的镜像,即: mysql:latest
2.2、拉取镜像
废话不多说了,我这里以 docker pull mysql:8.3.0-oracle
为例(不知道用什么镜像,推荐直接用 Oracle 的即可)
docker pull mysql:8.3.0-oracle
2.3、运行容器
使用以下命令运行 MySQL 容器
docker run -p 3307:3306 --name mysql8 --restart=always --privileged=true \
-v /Users/lyk/docker-test/mysql/log:/var/log/mysql \
-v /Users/lyk/docker-test/mysql/data:/var/lib/mysql \
-v /Users/lyk/docker-test/mysql/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=root -d mysql:8.0.36-oracle
注意:不要删掉后面的 \ 号
如果你是基于 WSL 的 Docker 环境,宿主机的目录你可以放到你真实电脑,也可以放到 WSL Linux 子系统中的目录(比如 /opt/docker/mysql 这种),到时候通过别的终端连接 WSL 子系统进行修改即可,我个人建议直接映射到 WSL 子系统中的目录去,因为 Windows 的目录结构跟 Linux 的目录映射有时候一些容器会出一些问题如果不提前拉取镜像,运行容器的时候发现没有这个镜像也会自动去拉取下来再运行。
因为我的 3306 端口用完了,所以宿主机我映射到了3307。目录我就随便搞一个 docker-test测试而已,大家看需求放好目录。
参数说明:
参数 | 格式 | 说明 |
---|---|---|
-p | 宿主机端口 : 容器端口 | 将容器内的端口与宿主机端口映射,使得直接访问宿主机的端口就可以访问到容器 |
–name | –name xxx | 给容器起一个名字 |
–restart | –restart = xxx (可选:no (默认值),on-failure ,always ) | 容器重启策略(比如运行失败了,会尝试重启;又比如每次重启电脑都自动启动容器) |
–privileged | –privileged=xxx (可选 false (默认值)、 true ) | 值为 true 时,授予容器内的进程全部的特权。 当容器运行在特权模式下时,容器内的进程将拥有一些特权,例如: 可以访问主机的所有设备和文件系统。 可以进行网络配置和管理,包括创建和修改网络接口和路由表 |
-v | -v 宿主机目录 : 容器内目录 (此时是目录映射或者叫做目录挂载);或者直接: -v 宿主机目录 (此时是数据卷挂载) | 目录挂载:容器内的文件与宿主机的目录的文件直接一一映射,即:在宿主机修改文件,容器内的文件直接生效,例如做 my.cnf 配置文件,放在宿主机目录并且映射到容器中,我只需要修改宿主机的文件即可完成对容器内的 MySQL 配置修改 |
-e | -e 参数名=参数值 | 用于在容器启动的时候往容器中设置一些初始值,例如上述命令中就是给 MySQL 容器设置初始的 root 用户密码是 root,注意,参数名必须是有效的,否则报错,不能说 MySQL 本身没有 AAA 这个参数你自己随便搞一个进去,你自己运行的程序除外(比如你自己跑一些 Spring Boot程序你当然可以自己设置一些自定义参数) |
-d | 加上 -d 参数之后容器会静默在后台启动,也就是不会在你的终端窗口打印信息,类似跑 Java 程序的 nohup java -jar xxx.jar & 命令 |
此处放一张上面提到的目录挂载与数据卷挂载的区别,回答来自 ChatGPT:
将上面命令在 shell 窗口中运行完之后就看到我们的容器启动起来了
说明:忘记在映射目录加上用户目录了,我是放在用户目录,大家忽略上图的/docker-test 与 上面命令提到的 /Users/lyk/docker-test 即可。
运行成功以后会显示容器的 id(唯一标志)
通过 docker ps
查看运行中的容器:
2.4、Navicat 连接
测试连接连通性
2.5、完事
如果能正常连接,那就没什么问题了。如果遇到问题,参考下面的可能遇到的问题。
3、可能遇到的问题
- 如果Navicat报错代码2059,则进行以下修改 %是针对所有用户,即:开启
远程访问
,
进入容器
docker exec -it mysql8 bash
注意 如果你使用的是alpine类型的镜像,那么命令都是以
sh
结尾(所有 alpine 镜像都是),例如:docker exec -it mysql8 sh
容器内执行以下命令(分两种,可以允许远程访问 or 本地访问):
ALTER USER 'root'@'%' IDENTIFIED BY 'root' PASSWORD EXPIRE NEVER;
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';
- 如果只允许
本机
访问(比如你就是本地玩玩,就设置这个),localhost
只允许本机访问
ALTER USER 'root'@'localhost' IDENTIFIED BY 'root' PASSWORD EXPIRE NEVER;
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';
执行完记得刷新权限:
FLUSH PRIVILEGES;
至此,我们的 MySQL 就安装完成了。