2024年2月29日木曜日

Apple MシリーズのMacにコンテナ・イメージを使ってOracle APEXの環境を構築する

先日の記事「Oracle Container RegistryにあるOracle Database FreeとORDSのイメージからOracle APEXの環境を作成する」では、Intel Macの環境にOracle Container Registryにあるコンテナ・イメージを使ってOracle APEXの環境を作っています。しかし、今ではIntelのCPUが入ったMacを使っている人は少ないように思います。

Philipp Salvisbergさんが彼のブログで、Oracle Database 23c Freeのコンテナ・イメージをApple Mシリーズで実行した手順を紹介しています。

Oracle Database 23c on a Mac with an M-Series Chip
https://www.salvis.com/blog/2023/04/16/oracle-database-23c-on-a-mac-with-an-m-series-chip/

Oracle CorporationのPMのGerald Venzlさんも彼のGitHubリポジトリoci-oracle-freeで紹介していますが、どちらもColimaを使用しています。

Apple MシリーズのMacbook Proに、Oracle Database 23c FreeとOracle REST Data Servicesのコンテナ・イメージを使ってOracle APEXの環境を構築してみます。

以下より手順を紹介します。dockerとColimaがインストールされていることを前提とします。

Colimaのインスタンスを作成します。海外の記事では以下のコマンドが紹介されています。CPUのデフォルトは2、ストレージ・サイズのデフォルトは60GiBです。

colima start --arch x86_64 --memory 4

私のマシンには少し余裕があったので少々制限を上げて、以下のコマンドでcolimaのインスタンスを作成しました。

colima start --arch x86_64 --memory 16 --cpu 8 --disk 100

% colima start --arch x86_64 --memory 16 --cpu 8 --disk 100

INFO[0000] starting colima                              

INFO[0000] runtime: docker                              

INFO[0001] creating and starting ...                     context=vm

INFO[0088] provisioning ...                              context=docker

INFO[0088] starting ...                                  context=docker

INFO[0095] done                                         

% 


colimaの実行を確認します。

colima list

% colima list

PROFILE    STATUS     ARCH      CPUS    MEMORY    DISK      RUNTIME    ADDRESS

default    Running    x86_64    8       16GiB     100GiB    docker     

% 


コンテナのイメージをダウンロードします。

docker pull container-registry.oracle.com/database/free:latest
docker pull container-registry.oracle.com/database/ords:latest


ダウンロードしたイメージを確認します。Oracle REST Data Sericesのコンテナ・イメージはアーキテクチャ別にarm64とamd64版がありますが、amd64の方がダウンロードされていることをIMAGE IDから確認しておきます。

docker images

% docker images

REPOSITORY                                    TAG       IMAGE ID       CREATED        SIZE

container-registry.oracle.com/database/ords   latest    509be9113a6b   2 months ago   1.93GB

container-registry.oracle.com/database/free   latest    39cabc8e6db0   6 months ago   9.16GB

% 


Oracle REST Data Servicesのコンテナ・イメージにはOracle APEXが含まれていて、作成したコンテナの初回起動時にデータベースへOracle APEXのインストールを行います。Colimaでx86アーキテクチャのエミュレーションを行なっている関係上、データベースへのAPEXのインストールは大変時間がかかり、ORDSからAPEXをインストールしている間にエラーが発生することがあります。

エラーの発生を回避するため、APEXについてはデータベースのコンテナを作成したあとに手元のPCからインストールすることにします。

APEXのダウンロード・ページを開き、ORDSのコンテナに含まれているAPEXと同じバージョンのZIPをダウンロードしておきます。All languagesを使用します。

タウンロード後にZIPファイルを展開しておきます。

Oracle Database Freeのコンテナを作成し実行します。コンテナの名前はapexdb、IPアドレスは固定172.17.0.2を割り当てます。これらは異なる値を割り当てることもできます。その場合は、後続の手順の値も置き換える必要があります。

docker run -d --name apexdb --ip=172.17.0.2 -p 1521:1521 -e ORACLE_PWD=<SYSのパスワード> container-registry.oracle.com/database/free:latest

% docker run -d --name apexdb --ip=172.17.0.2 -p 1521:1521 -e ORACLE_PWD=******* container-registry.oracle.com/database/free:latest

bd60ad77ec0a76f27a9a7cf80bac63918e8fd5fe715d70dd419b3f7051c4cf02

% 


docker psを実行し、コンテナapexdbのステータスがhealthyになるまで待ちます。

docker ps

% docker ps

CONTAINER ID   IMAGE                                                COMMAND                   CREATED         STATUS                   PORTS                                       NAMES

bd60ad77ec0a   container-registry.oracle.com/database/free:latest   "/bin/bash -c $ORACL…"   2 minutes ago   Up 2 minutes (healthy)   0.0.0.0:1521->1521/tcp, :::1521->1521/tcp   apexdb

% 


コンテナapexdbには IPアドレス172.17.0.2を割り当ててはいますが、一応確認します。

docker inspect --format='{{.NetworkSettings.IPAddress}}' apexdb

% docker inspect --format='{{.NetworkSettings.IPAddress}}' apexdb


172.17.0.2

% 


実行中のコンテナapexdbにOracle APEXをインストールします。SQLclを使います。

sql sys/<SYSのパスワード>@localhost:1521/freepdb1 as sysdba

@apexins SYSAUX SYSAUX TEMP /i/

% sql sys/*******@localhost:1521/freepdb1 as sysdba



SQLcl: 木 2月 29 14:41:10 2024のリリース23.4 Production


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


接続先:

Oracle Database 23c Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free

Version 23.3.0.23.09


SQL> @apexins SYSAUX SYSAUX TEMP /i/

...set_appun.sql


PL/SQLプロシージャが正常に完了しました。



:CDB    

_______ 

YES     



:CDB_ROOT    

____________ 

NO           



:META_LINK    

_____________ 

LOCAL         


...set_ufrom_and_upgrade.sql


PL/SQLプロシージャが正常に完了しました。



:SCRIPT_NAME         

____________________ 

apexins_nocdb.sql    



途中でスクリプトが異常終了した場合はコンテナapexdbの停止(docker stop apexdb)と削除(docker rm apexdb)を実施し、コンテナapexdbを作り直して再実行します。

APEXのインストールが終了したら、続けて日本語リソースをインストールします。

@load_trans JAPANESE

timing for: Complete Installation

Elapsed:   49.52


SYS> @load_trans JAPANESE


PL/SQLプロシージャが正常に完了しました。


Installing Oracle APEX translation - JAPANESE



. ORACLE

.

. Application Express Hosted Development Service Installation.

..............................................................


PL/SQLプロシージャが正常に完了しました。



日本語リソースのインストールが終了したら、ユーザーAPEX_PUBLIC_USERをアンロックします。

alter user apex_public_user account unlock no authentication;

...done

Adjust instance settings


PL/SQLプロシージャが正常に完了しました。


SYS> alter user apex_public_user account unlock no authentication;


User APEX_PUBLIC_USERが変更されました。


SYS> 


APEXの管理者パスワードを設定します。

@apxchpwd

SYS> @apxchpwd

...set_appun.sql

================================================================================

This script can be used to change the password of an Oracle APEX

instance administrator. If the user does not yet exist, a user record will be

created.

================================================================================

Enter the administrator's username [ADMIN] 


User "ADMIN" does not yet exist and will be created.


Enter ADMIN's email [ADMIN] 

Enter ADMIN's password [] *********

Created instance administrator ADMIN.



SYS> exit


以上でAPEXのインストールは完了です。

ORDSのコンテナの構成に必要なディレクトリを準備します。macOSでは権限の問題があり、コンテナ内の/etc/ords/configをホストのディレクトリにマッピングできません。

mkdir ords_secrets
chmod 777 ords_secrets

mkdir ords_secrets

chmod 777 ords_secrets 

% 


ords_secrets以下にファイルconn_string.txtを作成します。

echo 'CONN_STRING=sys/パスワード@172.17.0.2:1521/freepdb1' > ords_secrets/conn_string.txt

% echo 'CONN_STRING=sys/*******@172.17.0.2:1521/freepdb1' > ords_secrets/conn_string.txt

%


ORDSのコンテナを作成し実行します。Oracle APEXはすでにデータベースにインストールされているため、APEXのインストールはスキップされます。Oracle REST Data Servicesが構成されます。

docker run --name ords -v `pwd`/ords_secrets/:/opt/oracle/variables -p 8181:8181 container-registry.oracle.com/database/ords:latest

% docker run --name ords -v `pwd`/ords_secrets/:/opt/oracle/variables -p 8181:8181 container-registry.oracle.com/database/ords:latest

INFO : This container will start a service running ORDS 23.4.0 and APEX 23.2.0.

INFO : CONN_STRING has been found in the container variables file.

INFO : Database connection established.

INFO : APEX 23.2.0 is already installed in your database.

INFO : Preparing ORDS.

2024-03-16T05:49:37Z INFO ORDS has not detected the option '--config' and this will be set up to the default directory.


ORDS: Release 23.4 Production on Sat Mar 16 05:49:47 2024


Copyright (c) 2010, 2024, Oracle.


Configuration:

  /etc/ords/config/


Created folder /tmp/ords_logs/install_logs_DB

Oracle REST Data Services - Non-Interactive Install


Retrieving information.

The setting named: db.connectionType was set to: basic in configuration: default

The setting named: db.hostname was set to: 172.17.0.2 in configuration: default

The setting named: db.port was set to: 1521 in configuration: default

The setting named: db.servicename was set to: freepdb1 in configuration: default

The setting named: plsql.gateway.mode was set to: proxied in configuration: default

The setting named: db.username was set to: ORDS_PUBLIC_USER in configuration: default

The setting named: db.password was set to: ****** in configuration: default

The setting named: feature.sdw was set to: true in configuration: default

The global setting named: database.api.enabled was set to: true

The setting named: restEnabledSql.active was set to: true in configuration: default

The setting named: security.requestValidationFunction was set to: ords_util.authorize_plsql_gateway in configuration: default

2024-03-16T05:50:05.617Z INFO        Installing Oracle REST Data Services version 23.4.0.r3461619 in FREEPDB1

2024-03-16T05:50:16.923Z INFO        ... Verified database prerequisites

2024-03-16T05:50:20.145Z INFO        ... Created Oracle REST Data Services proxy user

2024-03-16T05:50:25.611Z INFO        ... Created Oracle REST Data Services schema

2024-03-16T05:50:33.194Z INFO        ... Granted privileges to Oracle REST Data Services

2024-03-16T05:50:57.648Z INFO        ... Created Oracle REST Data Services database objects

2024-03-16T05:52:52.185Z INFO        Completed installation for Oracle REST Data Services version 23.4.0.r3461619. Elapsed time: 00:02:46.340 


2024-03-16T05:52:54.154Z INFO        Completed configuring PL/SQL gateway user for Oracle REST Data Services version 23.4.0.r3461619. Elapsed time: 00:00:01.787 


2024-03-16T05:52:54.157Z INFO        Log file written to /tmp/ords_logs/install_logs_DB/ords_install_2024-03-16_055005_11177.log

2024-03-16T05:52:54.219Z INFO        To run in standalone mode, use the ords serve command:

2024-03-16T05:52:54.227Z INFO        ords --config /etc/ords/config serve

2024-03-16T05:52:54.229Z INFO        Visit the ORDS Documentation to access tutorials, developer guides and more to help you get started with the new ORDS Command Line Interface (http://oracle.com/rest).

INFO : Configuring db.invalidPoolTimeout 5s


ORDS: Release 23.4 Production on Sat Mar 16 05:53:06 2024


Copyright (c) 2010, 2024, Oracle.


Configuration:

  /etc/ords/config/


The global setting named: db.invalidPoolTimeout was set to: 5s

INFO : Configuring debug.printDebugToScreen true


ORDS: Release 23.4 Production on Sat Mar 16 05:53:19 2024


Copyright (c) 2010, 2024, Oracle.


Configuration:

  /etc/ords/config/


The global setting named: debug.printDebugToScreen was set to: true

INFO : Configuring jdbc.MaxLimit 30


ORDS: Release 23.4 Production on Sat Mar 16 05:53:31 2024


Copyright (c) 2010, 2024, Oracle.


Configuration:

  /etc/ords/config/


The setting named: jdbc.MaxLimit was set to: 30 in configuration: default

INFO : Configuring jdbc.InitialLimit 10


ORDS: Release 23.4 Production on Sat Mar 16 05:53:46 2024


Copyright (c) 2010, 2024, Oracle.


Configuration:

  /etc/ords/config/


The setting named: jdbc.InitialLimit was set to: 10 in configuration: default

INFO : Starting the ORDS services with the following database details:

INFO :   172.17.0.2:1521/freepdb1.


ORDS: Release 23.4 Production on Sat Mar 16 05:54:01 2024


Copyright (c) 2010, 2024, Oracle.


Configuration:

  /etc/ords/config/


2024-03-16T05:54:02.783Z INFO        HTTP and HTTP/2 cleartext listening on host: 0.0.0.0 port: 8181

2024-03-16T05:54:03.187Z INFO        The document root is serving static resources located in: /etc/ords/config/global/doc_root

2024-03-16T05:54:31.958Z INFO        Configuration properties for: |default|lo|

db.servicename=freepdb1

awt.toolkit=sun.awt.X11.XToolkit

db.invalidPoolTimeout=5s

java.specification.version=11

conf.use.wallet=true

sun.cpu.isalist=

sun.jnu.encoding=ANSI_X3.4-1968

java.class.path=/opt/oracle/ords/ords.war

java.vm.vendor=Oracle Corporation

sun.arch.data.model=64

nashorn.args=--no-deprecation-warning

java.vendor.url=https://openjdk.java.net/

resource.templates.enabled=false

user.timezone=UTC

db.port=1521

debug.printDebugToScreen=true

java.vm.specification.version=11

os.name=Linux

sun.java.launcher=SUN_STANDARD

user.country=US

sun.boot.library.path=/usr/java/jdk-11.0.15/lib

sun.java.command=/opt/oracle/ords/ords.war --config /etc/ords/config serve --port 8181 --apex-images /opt/oracle/apex/23.2.0/images

jdk.debug=release

sun.cpu.endian=little

user.home=/home/oracle

oracle.dbtools.launcher.executable.jar.path=/opt/oracle/ords/ords.war

user.language=en

java.specification.vendor=Oracle Corporation

java.version.date=2022-04-19

database.api.enabled=true

java.home=/usr/java/jdk-11.0.15

db.username=ORDS_PUBLIC_USER

file.separator=/

java.vm.compressedOopsMode=Zero based

line.separator=


restEnabledSql.active=true

java.specification.name=Java Platform API Specification

java.vm.specification.vendor=Oracle Corporation

java.awt.graphicsenv=sun.awt.X11GraphicsEnvironment

feature.sdw=true

java.awt.headless=true

db.hostname=172.17.0.2

db.password=******

sun.management.compiler=HotSpot 64-Bit Tiered Compilers

security.requestValidationFunction=ords_util.authorize_plsql_gateway

java.runtime.version=11.0.15+8-LTS-149

user.name=oracle

path.separator=:

os.version=6.5.0-25-generic

java.runtime.name=Java(TM) SE Runtime Environment

file.encoding=ANSI_X3.4-1968

plsql.gateway.mode=proxied

java.vm.name=Java HotSpot(TM) 64-Bit Server VM

java.vendor.version=18.9

java.vendor.url.bug=https://bugreport.java.com/bugreport/

java.io.tmpdir=/tmp

oracle.dbtools.cmdline.ShellCommand=ords

java.version=11.0.15

user.dir=/etc/ords/config

os.arch=amd64

java.vm.specification.name=Java Virtual Machine Specification

jdbc.MaxLimit=30

java.awt.printerjob=sun.print.PSPrinterJob

oracle.dbtools.cmdline.home=/opt/oracle/ords

sun.os.patch.level=unknown

java.library.path=/usr/java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib

java.vendor=Oracle Corporation

java.vm.info=mixed mode

java.vm.version=11.0.15+8-LTS-149

sun.io.unicode.encoding=UnicodeLittle

jdbc.InitialLimit=10

db.connectionType=basic

java.class.version=55.0


2024-03-16T05:55:03.759Z INFO        


Mapped local pools from /etc/ords/config/databases:

  /ords/                              => default                        => VALID     



2024-03-16T05:55:04.428Z INFO        Oracle REST Data Services initialized

Oracle REST Data Services version : 23.4.0.r3461619

Oracle REST Data Services server info: jetty/10.0.18

Oracle REST Data Services java info: Java HotSpot(TM) 64-Bit Server VM 11.0.15+8-LTS-149



以上でOracle REST Data Servicesの構成が完了しました。

コンテナordsを停止します。

docker stop ords

% docker stop ords

ords

% 


もう一度コンテナordsを起動します。

docker starrt ords

ORDSが起動を確認したのち(1分くらいかかります)、手元のブラウザよりhttp://localhost:8181/ordsを開きます。

ORDSのランディング・ページが開きます。


Oracle APEXのページを開きます。これも時間がかかります。


コンテナとしてapexdbおよびordsが作成されたので、以降は以下の手順で環境の停止と起動ができます。

停止

docker stop ords
docker stop apexdb

起動

docker start apexdb
docker start ords

何とかApple MシリーズのMacでもOracle APEXを動作させることができましたが、ひどく遅いことは確かで通常のアプリケーション開発で使用するのは難しいと思います。