Oracle 개요
먼저 Oracle Database 11g Express Edition(Oracle XE)는 무료로 사용할 수 있는 Oracle 데이터베이스를 의미한다. 개발, 배포, 보급을 무료로 지원하고 있으며, CPU의 개수는 상관없으나 DB크기와 메모리 크기를 제한한다.
Docker의 다양한 이미지 중에 21버전은 DB크기를 12GB로 제한하고, 11버전은 4GB로 제한하기 때문에 21버전을 활용하겠다.

docker 환경 구축
DB가 저장될 경로를 생성합니다. mkdir는 디렉토리를 만드는 명령어이며 -p는 경로가 없으면 자동으로 생성해주는 옵션입니다.
mkdir -p /data/oracle_xe_21
pull은 Docker 저장소에서 이미지를 불러오는 명령어입니다. 따라서 아래 명령어는 gvenzl이라는 계정의 oracle-xe의 21-full 버전을 local로 가져와 달라는 명령어입니다.
docker pull gvenzl/oracle-xe:21-full
local로 설치가 끝났다면 Docker를 실행해봅시다. restart옵션을 unless-stopped로 주게되면 재부팅 시에도 자동으로 Oracle DB가 실행된다. 비밀번호에 특수문자가 들어가게되면 입력이 불편하므로 왠만하면 빼고 사용하는 것이 편하다.
docker run -d \
--name=oracle_xe_21 --restart=unless-stopped \
-p 1521:1521 \
-e ORACLE_PASSWORD="비밀번호" \
-v /data/oracle_xe_21:/opt/oracle/XE21CFULL/oradata \
gvenzl/oracle-xe:21-full
설치가 제대로 되었는지 확인하려면 docker ps -a
명령어를 활용하시면 됩니다.
Docker 계정 생성
docker exec -it oracle_xe_21 bash
docker환경에 접속했다면 sqlplus
를 실행하여 계정을 생성해보자. username은 SYSTEM 비밀번호는 앞에 생성한 비밀번호를 사용하면 된다.

아래 명령어를 입력하면 User가 생성이 된다. grant는 권한을 부여하는 명령어이다.
create user 생성할유저명 identified by 비밀번호
grant resource, connect to 생성할유저명
Docker Compose 버전
docker-compose.yml 파일을 만든 뒤 docker-compose up -d 실행
version: '2'
services:
oracle21g:
image: gvenzl/oracle-xe
container_name: oracle21g
volumes:
- /data/oracle_xe_21/data:/opt/oracle/ordata
restart: always
ports:
- 1521:1521
environment:
- ORACLE_PASSWORD=비밀번호
docker exec -it oracle21g sqlplus을 실행하면 SQL이 실행된다.
id : system
password: 비밀번호
아래 명령어를 통해 계정을 만들어 보자.
#계정생성 및 모든 권한 부여
create user ducj identified by 비밀번호;
grant connect, dba, resource to ducj;
R에서의 연결
다른 컴퓨터에서 연결을 시도해보았는데 ... 다른 RDMBS와 달리 ojdbc*.jar 파일이 필요한 것 같았다. 아래에서 JDBC 파일을 다운로드 받자.
R에서 연결은 아래와 같이 할 수 있었다. 위에서 받았던 jar파일은 /home/ducj/ojdbc11-full
경로에 ojdbc11.jar
파일이며 jdbc:oracle:thin:@url:port:sid
형태로 입력하면 된다.
library(rJava)
library(RJDBC)
con <- dbConnect(JDBC(driverClass = "oracle.jdbc.OracleDriver",
classPath = "/home/ducj/ojdbc11-full/ojdbc11.jar"),
"jdbc:oracle:thin:@ducj3.iptime.org:1521/xe",
"계정","비밀번호")
오라클 DB 생성이 https://myjamong.tistory.com/212에 상세히 있던데 복잡하여 생략하기로 했다.