
실습 코치를 맡아 수강생들이 Oracle을 설치할 수 있도록 안내하는 임무를 수행하게 되었다. 처음에는 각자의 로컬 환경에 직접 설치하는 방식을 진행했지만, 수강생마다 환경이 달라 어떤 사람은 문제없이 설치가 완료되는 반면, 어떤 사람은 설치 중 에러가 발생하는 등 다양한 문제가 나타났다.
이러한 문제를 해결하기 위해 Docker 컨테이너를 활용하여 버전을 통일하고,
설치 중 발생하는 오류를 최소화하는 방법을 모색하게 되었다.
이 글에서는 Windows 11 환경을 기준으로
Docker를 사용해 Oracle을 설치하고 실행하는 방법을 정리하고자 한다.
먼저 Docker Desktop을 설치합니다.
설치 방법은 아래 블로그를 참고해 주세요.
docker pull gvenzl/oracle-xe
나중에 껐다 켰다 할때 수월하도록 컨테이너 이름(아래와 같은경우: oracle-xe)을 명시해서 띄워줍니다.
주의할점은, 기존 로컬환경에서 1521 포트를 사용하고 있다면 충돌 방지를 위해 다른 포트 번호로 바꿔줍니다.(예: 1521:1521 -> 1522:1521)
[1521 호스트(로컬 PC)포트 : 1521 컨테이너 내부의 포트(Oracle 기본 포트)]
Oracle을 설치했던 적이 없다면 포트번호를 바꿔주지 않아도 무방합니다.
docker run -d --name oracle-xe -p 1521:1521 -p 8080:8080 -e ORACLE_PASSWORD=12345 gvenzl/oracle-xe
자동 재시작 설정을 이 명령어에서 더할 수 있지만 재시작 관련 설정은 다른 글에서 다루기로 하고 지금은 생략하겠습니다.
docker ps
정상적으로 실행 중이라면 oracle-xe라는 이름의 컨테이너가 떠 있는 것을 확인할 수 있습니다.
필자가 접했던 에러 메시지:
Error response from daemon: Ports are not available: exposing port TCP 0.0.0.0:1521 -> 127.0.0.1:0: listen tcp 0.0.0.0:1521: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.
포트 1521번을 Docker 컨테이너가 사용하려고 했는데, 이미 누군가 1521 포트를 사용 중이라서, 바인딩(bind)이 실패.
에러 해결 방법:
1. 현재 1521 포트를 쓰는 프로세스를 죽이기
2. 다른 포트를 사용해서 컨테이너 실행하기(이 방법이 빠르고 좋음)
현재 컨테이너 목록 확인(실행중이 아닌 컨테이너도 함께 표시)
docker ps -a
컨테이너 삭제
docker rm oracle-xe
포트번호 변경해서 다시 컨테이너 띄우기 (1521:1521 -> 1522:1521)
docker run -d --name oracle-xe -p 1522:1521 -p 8080:8080 -e ORACLE_PASSWORD=12345 gvenzl/oracle-xe
Connection Name: oracle-docker (아무거나)
Username: SYSTEM
Password: 12345 (방금 도커에서 지정한 비밀번호)
Hostname: localhost
Port: 1521 ← 도커에서 지정한 포트
테스트 버튼 클릭 후 왼쪽 아래 상태에 성공이라고 뜨면 Okay! 접속 클릭!
이제 실시킨 Docker 컨테이너 내부로 접속해서 Sqlplus를 실행해 student아이디를 만들어 student에 권한을 부여하고 데이터를 넣어서 본격적인 SQL 실습 환경을 구축하겠습니다.
docker exec -it oracle-xe sqlplus system/12345@localhost/XEPDB1
SYSTEM으로 로그인한 상태.
1. 사용자 생성
-- 세션 설정 (사용자 생성 허용)
SQL> ALTER SESSION SET "_ORACLE_SCRIPT" = TRUE;
-- student 계정이 이미 있다면 삭제
SQL> DROP USER student CASCADE;
-- student 계정 새로 생성
SQL> CREATE USER student IDENTIFIED BY 1234;
-- 기본 권한 부여
SQL> GRANT CONNECT, RESOURCE TO student;
-- (선택) DBA 권한도 부여하고 싶다면:
SQL> GRANT DBA TO student;
-- 테이블스페이스 설정
SQL> ALTER USER student DEFAULT TABLESPACE users QUOTA UNLIMITED ON users;
새롭게 커맨드 창을 실행하여 아래 명령어를 입력해 줍니다.
docker cp C:\edu_tables_all.sql oracle-xe:/tmp/edu_tables_all.sql
파일이 제대로 복사되었는지 확인
docker exec -it oracle-xe ls /tmp
아래와 같이 파일 이름이 나오면 성공
C:\Users\boseo>docker exec -it oracle-xe ls /tmp
edu_tables_all_utf8.sql

이제 기존의 터미널로 돌아와 student로 다시 로그인 해줘야합니다. exit로 sqlplus를 빠져나와 처음으로 돌아간뒤 아래의 순서를 실행해 주세요.
docker exec -it oracle-xe sqlplus student/1234@localhost/XEPDB1
SQL> @/tmp/edu_tables_all_utf8.sql
SQL> COMMIT;
SQL> EXIT;
Q. 컨테이너는 독립된 환경인데 파일 복사가 가능한가요?
A. 컨테이너는 파일 시스템을 갖고 있기 때문에 docker cp 명령어를 사용해 호스트(내 컴퓨터)에서 컨테이너로 파일을 복사해 사용할 수 있습니다.
ex) edu_tables_all_utf8.sql 파일 복사해 컨테이너에서 사용!
SQL Developer 접속 설정 예시
Connection Name: oracle-docker
Username: student
Password: 1234
Hostname: localhost
Port: 1522
Service name: XEPDB1

테스트 버튼 클릭 후 왼쪽 아래 상태에 성공이라고 뜨면 Okay! 접속 클릭!
오라클 12c 이후부터는 CDB(Container Database) 와 PDB(Pluggable Database) 개념이 도입되었습니다. 이로 인해 계정에 따라 연결 방식이 달라집니다.
system 계정은 컨테이너 DB (CDB) 인 XE에 바로 연결이 가능합니다.
→ 그래서 SID=XE 만 설정해도 연결이 됩니다.
student 계정은 플러그형 DB (PDB) 인 XEPDB1 안에 있는 사용자입니다.
→ 그래서 Service Name=XEPDB1 을 명시해줘야 정상 연결됩니다.
system은 기본 CDB에 속해 있어 SID(XE)로 바로 접속 가능하지만,
student 같은 신규 계정은 PDB(XEPDB1)에 생성되므로 Service Name을 꼭 지정해야 한다.
docker start oracle-xe
docker stop oracle-xe
docker ps
docker ps -a
docker rm oracle-xe
-- 재부팅 후에도 자동으로 컨테이너 재시작 설정
docker update --restart unless-stopped oracle-xe
-- 컨테이너 내부 Oracle SQLPlus 접속 (system 계정)
docker exec -it oracle-xe sqlplus system/12345@localhost/XEPDB1
-- 컨테이너 내부 Oracle SQLPlus 접속 (student 계정)
docker exec -it oracle-xe sqlplus student/1234@localhost/XEPDB1
-- 호스트 PC의 파일을 컨테이너로 복사
docker cp C:\경로\파일명.sql oracle-xe:/tmp/파일명.sql
-- 컨테이너 내부로 접속
docker exec -it oracle-xe bash
-- 컨테이너 로그 확인 (오류나 실행 상태 점검할 때)
docker logs oracle-xe
글을 끝맺으며 이 글을 읽으며 나오는 주요 용어들에 대해 정리 하도록 하겠습니다. 조금이나마 설치하며 생겼던 용어에 대한 궁금증이 풀리기를 바라며...
도커는 필요한 프로그램이나 서버를 간편하게 설치하고 실행할 수 있게 해주는 도구인데, 컴퓨터 안에 가벼운 가상환경(컨테이너) 을 만들어서, 복잡한 설치 없이 필요한 프로그램을 이미지로 다운받아 바로 사용할 수 있다.
컨테이너를 이용하면 설치 에러를 줄이고 누구나 같은 환경에서 실습할 수 있습니다.
Docker
: 컨테이너를 만들고 실행하는 플랫폼
컨테이너
: 프로그램과 필요한 모든 것을 하나로 묶어 실행하는 가벼운 가상 환경
Docker 엔진
: 컨테이너를 만들고 실행하는 핵심 프로그램
Docker 이미지
: 컨테이너를 만들기 위한 설치 패키지
→ 이미지를 기반으로 컨테이너가 생성됨
위와같이 실행을 했음에도 에러가 나거나 글에 오류가 있다면 댓글이나 글의 아래에 있는 저의 개인 이메일로 에러 내용을 공유해주시면 감사하겠습니다.
행운을 담아
이보석
boseok.lee@hotmail.com