[Docker]Windows11에서 Docker로 오라클 실습환경 구축하기

이보석·2025년 4월 26일

실습 코치를 맡아 수강생들이 Oracle을 설치할 수 있도록 안내하는 임무를 수행하게 되었다. 처음에는 각자의 로컬 환경에 직접 설치하는 방식을 진행했지만, 수강생마다 환경이 달라 어떤 사람은 문제없이 설치가 완료되는 반면, 어떤 사람은 설치 중 에러가 발생하는 등 다양한 문제가 나타났다.

이러한 문제를 해결하기 위해 Docker 컨테이너를 활용하여 버전을 통일하고,
설치 중 발생하는 오류를 최소화하는 방법을 모색하게 되었다.

이 글에서는 Windows 11 환경을 기준으로
Docker를 사용해 Oracle을 설치하고 실행하는 방법을 정리하고자 한다.

1. Docker Desktop 설치

먼저 Docker Desktop을 설치합니다.

설치 방법은 아래 블로그를 참고해 주세요.

2. Oracle Docker 이미지 받기

docker pull gvenzl/oracle-xe

3. Oracle 컨테이너 이름 설정해서 실행하기

나중에 껐다 켰다 할때 수월하도록 컨테이너 이름(아래와 같은경우: 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

4. SQL Developer에서 접속 테스트

Connection Name: oracle-docker (아무거나)
Username: SYSTEM
Password: 12345 (방금 도커에서 지정한 비밀번호)
Hostname: localhost
Port: 1521 ← 도커에서 지정한 포트

테스트 버튼 클릭 후 왼쪽 아래 상태에 성공이라고 뜨면 Okay! 접속 클릭!

이제 실시킨 Docker 컨테이너 내부로 접속해서 Sqlplus를 실행해 student아이디를 만들어 student에 권한을 부여하고 데이터를 넣어서 본격적인 SQL 실습 환경을 구축하겠습니다.

5. Docker 컨테이너 내부로 접속

docker exec -it oracle-xe sqlplus system/12345@localhost/XEPDB1

6. 사용자 생성, 권한 부여

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;

7. sql 실습 파일 로컬 호스트 → 컨테이너로 파일 복사

새롭게 커맨드 창을 실행하여 아래 명령어를 입력해 줍니다.

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를 빠져나와 처음으로 돌아간뒤 아래의 순서를 실행해 주세요.

  1. 사용자로 SQL 실행
    student로 로그인
docker exec -it oracle-xe sqlplus student/1234@localhost/XEPDB1
  1. sql파일 실행
SQL> @/tmp/edu_tables_all_utf8.sql
SQL> COMMIT;
SQL> EXIT;

이 과정에서 받았던 질문

Q. 컨테이너는 독립된 환경인데 파일 복사가 가능한가요?
A. 컨테이너는 파일 시스템을 갖고 있기 때문에 docker cp 명령어를 사용해 호스트(내 컴퓨터)에서 컨테이너로 파일을 복사해 사용할 수 있습니다.
ex) edu_tables_all_utf8.sql 파일 복사해 컨테이너에서 사용!

8. Sql Developer 접속

SQL Developer 접속 설정 예시
Connection Name: oracle-docker
Username: student
Password: 1234
Hostname: localhost
Port: 1522
Service name: XEPDB1


테스트 버튼 클릭 후 왼쪽 아래 상태에 성공이라고 뜨면 Okay! 접속 클릭!

참고: system 계정과 student 계정 연결 차이

오라클 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을 꼭 지정해야 한다.

이 장에서 유용한 도커 명령어 모음

  1. 컨테이너 실행하기(컨테이너가 중지된 상태일 때)
docker start oracle-xe
  1. 컨테이너 중지하기
docker stop oracle-xe
  1. 컨테이너 상태 확인(현재 실행 중인 컨테이너 목록 보기)
docker ps
  1. 컨테이너 상태 확인(실행 중이든 중지 상태든 모든 컨테이너 목록 보기)
docker ps -a
  1. 컨테이너 삭제하기(실습을 다시 하고 싶거나 필요 없어진 경우)
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

글을 끝맺으며 이 글을 읽으며 나오는 주요 용어들에 대해 정리 하도록 하겠습니다. 조금이나마 설치하며 생겼던 용어에 대한 궁금증이 풀리기를 바라며...

도커란?

도커는 필요한 프로그램이나 서버를 간편하게 설치하고 실행할 수 있게 해주는 도구인데, 컴퓨터 안에 가벼운 가상환경(컨테이너) 을 만들어서, 복잡한 설치 없이 필요한 프로그램을 이미지로 다운받아 바로 사용할 수 있다.

  • 컨테이너를 만들고 실행하는 플랫폼
  • 무거운 운영체제(OS)를 필요한 부분만 가볍게 가상화한 기술
  • 컴퓨터 안에 또 하나의 가벼운 가상 환경(컨테이너)을 만들어 실행함
  • 컨테이너는 프로세스 단위로 빠르고 효율적으로 실행됨

컨테이너를 이용하면 설치 에러를 줄이고 누구나 같은 환경에서 실습할 수 있습니다.

도커 간단 용어정리

Docker
: 컨테이너를 만들고 실행하는 플랫폼
컨테이너
: 프로그램과 필요한 모든 것을 하나로 묶어 실행하는 가벼운 가상 환경
Docker 엔진
: 컨테이너를 만들고 실행하는 핵심 프로그램
Docker 이미지
: 컨테이너를 만들기 위한 설치 패키지
→ 이미지를 기반으로 컨테이너가 생성됨

위와같이 실행을 했음에도 에러가 나거나 글에 오류가 있다면 댓글이나 글의 아래에 있는 저의 개인 이메일로 에러 내용을 공유해주시면 감사하겠습니다.

행운을 담아
이보석
boseok.lee@hotmail.com

0개의 댓글