카테고리 없음

Apple Silicon Oracle Docker (M1, M2, M3)

Birdie_Hyun 2024. 7. 8. 18:24

1. 문제 정의

로컬 환경에서 oracle을 실행할 일이 생겼습니다.

하지만 Oracle의 경우 공식적인 oracle image를 제공하지 않기 때문에 oracle 로컬 구축에 어려움이 있습니다.

심지어 apple sillicon의 경우 docker-desktop을 이용해서는 컨테이너를 실행할 수 없습니다.

2. 해결 방법

2-1 colima 설치

가장 많이 나오는 해결 방법입니다.

oracle을 x86-64 환경에서 실행할 수 있도록 docker 의 새로운 context를 생성해줍니다.

해당 방법은 다른 블로그 글이 많이 때문에 생략하도록 하겠습니다.

2-2 oracle linux를 이용한 oracle db 생성

해결방법은 oracle 깃헙을 통해서 찾을 수 있었습니다.

https://github.com/oracle

oracle 내부 repository를 둘러보다 oracle dba를 발견하였고, 해결방법을 찾을 수 있었습니다.

우선 아래 repository를 clone 해줍니다.

git clone <https://github.com/oraclesean/cloud-native-oracle.git>

clone한 프로젝트 내부에서 아래의 쉘 스크립트를 실행해줍니다.

./buildDBImage.sh

아래 로그와 같이 뜬다면 성공입니다. (필자 기준 2분정도 소요됐습니다.)

# ./buildDBImage.sh
[+] Building 51.6s (8/8) FINISHED                                                   docker:desktop-linux
 => [internal] load .dockerignore                                                                   0.0s
 => => transferring context: 2B                                                                     0.0s
 => [internal] load build definition from Dockerfile.oraclelinux.202307031409.jTxd                  0.0s
 => => transferring dockerfile: 1.55kB                                                              0.0s
 => [internal] load metadata for docker.io/library/oraclelinux:8-slim                               1.3s
 => [internal] load build context                                                                   0.0s
 => => transferring context: 45.06kB                                                                0.0s
 => CACHED [1/3] FROM docker.io/library/oraclelinux:8-slim@sha256:0226d80b442e93f977753e1d          0.0s
 => => resolve docker.io/library/oraclelinux:8-slim@sha256:0226d80b442e93f977753e1d269c8ec          0.0s
 => [2/3] COPY manageOracle.sh /opt/scripts/                                                        0.0s
 => [3/3] RUN chmod ug+x /opt/scripts/manageOracle.sh &&      /opt/scripts/manageOracle.sh         48.7s
 => exporting to image                                                                              1.5s
 => => exporting layers                                                                             1.5s
 => => writing image sha256:6cdb5ddeb9d8ffbfcaeba0cb1fad0c003dbffc3cd77b204a8ddc60292e184b          0.0s
 => => naming to docker.io/library/oraclelinux:8-slim-19c                                           0.0s
oraclelinux:8-slim-19c
[+] Building 193.8s (21/21) FINISHED                                                docker:desktop-linux
 => [internal] load .dockerignore                                                                   0.0s
 => => transferring context: 2B                                                                     0.0s
 => [internal] load build definition from Dockerfile.db.202307031410.NUni                           0.0s
 => => transferring dockerfile: 5.11kB                                                              0.0s
 => resolve image config for docker.io/docker/dockerfile:1.4                                        0.9s
 => CACHED docker-image://docker.io/docker/dockerfile:1.4@sha256:9ba7531bd80fb0a858632727c          0.0s
 => [internal] load metadata for docker.io/library/oraclelinux:8-slim-19c                           0.0s
 => [db 1/6] FROM docker.io/library/oraclelinux:8-slim-19c                                          0.0s
 => [internal] load build context                                                                  38.5s
 => => transferring context: 2.42GB                                                                38.5s
 => [db 2/6] COPY --chown=oracle:oinstall manageOracle.sh      /opt/scripts/                        0.6s
 => [stage-1 2/9] COPY --chown=oracle:oinstall ./config/dbca.*        /opt/install/                 0.6s
 => [stage-1 3/9] COPY --chown=oracle:oinstall ./config/*.tmpl        /opt/install/                 0.0s
 => [db 3/6] COPY --chown=oracle:oinstall ./config/inst.*     /opt/install/                         0.0s
 => [db 4/6] COPY --chown=oracle:oinstall ./config/manifest.* /opt/install/                         0.0s
 => [stage-1 4/9] COPY --chown=oracle:oinstall manageOracle.sh         /opt/scripts/                0.0s
 => [db 5/6] COPY --chown=oracle:oinstall ./database/         /opt/install/                         6.3s
 => [db 6/6] RUN  chmod ug+x /opt/scripts/manageOracle.sh &&      /opt/scripts/manageOracl         98.9s
 => [stage-1 5/9] COPY --chown=oracle:oinstall --from=db /u01/app/oraInventory  /u01/app/o          0.0s
 => [stage-1 6/9] COPY --chown=oracle:oinstall --from=db /u01/app/oracle /u01/app/oracle           18.6s
 => [stage-1 7/9] COPY --chown=oracle:oinstall --from=db /opt/oracle/oradata     /opt/orac          0.0s
 => [stage-1 8/9] RUN  /opt/scripts/manageOracle.sh -R                                              0.5s
 => [stage-1 9/9] WORKDIR /home/oracle                                                              0.0s
 => exporting to image                                                                             17.6s
 => => exporting layers                                                                            17.6s
 => => writing image sha256:4874efbbfe1cfb271e314ed8d6d0773e5a270d1a0b789861af76e59d4b6f82          0.0s
 => => naming to docker.io/oraclesean/db:19.19-EE                                                   0.0s

2-2 oracle 실행하기

이미지 빌드가 끝나면 간단히 실행할 수 있습니다.

docker run -d --name oracle -p 1521:1521 ${이미지}

이렇게 실행할 경우 아래와 같은 에러를 만날 수 있습니다.

2024-05-09 15:10:27 [FATAL] [DBT-06006] Unable to create directory: (/u02/app/oracle/oradata/test/).
2024-05-09 15:10:27    CAUSE: Proper permissions are not granted to create the directory or there is no space left in the volume.
2024-05-09 15:10:27 [FATAL] [DBT-06006] Unable to create directory: (/u03/app/oracle).
2024-05-09 15:10:27    CAUSE: Proper permissions are not granted to create the directory or there is no space left in the volume.
2024-05-09 15:10:28 alter pluggable database all open
2024-05-09 15:10:28 *
2024-05-09 15:10:28 ERROR at line 1:
2024-05-09 15:10:28 ORA-01034: ORACLE not available
2024-05-09 15:10:28 Process ID: 0
2024-05-09 15:10:28 Session ID: 0 Serial number: 0
2024-05-09 15:10:28 
2024-05-09 15:10:28 
2024-05-09 15:10:28 alter pluggable database all save state
2024-05-09 15:10:28 *
2024-05-09 15:10:28 ERROR at line 1:
2024-05-09 15:10:28 ORA-01034: ORACLE not available
2024-05-09 15:10:28 Process ID: 0
2024-05-09 15:10:28 Session ID: 0 Serial number: 0
2024-05-09 15:10:28 
2024-05-09 15:10:28 
2024-05-09 15:10:28 
2024-05-09 15:10:28 # ----------------------------------------------------------------------------------------------- #
2024-05-09 15:10:28   runDBCA: DBCA complete at 2024-05-09 05:10:28
2024-05-09 15:10:28 # ----------------------------------------------------------------------------------------------- #
2024-05-09 15:10:29 ERROR: Cannot locate /home/oracle/bin/sqlplus
2024-05-09 15:10:29 Exiting...
2024-05-09 15:10:29 WARNING: Database setup for test was unsuccessful.
2024-05-09 15:10:29 WARNING: Check log output for additional information.
2024-05-09 15:10:29 
2024-05-09 15:10:29 # ----------------------------------------------------------------------------------------------- #
2024-05-09 15:10:29   Tailing alert_test.log: 
2024-05-09 15:10:26 mkdir: cannot create directory '/u03/app/oracle/fast_recovery_area': Permission denied
2024-05-09 15:10:27 cat: /u01/app/oracle/cfgtoollogs/dbca/test/test.log: No such file or directory
2024-05-09 15:10:27 cat: /u01/app/oracle/cfgtoollogs/dbca/test.log: No such file or directory
2024-05-09 15:10:27 cat: /u01/app/oracle/cfgtoollogs/dbca/test/testPDB1/test.log: No such file or directory
2024-05-09 15:10:28 mkdir: cannot create directory '/u02/app/oracle/oradata/dbconfig': Permission denied
2024-05-09 15:10:29 /opt/scripts/manageOracle.sh: line 934: /home/oracle/bin/sqlplus: No such file or directory
2024-05-09 15:10:29 tail: cannot open '/u01/app/oracle/diag/rdbms/*/*/trace/alert*.log' for reading: No such file or directory
2024-05-09 15:10:29 tail: no files remaining

oracle 저장 디렉토리를 마운트하지 않아서 발생한 문제입니다.

디렉토리를 로컬 mac 에서 생성해 준 후 다음과 같이 실행해줍니다.

docker run -d --name oracle -e ORACLE_PWD=password123 \\
  -p 1521:1521 \\
  -v /사용자_경로/data/oracle/oradata:/u02/app/oracle/oradata \\
  -v /사용자_경로/data/oracle/diag:/u01/app/oracle/diag \\
  -v /사용자_경로/data/oracle/audit:/u01/app/oracle/admin \\
  -v /사용자_경로/oracle/reco:/u03/app/oracle \\
  -v /사용자_경로/data/oracle/scripts:/scripts \\
	${ORACLE_DB_IMAGE}

로그를 출력해보면 다음과 같다.

oracle이 정상적으로 실행되기까지 대략 10여분 정도가 소요됐다.

# docker logs -f $CONTAINER_NAME

# ----------------------------------------------------------------------------------------------- #
  Oracle password for SYS, SYSTEM and PDBADMIN: HB#K_xhkwM_O10
# ----------------------------------------------------------------------------------------------- #

# ----------------------------------------------------------------------------------------------- #
  runDBCA: Running DBCA for database ARM at 2023-07-03 20:16:05
# ----------------------------------------------------------------------------------------------- #

LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 03-JUL-2023 20:16:05

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

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

TNSLSNR for Linux: Version 19.0.0.0.0 - Production
System parameter file is /u01/app/oracle/product/19c/dbhome_1/network/admin/listener.ora
Log messages written to /u01/app/oracle/diag/tnslsnr/96bb65f2a1b7/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521)))

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 19.0.0.0.0 - Production
Start Date                03-JUL-2023 20:16:06
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/19c/dbhome_1/network/admin/listener.ora
Listener Log File         /u01/app/oracle/diag/tnslsnr/96bb65f2a1b7/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521)))
Services Summary...
Service "ARM" has 1 instance(s).
  Instance "ARM", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
# ----------------------------------------------------------------------------------------------- #
  runDBCA: Creating container database ARM and 3 pluggable database(s) with name ARMPDB at 2023-07-03 20:16:06
# ----------------------------------------------------------------------------------------------- #
Prepare for db operation
8% complete
Copying database files
31% complete
Creating and starting Oracle instance
32% complete
36% complete
40% complete
43% complete
46% complete
Completing Database Creation
51% complete
54% complete
Creating Pluggable Databases
58% complete
63% complete
68% complete
77% complete
Executing Post Configuration Actions
100% complete
Database creation complete. For details check the logfiles at:
 /u01/app/oracle/cfgtoollogs/dbca/ARM.
Database Information:
Global Database Name:ARM
System Identifier(SID):ARM
Look at the log file "/u01/app/oracle/cfgtoollogs/dbca/ARM/ARM.log" for further details.

Pluggable database altered.

Pluggable database altered.

# ----------------------------------------------------------------------------------------------- #
  runDBCA: DBCA complete at 2023-07-03 20:26:37
# ----------------------------------------------------------------------------------------------- #

# ----------------------------------------------------------------------------------------------- #
  Database ARM with unique name ARM is open and available.
# ----------------------------------------------------------------------------------------------- #

# ----------------------------------------------------------------------------------------------- #
  Tailing alert_ARM.log:
2023-07-03T20:26:36.493063+00:00
ARMPDB3(5):CREATE SMALLFILE TABLESPACE "USERS" LOGGING  DATAFILE  '/opt/oracle/oradata/ARM/ARMPDB3/users01.dbf' SIZE 5M REUSE AUTOEXTEND ON NEXT  1280K MAXSIZE UNLIMITED  EXTENT MANAGEMENT LOCAL  SEGMENT SPACE MANAGEMENT  AUTO
ARMPDB3(5):Completed: CREATE SMALLFILE TABLESPACE "USERS" LOGGING  DATAFILE  '/opt/oracle/oradata/ARM/ARMPDB3/users01.dbf' SIZE 5M REUSE AUTOEXTEND ON NEXT  1280K MAXSIZE UNLIMITED  EXTENT MANAGEMENT LOCAL  SEGMENT SPACE MANAGEMENT  AUTO
ARMPDB3(5):ALTER DATABASE DEFAULT TABLESPACE "USERS"
ARMPDB3(5):Completed: ALTER DATABASE DEFAULT TABLESPACE "USERS"
2023-07-03T20:26:37.882084+00:00
alter pluggable database all open
Completed: alter pluggable database all open
alter pluggable database all save state
Completed: alter pluggable database all save state