前提
在网上找到很多mac安装oracle的版本是amd架构,奈何本人的电脑是arm架构。查看自己的电脑是什么架构可以进入终端
输入uname -m
可以看到本人的是arm架构

安装步骤
1、打开终端,拉取 Oracle 19c 镜像(ARM64 架构),安装的时间可能有点久,需要等待一会
这一步骤参考文章:MacBook M系列芯片基于docker安装Oracle 19c
bash
docker pull docker.cnb.cool/kangaroohy/open-source/images/oracle:19.19.0-ee-arm64
安装成功后在终端中输入 docker images,出现以下内容

2、由于我的电脑在docker下创建文件夹的话会报错,所以选择换一种方法
方法一(直接创建):失败

方法二:成功
3、在终端中输入:
bash
docker run -d \
--name oracle \ # (自己设计)容器名称,我这里设置为了oracle
-p 1521:1521 \ # (不变)Oracle 数据库端口映射(本机可访问)
-p 5500:5500 \ # (不变)Enterprise Manager 控制台端口
-e ORACLE_PDB=ORCL \ # 不变
-e ORACLE_PWD=12345678 \ # (自己设计)设置oracle初始密码
-e ORACLE_CHARACTERSET=AL32UTF8 \ # 不变
-e INIT_SGA_SIZE=3000 \ # 不变
-e INIT_PGA_SIZE=1000 \ # 不变
# (自己设计)注意这一步,我首先在自己电脑中创建了oracle-data文件夹,然后把本地目录挂载为 Oracle 数据文件存储目录
-v /自己电脑中oracle-data的文件夹路径/oracle-data:/oracle-data \
# 刚刚安装的Oracle 19c 镜像
docker.cnb.cool/kangaroohy/open-source/images/oracle:19.19.0-ee-arm64
4、验证容器是否正常运行
查看日志确认数据库是否启动完成,输入
bash
docker logs -f oracle # oracle是刚刚起的容器名称
如果出现以下内容则证明启动完成,第一次输入需要初始化,可能要等待一段时间:

5、验证挂载是否生效
进入容器,输入
bash
docker exec -it oracle /bin/bash # 注意oracle是刚刚起的容器名字
如果看到了以下提示符,则已经成功进入了 Oracle 容器的 Bash 终端,当前提示符 bash-4.4$ 表示已经在容器内部了

然后执行
bash
ls /oracle-data
如果出现空目录,则表示容器成功挂载了你自己电脑中oracle-data的文件夹路径

6、连接oracle数据库
在bash-4.4$中输入
bash
sqlplus / as sysdba
如果成功,会看到类似下方的内容

在上一步中显示目前已经成功登录了容器内部的 Oracle 数据库,说明数据库服务已正常启动,下面需要确认 Docker 容器是否暴露了1521 端口
7、确认 Docker 容器是否暴露了 1521 端口
先输入exit退出容器,回到自己的macOS终端,然后再执行docker ps命令
如果 1521:1521 存在,说明 Oracle 数据库的监听端口已经映射出来,可以在 Navicat 中使用

8、使用Navicat连接Oracle
在Navicat中新建Oracle,本人的信息填写如下,点击测试链接后却显示未加载oracle数据库。于是开始排错

排错步骤一:确认服务名
输入
bash
docker exec -it oracle bash
cat $ORACLE_HOME/network/admin/tnsnames.ora
可以看到文件中同时出现 ORCLCDB 和 ORCL,这是 Oracle 19c 多租户架构下的标准现象

查询之后发现结论如下,还是推荐使用ORCL连接

排错步骤二:测试数据库监听是否开放
在终端上执行
bash
telnet localhost 1521
或(Mac 没有 telnet 时)用
bash
nc -zv localhost 1521
输出如果类似红框内容,说明监听服务正常。如果失败,说明监听器没启用(容器内部监听未启动)

排错步骤三:容器内检查监听器状态
终端输入
bash
docker exec -it oracle bash
lsnrctl status
如果显示类似于下方图片内容,则表示监听器状态成功启动

可以看到本人电脑这两个内容都没有问题,后来查出这不是数据库没连接上,而是我的Navicat 本身缺少 Oracle 客户端库
问题本质:
Navicat 连接 Oracle 时需要调用 Oracle 客户端驱动(OCI 动态库),而 macOS 默认是没有安装这个驱动的,Navicat 会报这个错:

9、现在开始安装 Oracle Instant Client(轻量官方驱动)
进入https://www.oracle.com/database/technologies/instant-client/macos-arm64-downloads.html
下载后解压
instantclient-basic-macos.arm64-19.22.0.0.0dbru.dmg
instantclient-sdk-macos.arm64-19.22.0.0.0dbru.dmg


假设解压在/Users/123/ins路径下,打开终端执行
bash
echo 'export DYLD_LIBRARY_PATH=/Users/123/ins' >> ~/.zshrc
source ~/.zshrc
之后重启Navicat,再次连接,发现还是显示测试失败

10、需要在程序简介中勾选Rosetta,勾选完成之后再次重启Navicat

连接成功
