2024年3月26日火曜日

Apple MシリーズのMacでOracle Autonomous Database Free Container Imageを動かす

Apple MシリーズのMacでOracle Autonomous Database Free Container Imageを動かしてみました。大体はOracle Container Registryに記載されている手順に従えばコンテナは起動しますが、作業していて躓いた点を記載します。

以下のドキュメントに記載されている手順を実施します。

Oracle Autonomous Database Free Container Image Documentation
以下のMacbook Proで作業を行なっています。今となっては世代が古いM1チップです。Mシリーズの世代で動作は変わらないとは思いますが、QEMUによるIntel CPUのエミュレーションで動作させるため、CPUの世代の違いで動作が変わることが無いとは言えません。


FAQHow can I install colima and docker on machines with M1/M2 chips ?に記載されている手順に従い、docker、docker-compose、colima、qemuをインストールします。

brew install docker
brew install docker-compose
brew install colima
brew install qemu

今回の作業で使用しているバージョンは以下です。

% docker --version

Docker version 26.0.0, build 2ae903e86c

% docker-compose --version

Docker Compose version 2.26.0

% colima --version

colima version 0.6.8

% qemu-system-x86_64 -version

QEMU emulator version 8.2.1

Copyright (c) 2003-2023 Fabrice Bellard and the QEMU Project developers

% 


FAQHow can I start Colima x86_64 Virtual Machine using Apple's new virtualization framework - Rosetta ?の手順に従って、Colimaを構成します。

ただし、Philipp Salvisbergさんが彼のブログ記事「Oracle Database 23c on a Mac with an M-Series Chip」で指摘されていますが、colima startの引数として--arch x86_64が与えられている場合、ColimaはIntel CPUのエミュレーションにQEMUを使用し、AppleのRosetta2は使用しません。そのため、--vm-type vzおよび--vz-rosettaを指定する意味は無いようです。Colimaの用途に限ればRosetta2のインストールも不要と思われます。

colimaを開始します。

cpuに4、memoryに10を与えます。

colima start --cpu 4 --memory 10 --arch x86_64

FAQHow can I start Colima x86_64 Virtual Machine with minimum memory/cpu requirements ?のNoteに「Running x86_64 arch containers can have issues translating instructions for ARM. We give higher memory to the VM to avoid such issues」と記載があり、Colimaを開始するコマンドの引数cpuに4、memoryに10が指定されています。リソースに余裕があれば、cpu数やmemoryは(特にmemoryは)増やしても良いかと思います。

% colima start --cpu 8 --memory 18 --arch x86_64


INFO[0000] starting colima                              

INFO[0000] runtime: docker                              

INFO[0001] starting ...                                  context=vm

INFO[0065] provisioning ...                              context=docker

INFO[0067] starting ...                                  context=docker

INFO[0077] done                                         

% 


あらかじめコンテナ・イメージをダウンロードしておきます。

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

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

latest: Pulling from database/adb-free

66cb99a7273e: Pull complete 

0e3c46fdb0f9: Pull complete 

054518c1d5d2: Pull complete 

Digest: sha256:65641de72d0e18787bca990c452b3a13fab6ca3a6f00f6e4bd758520efd82bf4

Status: Downloaded newer image for container-registry.oracle.com/database/adb-free:latest

container-registry.oracle.com/database/adb-free:latest

% 


コンテナadb-freeを作成します。作成するAutonomous Datababaseの管理者パスワードを環境変数MYPASSに設定します。ワークロード・タイプにATPを指定します。

export MYPASS=<ADBのパスワード>

docker run -d \
-p 1521:1522 \
-p 1522:1522 \
-p 8443:8443 \
 -p 27017:27017 \
-e WORKLOAD_TYPE='ATP' \
-e WALLET_PASSWORD=$MYPASS \
-e ADMIN_PASSWORD=$MYPASS \
--cap-add SYS_ADMIN \
--device /dev/fuse \
--name adb-free \
container-registry.oracle.com/database/adb-free:latest

% export MYPASS=********

% docker run -d \

-p 1521:1522 \

-p 1522:1522 \

-p 8443:8443 \

 -p 27017:27017 \

-e WORKLOAD_TYPE='ATP' \

-e WALLET_PASSWORD=$MYPASS \

-e ADMIN_PASSWORD=$MYPASS \

--cap-add SYS_ADMIN \

--device /dev/fuse \

--name adb-free \

container-registry.oracle.com/database/adb-free:latest

b25947e90852286716d9f7fa2abca0d3e56086bad56535843c7938ddbabcd5b7

% 


構成スクリプトの実行状況をlogsコマンドで確認します。

docker logs -f adb-free

% docker logs -f adb-free

Archive:  /u01/POD1.zip

   creating: /u01/app/oracle/oradata/

   creating: /u01/app/oracle/oradata/POD1/

   creating: /u01/app/oracle/oradata/POD1/0A156A2AE0DA39A7E06377234664C7E0/

   creating: /u01/app/oracle/oradata/POD1/0A156A2AE0DA39A7E06377234664C7E0/datafile/

  inflating: /u01/app/oracle/oradata/POD1/0A156A2AE0DA39A7E06377234664C7E0/datafile/o1_mf_temp_lwbwv5fk_.tmp  

   creating: /u01/app/oracle/oradata/POD1/0A1438F87F472D38E0637723466488D2/

   creating: /u01/app/oracle/oradata/POD1/0A1438F87F472D38E0637723466488D2/datafile/

  inflating: /u01/app/oracle/oradata/POD1/0A1438F87F472D38E0637723466488D2/datafile/o1_mf_temp_lwbwv4cg_.tmp  

  inflating: /u01/app/oracle/oradata/POD1/redo01.log  

   creating: /u01/app/oracle/oradata/POD1/10E957D242B84061E0636402000AF924/

   creating: /u01/app/oracle/oradata/POD1/10E957D242B84061E0636402000AF924/datafile/


構成スクリプトの実行中にエラーが発生し、コンテナが停止することがあります。そのような場合は、docker startでコンテナを再度開始するか、またはコンテナを再作成します。

例えば、以下のように/usr/local/bin/ordsによる構成作業が中断したことがありました。

# /tmp/hs_err_pid767.log

Could not load hsdis-amd64.so; library not loadable; PrintAssembly is disabled

#

# If you would like to submit a bug report, please visit:

#   https://bugreport.java.com/bugreport/crash.jsp

#

/usr/local/bin/ords: line 222:   767 Aborted                 ${JAVA} "${APP_VM_OPTS[@]}" ${ORDS_DEBUG} -jar "${ORDS_HOME}"/${ORDS_WAR} ${ORDS_VERBOSE} "$@"


コンテナは停止しているため、docker psではリストされません。

% docker ps

CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

%


docker container ls -aを実行すると、コンテナadb-freeは作成されていることが確認できます。

docker container ls -a

% docker container ls -a

CONTAINER ID   IMAGE                                                    COMMAND                   CREATED          STATUS                       PORTS     NAMES

b25947e90852   container-registry.oracle.com/database/adb-free:latest   "/bin/bash -c /u01/s…"   12 minutes ago   Exited (134) 4 minutes ago             adb-free

%


コンテナadb-freeを起動します。

docker start adb-free

% docker start adb-free

adb-free

% 


また、以下のような状況でエラーが発生し、構成スクリプトが中断したこともありました。

ORDS: Release 23.4 Production on Tue Mar 26 05:41:46 2024


Copyright (c) 2010, 2024, Oracle.


Configuration:

  /u01/ords/


Oracle REST Data Services - Non-Interactive Customer Managed ORDS for Autonomous Database

Error the Autonomous database connection failed for user: ADMIN  TNS service name: MY_ATP_low

java.sql.SQLRecoverableException: IO Error: Connection reset by peer, connect lapse 1508 ms., Authentication lapse 0 ms.


この場合は、コンテナを削除して作り直すことで対応できました。(docker rmとdocker runの再実行)。原因は不明ですが、Colimaの環境を作成した直後にadb-freeのコンテナを作成すると、コンテナの再作成が必要なエラーが発生することが多い気がします。

最終的には以下のようにORDSが起動し、コンテナの作成が完了します。

2024-03-26T06:29:05.910Z WARNING     *** jdbc.InitialLimit in configuration |default|lo| is using a value of 3, this setting may not be sized adequately for a production environment ***

2024-03-26T06:29:49.577Z INFO        


Mapped local pools from /u01/ords/databases:

  /ords/                              => default                        => VALID     



2024-03-26T06:29:50.285Z 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.21+9-LTS-193


2024-03-26T06:31:43.906760+00:00

MY_ATP(3):Resize operation completed for file# 503, fname /u01/app/oracle/oradata/POD1/10E957D242B84061E0636402000AF924/datafile/o1_mf_temp_m04tjrwy_.dbf, old size 2048K, new size 12288K



コンテナadb-freeが起動していると、以下のURLで手元のMacからアクセスできます。

https://localhost:8443/ords/

自己署名証明書によりHTTPSにしているため、証明書のエラーが発生します。


エラーを無視して接続すると、以下のページが開きます。


これ以降はAutonomous Databaseとして操作できます。