Apple M1 上的 Oracle 12c docker 安装程序

Oracle 12c docker setup on Apple M1

我正在尝试 运行 M1 Mac 上 docker 中的 Oracle 数据库。我尝试了来自 store/oracle/database-enterprise:12.2.0.1-slimcontainer-registry.oracle.com/database/enterprise:12.2.0.1-slim 的图像,但得到了同样的错误。

docker run -d -it --name oracle -v $(pwd)/db/oradata:/ORCL store/oracle/database-enterprise:12.2.0.1-slim

我还尝试了非超薄版本,并通过向 docker 命令提供 --platform linux/amd64。结果是一样的。

这是docker logs -f oracle

的结果
Setup Oracle Database
Oracle Database 12.2.0.1 Setup
Sat Jul 31 18:44:14 UTC 2021

Check parameters ......
log file is : /home/oracle/setup/log/paramChk.log
paramChk.sh is done at 1 sec

untar DB bits ......
log file is : /home/oracle/setup/log/untarDB.log
untarDB.sh is done at 29 sec

config DB ......
log file is : /home/oracle/setup/log/configDB.log
Sat Jul 31 18:44:42 UTC 2021
Start Docker DB configuration
Call configDBora.sh to configure database
Sat Jul 31 18:44:42 UTC 2021
Configure DB as oracle user
Setup Database directories ...

SQL*Plus: Release 12.2.0.1.0 Production on Sat Jul 31 18:44:43 2021

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

ERROR:
ORA-12547: TNS:lost contact


Enter user-name: SP2-0306: Invalid option.
Usage: CONN[ECT] [{logon|/|proxy} [AS {SYSDBA|SYSOPER|SYSASM|SYSBACKUP|SYSDG|SYSKM|SYSRAC}] [edition=value]]
where <logon> ::= <username>[/<password>][@<connect_identifier>]
      <proxy> ::= <proxyuser>[<username>][/<password>][@<connect_identifier>]
Enter user-name: Enter password: 
ERROR:
ORA-12547: TNS:lost contact


SP2-0157: unable to CONNECT to ORACLE after 3 attempts, exiting SQL*Plus
update password

Enter password for SYS: 
create pdb : ORCLPDB1

SQL*Plus: Release 12.2.0.1.0 Production on Sat Jul 31 18:44:43 2021

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

ERROR:
ORA-12547: TNS:lost contact


Enter user-name: SP2-0306: Invalid option.
Usage: CONN[ECT] [{logon|/|proxy} [AS {SYSDBA|SYSOPER|SYSASM|SYSBACKUP|SYSDG|SYSKM|SYSRAC}] [edition=value]]
where <logon> ::= <username>[/<password>][@<connect_identifier>]
      <proxy> ::= <proxyuser>[<username>][/<password>][@<connect_identifier>]
Enter user-name: SP2-0306: Invalid option.
Usage: CONN[ECT] [{logon|/|proxy} [AS {SYSDBA|SYSOPER|SYSASM|SYSBACKUP|SYSDG|SYSKM|SYSRAC}] [edition=value]]
where <logon> ::= <username>[/<password>][@<connect_identifier>]
      <proxy> ::= <proxyuser>[<username>][/<password>][@<connect_identifier>]
SP2-0157: unable to CONNECT to ORACLE after 3 attempts, exiting SQL*Plus
Reset Database parameters

SQL*Plus: Release 12.2.0.1.0 Production on Sat Jul 31 18:44:43 2021

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

ERROR:
ORA-12547: TNS:lost contact


Enter user-name: SP2-0306: Invalid option.
Usage: CONN[ECT] [{logon|/|proxy} [AS {SYSDBA|SYSOPER|SYSASM|SYSBACKUP|SYSDG|SYSKM|SYSRAC}] [edition=value]]
where <logon> ::= <username>[/<password>][@<connect_identifier>]
      <proxy> ::= <proxyuser>[<username>][/<password>][@<connect_identifier>]
Enter user-name: Enter password: 
ERROR:
ORA-12547: TNS:lost contact


SP2-0157: unable to CONNECT to ORACLE after 3 attempts, exiting SQL*Plus

LSNRCTL for Linux: Version 12.2.0.1.0 - Production on 31-JUL-2021 18:44:44

Copyright (c) 1991, 2016, Oracle.  All rights reserved.

Starting /u01/app/oracle/product/12.2.0/dbhome_1/bin/tnslsnr: please wait...

TNSLSNR for Linux: Version 12.2.0.1.0 - Production
System parameter file is /u01/app/oracle/product/12.2.0/dbhome_1/admin/ORCLCDB/listener.ora
Log messages written to /u01/app/oracle/diag/tnslsnr/989db909d8df/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=0.0.0.0)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 12.2.0.1.0 - Production
Start Date                31-JUL-2021 18:44:44
Uptime                    0 days 0 hr. 0 min. 0 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u01/app/oracle/product/12.2.0/dbhome_1/admin/ORCLCDB/listener.ora
Listener Log File         /u01/app/oracle/diag/tnslsnr/989db909d8df/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
The listener supports no services
The command completed successfully

DONE!
Remove password info
Docker DB configuration is complete !
ERROR : config DB failed, please check log /home/oracle/setup/log/configDB.log for details!
OS process OFSD (ospid 188) idle for 30 seconds, exiting
2017-08-09T10:36:20.752530+00:00
ARCH: Archival disabled due to shutdown: 1090
Shutting down archive processes
Archiving is disabled
JIT: pid 563 requesting stop
2017-08-09T10:36:20.815635+00:00
Stopping background process VKTM
2017-08-09T10:36:26.581058+00:00
Instance shutdown complete (OS id: 563)
/usr/bin/tail: inotify cannot be used, reverting to polling: Function not implemented

是M1的问题还是我配置的问题

这里有两个问题:

  1. Oracle 数据库在 ARM 处理器上不受支持,仅在 Intel 上受支持。看这里:https://github.com/oracle/docker-images/issues/1814
  2. Oracle 数据库 Docker 映像仅支持 Oracle Linux 7 或 Red Hat Enterprise Linux 7 作为主机 OS。看这里:https://github.com/oracle/docker-images/tree/main/OracleDatabase/SingleInstance

Oracle Database ... is supported for Oracle Linux 7 and Red Hat Enterprise Linux (RHEL) 7. For more details please see My Oracle Support note: Oracle Support for Database Running on Docker (Doc ID 2216342.1)

引用的 My Oracle Support 文档 ID 继续说他们 Docker 映像中的数据库二进制文件是专门为 Oracle Linux 主机构建的,并且也可以在 Red Hat 上运行。就是这样。

因为 Docker 提供 进程级 虚拟化,它仍然从底层主机 OS 中提取内核和其他 OS 库。为 Oracle Linux 构建的 Docker 映像需要 Oracle Linux 主机;它没有带来 Oracle Linux OS。 any Oracle 数据库 Linux 安装仅支持 Oracle Linux 或 Red Hat Linux,有或没有 Docker。 Ubuntu、Mac OS、Debian 或任何其他 *NIX 风格都不会提供可预测的可靠结果,即使它被黑客入侵或进程似乎正常工作。

M1 上的 Oracle 数据库Mac

这太棒了.. MacOS 不支持 Oracle 数据库,但是,通过 Docker 虚拟化 linux,它可以。不幸的是,尽管 Docker 支持 M1 Mac ARM 虚拟化,但 Oracle 数据库严重依赖一些 Docker 和 Rosetta 2 无法处理的低级内核调用。这导致我们在本地找到 运行 的唯一可能解决方案:使用完全仿真(虚拟机)。

  1. 安装Lima with HomeBrew。 Lima 是一种非官方的“Linux 的 macOS 子系统”,支持具有不同架构的 运行ning 虚拟机(比如 运行ning 一个 x86 OS ARM 的顶部 MacOS):
brew install lima
  1. 创建一个新的 Impish Ubuntu(默认)虚拟 Machine:
limactl start
  1. Select 打开编辑器覆盖配置
  2. 使用默认编辑器(vi)修改arch字段如下(i进入插入模式,进行修改,ESC为进入命令模式,:wq退出并保存)。
arch: "x86_64"
  1. 运行 新创建的默认 Lima VM,并将目录更改为新 VM 的主目录。 (除非另有说明,否则所有超过此的命令在新启动的 shell 中应为 运行)。
lima
cd ~
  1. 在 Lima VM 中安装 Docker for Ubuntu
  2. 将您的用户添加到 docker 组,并激活更改以能够 运行 docker 命令而无需 root 访问权限:
sudo usermod -aG docker $USER
newgrp docker
  1. 运行 图片来自 docker hub
docker login
docker run -d -p 1521:1521 --name oracle store/oracle/database-enterprise:12.2.0.1
  1. 使用默认值连接
username/password@SID: sys/Oradoc_db1@ORCLCDB

在投入了一些时间之后,这是我测试和工作但不适合我的东西。

  • Lima - 对我来说没用。 据我所知,Lima 是一个 qemu 包装器。所以理论上它应该可以工作,但我遇到了与这个公开问题中描述的问题相同的问题: https://github.com/lima-vm/lima/issues/713#issuecomment-1064151675

  • 多次通过 - 没有用。 Multipass 是 Ubuntu 的虚拟机。问题是暂时不支持跨架构。您将只能为相同的体系结构 (aarch64) 创建 vms,而 oracle 不会 运行 在其上。

  • 直接Qemu。 这是唯一对我有用的选项,如果您对此处的步骤感兴趣,它是:

  1. brew install qemu utm

obs.: utm 是 运行 qemu 的图形工具,无需了解其复杂的命令。

  1. 下载您喜欢的 amd64 linux iso。

在我的例子中,它是一个 ubuntu 服务器(只要确保它适用于 amd64)

  1. 在 utm 上创建一个新的模拟器和 select 您下载的图像

我已经select编辑了第一个可用的机器架构(标签为 2009),有一个标有(默认)但它太慢了 - 避免这个。

2 核 cpu,4G 内存对我来说足够了。

对于共享文件夹,访问它的方式不是很直接,所以最终 scp 足以在 host/guest 台机器之间传输文件。

  1. 完成安装过程并登录后,安装 docker:

https://docs.docker.com/engine/install/ubuntu/

额外:sudo apt-get install docker-compose

  1. 加载您的 oracle docker 映像并 运行 它。

如果您配置了任何卷,您需要记住为其授予访问权限 (chmod)

  1. 尽情享受吧:)

如果有人还在为这个问题苦苦挣扎,我找到了一个更好更直接的解决方案:

  1. Install homebrew
  1. Install Colima
  • brew install colima
  1. Install docker
  • brew install docker
  1. Start Colima by setting up x86_64 architecture
  • colima start --memory 8 --arch x86_64
  1. Test docker
  • docker run hello-world

注意:您应该从系统中清除与 docker 相关的所有内容以及 docker 桌面,这样您就不需要 docker 桌面