우선 이미지는 오라클 XE 11버전을 빌드해 도커허브에 올려놓은 것들중에 가장 스타를 많이 받은 것으로 다운받았다.
oracleinanutshell/oracle-xe-11g (도커 이미지 링크)
다운받은 이미지로 컨테이너를 생성하고 생성된 컨테이너에서 오라클 파일이 보관되어 있는 경로를 먼저 확인했다. 컨테이너상에 존재하는 오라클 파일 경로는 /u01/app/oracle
였다.
우선은 컨테이너의 /u01/app/oracle
경로에 들어있는 오라클 파일들을 복사하여 호스트 서버에 옮겨놓을 것인데, 복사를 진행하기 전에 앞서 먼저 컨테이너의 db에 접속하여 테스트용 데이터를 저장한 후 복사를 진행할 것이다.
sqlplus로 db에 접속하여 test 데이터를 저장 :: test Table -> Insert 1 row {'name':'kiminhoe'}
Container ID : 4871c4cac352 (오라클 컨테이너)
이후 docker cp 명령어를 통해 컨테이너에 담겨 있는 데이터를 호스트 경로로 복사시킨다.
컨테이너의 오라클 파일 경로 = /u01/app/oracle
데이터를 복사할 호스트 로컬 경로 = /home/ubuntu/db_oracle
[명령어]
docker cp -a $(오라클 컨테이너 ID):/u01/app/oracle/. $(내 로컬 폴더경로)
ex) docker cp -a oracle:/u01/app/oracle/. /home/ubuntu/db_oracle
이후로는 실제로 db서버로 운용될 오라클 컨테이너를 만든다. 앞서 만들었던 오라클 컨테이너는 데이터만 복사해오기 위해 이미지만 단순하게 Run 시켰던 상태이기 때문에, 호스트 서버와 Bind Mount 되어있지도 않았고 포트도 맵핑되어 있지 않은 상태이다.
따라서 오라클 데이터를 복사해놓은 호스트 서버의 폴더와 Bind Mount 시켜서 오라클 컨테이너를 다시 생성할 것이다. 그리고 다시 한번 DB에 접속하여 앞서 넣어준 Test 데이터가 존재하는지 확인할 것이다. 만약 새로운 오라클 컨테이너의 DB에서 test 데이터가 제대로 존재한다면 Bind Mount가 정상적으로 이루어졌다는 뜻이고, DB데이터를 호스트 서버 로컬에 따로 보관하여 관리하고자 하는 목적을 제대로 달성했다고 볼 수 있다.
Container ID : 92b6a07b1e0c (새로운 오라클 컨테이너)
[명령어]
docker run -d --name oracle -p 1521:1521 -v /home/ubuntu/db_oracle:/u01/app/oracle -e "TZ=Asia/Seoul" oracleinanutshell/oracle-xe-11g
DB 컨테이너를 생성하고 외부접속을 Open한 뒤 개발PC에서 실제로 외부 접속이 되는지 확인 해본다. 오라클 전용 개발환경툴인 SQL Developer를 이용하여 외부접속을 시도했다.
AWS EC2 인스턴스 Public IP를 입력하고 설정한 포트번호로 접속했을 때 성공적으로 DB서버에 접속된 것을 확인하였다.
Docker 컨테이너화를 통한 Redis 서버 배포도 위의 Oracle 서버 배포 방식과 다를 바가 없었다.
Redis의 이미지는 도커허브에 오피셜로 등록된 이미지로 받았고,
Oracle 컨테이너를 생성했던 것과 동일하게 Redis의 파일을 먼저 복사하고 이후 Bind Mount 시켜서 다시 한번 컨테이너를 생성하였다. (이후 새로운 컨테이너로 redis를 실행시켰을 때 제대로 db파일들이 옮겨졌는지 확인한다)
Oracle과 다르게 Redis에서 추가적으로 작업을 해줘야 했던 부분은 레디스 설정정보를 수정해 주기 위해 추가적으로 redis.conf 파일을 작성했다는점뿐이었다.
(redis.conf 파일등록 관련 내용은 도커 허브에 올려져 있는 레디스 공식 레퍼런스를 참고하였다)
(Redis의 경우 aof 설정을 걸어주면 저장정보가 Redis 컨테이너의 /data
경로에 보관된다)
(Redis의 db 데이터 파일 = /data/appendonly.aof , /data/dump.rdb
)