Mac에서 Oracle 실행하기
Running Oracle on macOS
도커 설정
오라클은 맥을 지원하지 않지만 도커 컨테이너를 사용해 실행할 수 있다.
공식 오라클 도커이미지 OCR 주소
- container-registry.oracle.com/database/free
- container-registry.oracle.com/database/enterprise
- container-registry.oracle.com/database/standard
상용버전이 아닌 테스트나 개인프로젝트 용도이므로 Free 버젼을 사용해야 한다.
% docker pull container-registry.oracle.com/database/free:latest
% docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
container-registry.oracle.com/database/free latest ef56a6ad07e8 5 weeks ago 13.2GB
도커 볼륨생성
작업내용이 컨테이너 내부에 저장되면 유실위험이 크고 딜레이와 충돌위험도 증가하기 때문에 도커 스토리지 세팅을 변경해 생성파일 위치를 컨테이너 내부가 아닌 로컬로 분리해줘야 한다. (후술 하겠지만 맥에서 이 로컬은 도커VM 이 된다)
DB운영용도로는 볼륨 마운트를 사용해야하고 일반적인 개발용도로는 로컬의 개발소스를 컨테이너에서 빌드하고 실행 할 수 있는 바인드 마운트를 사용한다.
컨테이너와 작업물들을 분리한다는 개념은 같지만 관리주체, 경로, 권한제어 방식의 차이로 생각하면 된다.
- Volume Mount : 도커가 추상화한 ‘독립영역’ (컨테이너가 관리)
- Bind Mount : 호스트와 직접 연결된 ‘실제 디렉토리’ (호스트가 관리)
| Volume Mount (도커볼륨) | Bind Mount (직접마운트) | |
|---|---|---|
| 생성위치 | Docker 관리 영역 /var/lib/docker/volumes/... | 로컬 PC의 지정 경로 |
| 관리방식 | Docker가 생성/관리 | 사용자(OS)가 직접 디렉토리 생성 및 관리 |
| 백업.이동 | Docker 명령으로 쉽게 가능 | 직접 파일 복사해야 함 |
| 보안 | 상대적으로 안전 (호스트 구조와 분리) | 호스트 파일 시스템 전체가 노출될 수 있음 |
| 용도 | DB, 지속 저장소, 컨테이너 데이터 보관 | 개발환경 공유, 소스코드 수정 반영 |
| 성능 | 최적화됨 | 환경에 따라 성능이 떨어질 수 있음 |
| 안정성 | 매우 높음 | 로컬 FS 의존, 오류 위험 |
% docker volume create oradata
% docker volume ls
DRIVER VOLUME NAME
local oradata
도커 컨테이너 생성
- –name : 컨테이너이름
- -e ORACLE_PWD : 오라클 패스워드
- -p : 1521: 리스너포트, 5500: Em Express 포트 (웹용 관리자 인터페이스)
- -v : 컨테이너 내부에서 오라클이 데이터를 저장하는 주소( destination 경로. 후술함)
- -d : detached 모드로 실행 : 터미널을 차지하지 않고 백그라운드 실행
% docker run --name oracle \
-p 1521:1521 -p 5500:5500 \
-e ORACLE_PWD=password \
-v oradata:/opt/oracle/oradata \
-d container-registry.oracle.com/database/free:latest
마운트 방식을 확인해보자
% docker ps
... 컨테이너ID 확인 (oracle)
% docker inspect oracle | grep Mounts -n5
},
"GraphDriver": {
"Data": null,
"Name": "overlayfs"
},
"Mounts": [
{
"Type": "volume",
"Name": "oradata",
"Source": "/var/lib/docker/volumes/oradata/_data",
"Destination": "/opt/oracle/oradata",
도커 컨테이너로 접속해 SYS계정으로 로그인해보자
% docker exec -it oracle bash
bash-4.4% sqlplus sys/password as sysdba
SQL*Plus: Release 23.26.0.0.0 - Production on Mon Dec 8 10:20:51 2025
Version 23.26.0.0.0
Copyright (c) 1982, 2025, Oracle. All rights reserved.
Connected to:
Oracle AI Database 26ai Free Release 23.26.0.0.0 - Develop, Learn, and Run for Free
Version 23.26.0.0.0
SQL> select user from dual;
USER
----------------------------------------------------
SYS
오라클은 오래전에 맥을 포기했지만 SQL Developer 툴은 제공하고 있는데 혹시 라고 생각했다면 맞다 자바인것이다.
VSCode용 플러그인도 있으니 VSCode의 Extensions 탭에서 검색 후 설치하고 설치 후 나타나는 SQL Developer 탭을 클릭, Containers 항목에서 컨테이너를 추가한 뒤 컨테이너 생성시 입력했던 정보들을 기입해준다.
DB 커넥션이 만들어지고 정상 작동하는 것을 볼 수 있다.
오라클 PDB 설정
설치된 오라클의 버전은 12C 이상인 멀티테넌트 방식이므로 CDB 컨테이너 안에 PDB를 생성해서 사용한다.
-- PDB 생성
-- FILE_NAME_CONVERT = (pdbseed , destination)
-- pdbseed : PDB의 템플릿파일(.dbf)
-- destination : 템플릿 파일을 사용해 생성되는 PDB 데이터파일들이 저장되는 위치
CREATE PLUGGABLE DATABASE mypdb
ADMIN USER mypdb_admin IDENTIFIED BY "1234"
FILE_NAME_CONVERT = ('/opt/oracle/oradata/FREE/pdbseed', '/opt/oracle/oradata/FREE/mypdb');
-- 생성된 PDB ADMIN 유저가 조회된다.
select username from dba_users where username like 'MYPDB_ADMIN';
-- CDB 에 존재하는 PDB 조회. MYPDB가 MOUNTED 상태임을 확인
SELECT name, con_id, open_mode FROM v$pdbs;
-- PDB OPEN_MODE를 OPEN 으로 전환해야 접속할 수 있다
ALTER PLUGGABLE DATABASE mypdb OPEN;
-- ALTER PLUGGABLE DATABASE ALL OPEN; -- CDB 전체의 모든 PDB를 OPEN 할때는
-- CDB 기동시 PDB는 자동으로 열리지 않기 때문에 OPEN 상태로 유지한다
ALTER PLUGGABLE DATABASE mypdb SAVE STATE;
-- MYPDB_ADMIN 에게 테이블스페이스 생성권한 부여
GRANT CREATE TABLESPACE TO MYPDB_ADMIN;
GRANT UNLIMITED TABLESPACE TO MYPDB_ADMIN; -- 테이블스페이스 용량제한 해제
-- PDB -> CDB 컨테이너 전환
-- ALTER SESSION SET CONTAINER = mypdb;
-- CDB -> PDB
-- ALTER SESSION SET CONTAINER = CDB$ROOT
터미널에서 컨테이너로 접속해 생성한 MYPDB_ADMIN 계정으로 로그인해 보자.
% docker exec -it oracle bash
ash-4.4$ sqlplus mypdb_admin/1234@localhost:1521/mypdb;
SQL*Plus: Release 23.26.0.0.0 - Production on Wed Dec 10 04:59:26 2025
Version 23.26.0.0.0
Copyright (c) 1982, 2025, Oracle. All rights reserved.
Last Successful login time: Wed Dec 10 2025 04:57:33 +00:00
Connected to:
Oracle AI Database 26ai Free Release 23.26.0.0.0 - Develop, Learn, and Run for Free
Version 23.26.0.0.0
SQL> show user;
USER is "MYPDB_ADMIN"
SQL> SHOW con_name;
CON_NAME
------------------------------------
MYPDB
MYPDB_ADMIN 유저로 고정길이의 테이블 스페이스를 추가해보자.
SQL>
CREATE TABLESPACE ORA_SQL_TEST_TS DATAFILE '/opt/oracle/oradata/FREE/mypdb/ora_sql_test.dbf' SIZE 10G
EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;
-- 생성한 테이블 스페이스 삭제
-- DROP TABLESPACE ORA_SQL_TEST_TS INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTS;
MYPDB_ADMIN 자신의 디폴트 테이블 스페이스는 SYSTEM으로 조회된다.
SQL> select username, default_tablespace from user_users;
USERNAME
--------------------------------------------------------------------------------
DEFAULT_TABLESPACE
------------------------------
MYPDB_ADMIN
SYSTEM
CDB 관리자인 SYS로 접속하여 MYPDB_ADMIN의 기본테이블 스페이스를 변경해준다.
SQL> ALTER USER MYPDB_ADMIN DEFAULT TABLESPACE ORA_SQL_TEST_TS;
User MYPDB_ADMIN altered.
SQL>
SELECT username, default_tablespace FROM dba_users where username like 'MYPDB_ADMIN' ORDER BY username;
오라클 컨테이너에서 ora_sql_test.dbf 파일을 확인해보자.
% docker exec -it oracle bash
bash-4.4$ cd /opt/oracle/oradata/FREE/mypdb
bash-4.4$ pwd
/opt/oracle/oradata/FREE/mypdb
bash-4.4$ ls
ora_sql_test.dbf sysaux01.dbf system01.dbf temp01.dbf undotbs01.dbf
% docker inspect oracle | grep Mounts -n5
},
"GraphDriver": {
"Data": null,
"Name": "overlayfs"
},
"Mounts": [
{
"Type": "volume",
"Name": "oradata",
"Source": "/var/lib/docker/volumes/oradata/_data",
"Destination": "/opt/oracle/oradata",
- Source (호스트 경로)): Docker 가 사용하는 로컬호스트 내부의 실제 디스크 경로
- Destination (컨테이너 경로)): 생성한 오라클 컨테이너 내부에서 데이터파일, 제어파일, redo log 등이 저장되는 위치로 오라클 프로세스가 실제로 읽고 쓰는 경로
예를 들어 컨테이너 내부에서 오라클이 test.dbf 파일을 생성했다고 가정하면 경로는
Destination : /opt/oracle/oradata/FREE/test.dbf
그러나 실제 물리적 파일은 컨테이너 외부의 로컬위치에 생성된다.
Source : /var/lib/docker/volumes/oradata/_data/FREE/test.dbf
컨테이너 내부 Destination 경로에 위치한 파일들은 실제 로컬 source 경로의 파일과 연동되어 있다.
이 파일들은 컨테이너 내부의 오라클에 의해 관리되고 있으니 직접 조작할 수 없고 DB 명령어를 통해서만 수정되어야 한다.
여기서 알아둬야 할 점
- 맥에서 구동되는 Docker는 내부적으로 리눅스 VM 위에서 실행되므로, VM 내부 Source 경로(/var/lib/docker/volumes/…)는 macOS에서 직접 탐색불가 (경량화된 VM이므로 완전한 독립 VM과는 다름)
- Linux 네이티브 환경에서는 Source 경로가 호스트 파일 시스템에 실제로 존재함
- 따라서 볼륨 마운트된 VM Source 경로를 확인하려면 Alpine 컨테이너와 연결해서 간접 확인만 가능함 (볼륨 방식이 아닌 바인드 마운트 방식은 맥 호스트에서도 리눅스 환경과 동일하게 작동함)
이래서 개발자는 리눅스를 써야한다
유닉스에 대한 로망 때문에 맥을 사용중이지만 iOS 개발만 아니었다면 진작 리눅스머신을 꾸렸을 것 같다.
특히 램에 인색한 맥을 사용하면서 가상화로 인해 탁하게 변해가는 메모리압박 그래프와 스왑용량을 보는것은 기분이 썩 좋지않은 경험이다…
데이터전용 컨테이너를 만들어서 오라클에서 생성되는 데이터를 별도의 컨테이너로 관리하는 멀티 컨테이너 구조를 사용할 수도 있을 듯 하지만 개인 프로젝트 용도로는 이정도면 충분하다. 아니면 도커 볼륨 (리눅스 VM) 에 생성되는 데이터를 정기적으로 맥으로 백업해 보관하는 방식도 생각해 볼 수 있고 이러한 경우 맥에서 파일을 읽기 전용으로 설정해둘 필요가 있을 것이다.
컨테이너 내부의 Destination 경로에 있는 ora_sql_test.dbf 파일을 확인했으니 이번에는 호스트의 Source 경로에서 해당 파일을 확인해보자.
Alpine 컨테이너 볼륨을 통해 리눅스VM 호스트에 위치한 ora_sql_test.dbf 파일을 확인할 수 있다.
// -v <VM Source 경로>:<Alpine 컨테이너 경로>
% docker run --rm -it -v /var/lib/docker/volumes:/vol alpine sh
/ # cd vol/oradata/_data/FREE/mypdb
/vol/oradata/_data/FREE/mypdb # ls
ora_sql_test.dbf sysaux01.dbf system01.dbf temp01.dbf undotbs01.dbf
/vol/oradata/_data/FREE/mypdb #
운영 서버가 아닌 개인작업시 작업이 끝나면 오라클 컨테이너를 종료해 데이터 유실을 방지한다.
% docker stop oracle
MYPDB_ADMIN 계정도 SQL Developer 커넥션을 추가해주자.
Service Name 은 오라클을 로컬에서 설치할때 흔히 설정하던 SID 값 (인스턴스의 고유명) 을 말한다.
CREATE DATABASE ORCLCDB ... 로 새로운 데이터베이스 생성시 ORCLCDB ,
PDB 생성 명령어인 CREATE PLUGGABLE DATABASE mypdb 의 mypdb 가 해당된다.
로컬에서 수행하는 테스트가 아닌 상용시스템이나 원격 연결, 도커 사용시에는 Service name 사용이 권장된다.
도커로 다운받은 FREE 버젼의 CDB 인스턴스명은 기본적으로 FREE 로 설정 되어있다.
터미널 로그인 예시
sqlplus sys/password@localhost:1521/FREE as sysdba
sqlplus mypdb_admin/1234@localhost:1521/mypdb