기타/docker

[ docker ] - docker에서 oracle 데이터베이스 설치 실행 (feat. mac m1)

algml0703 2025. 1. 12. 18:43
반응형

docker에서 oracle 데이터베이스 설치 실행 (feat. mac m1)

오라클 데이터베이스의 경우 공식적으로는 macOS를 지원하지 않아서 mac에서 로컬로 오라클 데이터베이스를 사용하기 위해서는 도커를 사용하거나, Virtual Box나 VMware같은 가상화 소프트웨어를 이용해야 한다. 그 중에서는 나는 도커를 사용하여 오라클 데이터베이스를 로컬에서 실행해보았다. 근데 기존에 도커에서 그냥 단순히 이미지를 pull 받아서 해당 이미지를 run하여 컨테이너로 만들어 실행시키는 방식이 나의 경우 무엇이 문제인지 정확히 모르겠지만 계속 에러가 났다. docker를 삭제했다가 재설치 하는 식으로도 여러 번 해보고, 오라클 이미지를 각기 다른 이미지를 받아 실행시켜 보았는데도 실행하면 계속 컨테이너가 꺼졌다. 어찌 어찌 해결은 했는데 추후에 혹시 또 노트북 바꾸거나 새로 세팅해야 하는 경우를 대비하여 글로 작성하였다. (아래의 방식은 직접 오라클 도커 이미지를 빌드한 후 직접 빌드한 이미지를 컨테이너로 실행시킨 것이다.)

** 맥에서 직접 오라클을 실행시키는 것은 안 되고, 도커로 이미지를 빌드해서 오라클을 실행시키는 것은 가능한 이유?

 1. git에서 직접 oracle docker-images 다운 받기

> git clone https://github.com/oracle/docker-images

(https://github.com/oracle/docker-images)

위치는 바탕화면에 docker-images 폴더 하위에 프로젝트를 받았다. 즉 프로젝트가 desktop/docker-images/docker-images로 존재하는데 나는 프로젝트 폴더명을 oracle로 변경하여서 desktop/docker-images/oracle 구조가 되었다.

2. oracle 실행 zip 다운로드  (LINUX.X64_191900_db_home.zip)

https://www.oracle.com/database/technologies/oracle19c-linux-arm64-downloads.html

위의 링크를 통해 오라클 데이터베이스를 직접 다운로드 받고, 해당 zip파일(LINUX.X64_191900_db_home.zip)은 desktop/docker-images/oracle/OracleDatabase/SingleInstance/dockerfiles/19.3.0 폴더의 하위에 위치시킨다. (이때 주의

점은 압축파일을 해제해서 위치시키는게 아니라 zip 파일 그대로 위치시키는 것이다.)

3.  docker image build

> ./buildContainerImage.sh -e -v 19.3.0 -t oracle19c

** 위 명령어는 도커 이미지 빌드 시 oracle19c 라는 도커 이미지명을 사용하고, 버전은 19.3.0임

desktop/docker-images/oracle/OracleDatabase/SingleInstance/dockerfiles 폴더 하위에 buildContainerImage.sh란 파일이 존재하는데 도커 이미지로 빌드하기 위해 위의 명령어로 해당 파일을 실행시킨다. 이때 명령어 실행하는 터미널 위치는 desktop/docker-images/oracle/OracleDatabase/SingleInstance/dockerfiles 이어야 한다. 해당 위치가 아닌 경우에는 /desktop/docker-images/oracle/OracleDatabase/SingleInstance/dockerfiles/buildContainerImage.sh -e -v 19.3.0 -t oracle19c 이와 같이 경로를 모두 명시해주어야 한다.

** 이때에 주의점은 두번째 단계에서 다운로드하였던 설치 파일이 해당 버전의 디렉토리 안에 존재해야 한다. 즉 dockerfiles/19.3.0 폴더 하위에 오라클 설치 파일(=LINUX.X64_191900_db_home.zip)이 존재해야 한다. 

도커 이미지 빌드가 완료되면 최종적으로 build completed in ~ 이런 식으로 나온다.

이후 아래 명령어 실행 시 oracle19c 라는 이름의 도커 이미지가 생성된 것을 확인할 수 있다.

> docker images

4. 도커 이미지를 통해 컨테이너 생성 및 실행

> mkdir -p ~/Desktop/dockerdatas/oracledata/oradata

컨테이너를 종료하거나 재시작하더라고 데이터가 손실되지 않도록 컨테이너 생성 시 볼륨 마운트 설정해줄 폴더 생성하여주는 명령어

> sudo chown -R 54321:54321 ~/Desktop/dockerdatas/oracledata/oradata

chown은 Change Ownership의 약자로 파일과 디렉토리의 소유자와 소유그룹(첫 번째가 소유자, 두 번째가 소유 그룹)을 변경해주기 위해 사용하는 명령어이다. 더불어 -R은 해당 디렉토리는 물론 하위의 모든 파일 및 디렉토리에도 적용함을 의미한다. 즉 해당 디렉토리에 대한 소유자와 소유그룹의 ID를 54321로 변경해준 것인데, 이는 도커 컨테이너 내부의 프로세스가 특정 파일에 접근할 때 사용자 ID와 그룹 ID 를 필요로 하는데 기본적으로 Oracle 도커 이미지의 경우에는 데이터 파일의 소유자 ID와 소유 그룹 ID를 54321로 갖고 있도록 하고 있다. 때문에 데이터 볼륨을 마운트 설정해주기 위해서는 해당 디렉토리가 컨테이너에서 사용하는 사용자ID/그룹ID와 일치하도록 설정해준 것이다.

> Sudo chmod -R 777 ~/Desktop/dockerdatas/oracledata/oradata

chmod는 change mode의 약자로 디렉토리나 파일의 권한을 변경하여 주는 명령어이다. 컨테이너가 해당 파일에 대해 읽기/쓰기와 같은 작업을 원활하게 수행할 수 있도록 해당 디렉토리에 대해 모든 권한도 허용하여 주었다. 

- 첫 번째 숫자 : 소유자 권한
- 두 번째 숫자 : 소유 그룹 권한
- 세 번째 숫자 : 기타 사용자 권한
4 (읽기) + 2 (쓰기) + 1 (실행) = 7
즉 모든 사용자에게 읽기, 쓰기, 실행의 권한을 부여함

> docker run --name local-oracle -d -p 1521:1521 -e ORACLE_SID=ORCLDB -e ORACLE_PWD=1234 -e ORACLE_CHARACTERSET=AL32UTF8 -v /Users/mihee/desktop/dockerdatas/oracledata/oradata:/opt/oracle/oradata oracle19c:latest
docker run 컨테이너를 생성하고 실행
-d 컨테이너를 백그라운드로 실행, 해당 옵션을 주지 않는 경우, 컨테이너가 생성 실행되는 동안 터미널에서 다른 작업이 불가능하다.
--name [컨테이너명]  해당 컨테이너 생성 또는 실행 시 컨테이너명 
-p [호스트포트번호]:[컨테이너내부포트번호] 호스트(=로컬컴퓨터)의 포트와 컨테이너 내부의 포트를 매핑해줌
ex) -p 1521:1521 로컬컴퓨터의 1521포트로 접속 시 컨테이너 1521 포트로 접속 가능
-e [환경변수키]=[환경변수값] 환경변수 설정해준 것
ex) -e ORACLE_SID=ORCLDB  ORACLE_SID는 오라클 데이터베이스의 식별자로 즉 ORCLDB를 데이터베이스명으로 사용
ex) -e ORACLE_PWD=1234 오라클 관리자 계정(SYS, SYSTEM)으로 접속 시 비밀번호
ex) -e ORACLE_CHARACTERSET=AL32UTF8 데이터베이스 문자 설정, AL32UTF8
-v [호스트디렉토리]:[컨테이너디렉토리] 볼륨마운트 설정을 위한 옵션으로, 컨테이너가 종료되어도 데이터를 영구적으로 보존할 수 있도록 로컬에 저장해두는 공간을 설정해두는 것이다. 즉 컨테이너 내부적으로 오라클 데이터 파일이 저장되는 디렉토리를 호스트의 디렉토리로 매핑하여 준 것이다.
> docker exec -it local-oracle sqlplus sys as sysdba

local-oracle 컨테이너 내부의 터미널에 접속하여 관리자 계정으로 sqlplus 실행

이후 아래와 같이 비밀번호 입력

> select instance_name, status from v$instance; 쿼리를 통해 데이터베이스 상태 확인

+ DBeaver 접속 시 


관련 에러

우선 docker run 했을 때 아래와 같이 에러난 경우

WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64)

해당 에러 발생하는 경우 docker 실행 시에 --platform linux/amd64 이런 식으로 옵션 추가해서 실행하라는 글이 많았는데 내 경우에는 해당 옵션을 붙여서 컨테이너를 생성하면 컨테이너가 생성되고 실행되는 것처럼 보여도 실질적으로 오라클 실행해보면 오라클 실행이 안 되었다. 이런 경고가 뜨는 이유는 말그대로 docker 이미지와 내 컴퓨터 사이의 플랫폼 아키텍처가 맞지 않아서 그런 것이였다. 도커는 linux/amd64 기반인데 내가 사용하는 mac의 경우 linux/arm64 기반이었기 때문이다. (m1, m2의 경우 arm 기반 프로세서이다)

위 문제 해결을 위해 한 것

1. 맥 소프트웨어 업데이트 

2. qemu 설치 (brew install qemu)

3. 도커 삭제 후 재설치 

// 위의 작업 이후에 글의 처음부터 다시 작업. (약간 이것저것 해보다가 성공한거라 뭐 때문에 성공했는지는 정확하지 않음...)

 

** 더 알아볼 것 , qemu?, 멀티 아키텍처?, arm프로세서?

 

 

참고:

docker 설치 : https://king-ja.tistory.com/107

docker로 oracle 실행하는 방법 : https://growupcoding.tistory.com/18

qemu 관련 참고 : https://jaejade.tistory.com/226?category=787339

반응형

'기타 > docker' 카테고리의 다른 글

[ docker ] - docker 실행 에러  (0) 2023.06.18