【问题标题】:Oracle 12c docker setup on Apple M1Apple M1 上的 Oracle 12c docker 设置
【发布时间】:2021-10-06 19:52:44
【问题描述】:

我正在尝试在 M1 Mac 上的 docker 中运行 Oracle db。我尝试了来自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

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

这是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 的问题还是我的配置问题

【问题讨论】:

  • Oracle 服务器不支持 Mac OS 作为底层操作系统。推荐的方法是使用 Oracle VM VirtualBox(确实在 Mac 上运行)并创建一个 Oracle Linux VM 并在其上运行数据库。即使您确实让它在 Mac 上原生运行(据我所知,有些人声称已经这样做了),结果也无法预测,您将无法获得对配置的支持。
  • 你贴的错误信息支持这一点:ERROR : config DB failed, please check log /home/oracle/setup/log/configDB.log for details!,表示数据库在创建时未能正确配置自身,无法启动。
  • 谢谢@pmdba。是的,我后来在 Github 上发现了一个问题,他们明确提到 docker 映像现在不支持 M1。并且补充一下您对 VirtualBox 的看法,M1 芯片也不支持它们。因此,目前唯一的方法是使用 Parallels 运行 Windows 10,然后在其中运行 Oracle,或者开始使用我的旧 Intel Mac。
  • 参考这个 github 问题 github.com/oracle/docker-images/issues/1814 和这个评论 github.com/oracle/docker-images/issues/… 关于 M1 芯片上的虚拟机的并行性。
  • Oracle 数据库仅在 Intel/AMD 处理器(无 ARM)上受支持,并且仅在基于 RedHat 的 Linux 风格或 Windows 上受支持。从技术上讲,在 SPARC 上运行的 Solaris 上也是如此,但这不适用于大多数人......它在 Ubuntu 或任何 Debian Linux 或 Mac OS 上不受支持 - 操作系统内核太不同了。鉴于 Packed 在过去 20 年中稳步减少其支持的操作系统和芯片架构的数量,这种情况不太可能改变。

标签: oracle docker oracle12c apple-m1


【解决方案1】:

M1 Mac 上的 Oracle 数据库

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

  1. 安装LimaHomeBrew。 Lima 是一种非官方的“Linux macOS 子系统”,支持运行具有不同架构的 VM(例如在 ARM MacOS 之上运行 x86 操作系统):
brew install lima
  1. 创建一个新的 Impish Ubuntu(默认)虚拟机:
limactl start
  1. 选择打开编辑器以覆盖配置
  2. 使用默认编辑器 (vi) 将 arch 字段修改为以下内容(i 进入插入模式,进行更改,ESC 进入命令模式,:wq 退出并保存)。
arch: "x86_64"
  1. 运行新创建的默认 Lima VM,并将目录更改为新 VM 的主目录。 (除非另有说明,否则所有超出此范围的命令都应在新启动的 shell 中运行)。
lima
cd ~
  1. 在 Lima VM 中安装 Docker for Ubuntu(您可能需要通过打开 service-now 票证来获得商业许可证)。
  2. 将您的用户添加到 docker 组,并激活更改以便能够在没有 root 访问权限的情况下运行 docker 命令:
sudo usermod -aG docker $USER
newgrp docker
  1. 克隆包含 oracle docker 映像的 git 存储库:
git clone https://github.com/oracle/docker-images.git
  1. 通过运行以下 2 个命令,为您想要启动的 Oracle 数据库的版本和版本构建 docker 映像。 在下面的第二条命令中,请注意 18.4.0 是版本号,x 即 express 是版本。这需要很长时间(一个多小时)。
cd docker-images/OracleDatabase/SingleInstance/dockerfiles
./buildContainerImage.sh -v 18.4.0 -x
  1. 构建映像后,通过运行以下命令验证它是否可用。应该有一个名为 oracle/database 的映像,其标签与您在上述步骤中指定的版本匹配。
docker images
mkdir ~/dev

sudo chmod 775 ~/dev -R
sudo chown 54321:54321 ~/dev -R
  1. 通过运行以下命令为创建的 docker 映像启动容器(成功完成需要一个多小时)。
docker run --name oracledb \
  -d \
  -p 1521:1521 \
  -p 5500:5500 \
  -e ORACLE_PWD=oracle \
  -v ~/dev/docker/oracledb/oradata:/opt/oracle/oradata \
  -v ~/dev/docker/oracledb/scripts/setup:/opt/oracle/scripts/setup \
  -v ~/dev/docker/oracledb/scripts/startup:/opt/oracle/scripts/startup \
  oracle/database:18.4.0-xe
  1. 上述脚本可能在某些文件权限上出错。您可以使用docker logs oracledb 检查错误。如果您看到文件权限问题,请运行以下命令,然后重新运行上一步:
docker stop oracledb

sudo chmod 775 ~/dev -R
sudo chown 54321:54321 ~/dev -R
  1. 验证数据库设置是否成功:
docker logs oracledb

您应该查找以下消息:

#########################
DATABASE IS READY TO USE!
#########################
  1. 确保您可以通过 DBeaver、SQL Developer 等 GUI 或使用带有以下连接字符串的 sqlplus 命令行连接到数据库:system/oracle@127.0.0.1:1521/xe

性能

说到底,这不会是一个活泼的数据库。在后台运行的底层 qemu 进程占用 5.2 GB。相比之下,Docker Desktop 的 qemu 进程在不运行 Oracle 数据库的情况下占用了 3 GB。因此,考虑到所有因素,撞锤并没有想象中的那么大。

运行查询 SELECT owner, table_name FROM all_tables; 大约 6 秒后返回结果。

【讨论】:

  • 什么我不明白,据说M1上的Docker支持直接以完全仿真模式(也使用qemu)运行Intel容器(--platform linux / amd64),那么为什么需要lima步骤?
  • 这确实有效,谢谢。我唯一改变的是,我没有构建图像,而是使用官方图像hub.docker.com/_/oracle-database-enterprise-edition 和开发人员层。在我可以运行图像之前,我所要做的就是docker login
【解决方案2】:

这里有两个问题:

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

Oracle 数据库 ... 支持 Oracle Linux 7 和 Red Hat Enterprise Linux (RHEL) 7。有关更多详细信息,请参阅 My Oracle Support 说明:Oracle 支持在 Docker 上运行的数据库(文档 ID 2216342.1)

引用的 My Oracle Support Doc ID 继续说,其 Docker 映像中的数据库二进制文件是专门为 Oracle Linux 主机构建的,并且也适用于 Red Hat。就是这样。

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

【讨论】:

  • 我的个人经验是,oracle docker 镜像在 Ubuntu 上运行良好。我每天都使用它并依赖它进行开发,不需要任何特殊的 hack 来让它运行。
  • 它不受支持的事实意味着即使它看起来可以工作,结果也没有得到认证或保证;它不能被信任。例如,内部数学或密码函数可能会返回不正确的结果,而您不会注意到;任何种类的功能都可能随时出现异常;一些存储架构需要直接加载内核模块。 任何你曾经遇到的问题都会让你没有追索权或除了轶事帮助之外的任何其他东西,因为甲骨文会告诉你的第一件事也是唯一的事情是你必须重现问题受支持的环境。
  • 对于任何不受支持的配置,您唯一可以说的是它可能工作,大多数时间。鉴于设置实际受支持的环境非常容易,您为什么不呢?
  • 不,我让任何阅读您在上面发布的内容的人都知道,根据日常经验,我可以说它工作得很好,没有问题。选择是否运行 RHEL 或 Oracle Linux 并不在于它是否容易,决定是否可以运行 Oracle docker 的因素还有很多。我认为您的原始答案具有误导性,并没有那么有帮助。我不建议在 ubuntu 上运行生产 oracle 数据库:但 OP 询问是否在 Mac 上运行它:所以显然我们在谈论开发环境。
  • 根据我在商业软件开发和内部开发方面的经验,如果您没有在经过认证/支持的那个平台。否则,您只能说它似乎按预期工作,但不能保证(您不能承诺平台供应商不会承诺的东西)。这对于商业开发内部/企业开发来说是不够的。 30 年来,我从来没有一个雇主或客户会接受这一点。
【解决方案3】:

我尝试将平台添加到 docker-compose.yml,它可以在带有 M1 的 MacBook Pro 上运行

version: '3'

services:
  oracle:
    platform: linux/x86_64
    image: store/oracle/database-enterprise:12.2.0.1
    ports:
      - '1521:1521'
    expose:
      - '1521'

【讨论】:

  • 能否请您显示一些有关此服务的日志?当我尝试使用它时,它不起作用。 imgur.com/a/Y2sqiPD
  • 我对您的理解是否正确,您已经能够在具有 M1 芯片的 Apple 硬件上的 Docker 容器中运行 Oracle 数据库?你能分享一下你的环境的细节吗?
  • 这对我不起作用
猜你喜欢
  • 1970-01-01
  • 2017-09-12
  • 1970-01-01
  • 2022-07-09
  • 2022-07-28
  • 1970-01-01
  • 2023-01-08
  • 2021-06-24
  • 1970-01-01
相关资源
最近更新 更多