Docker를 기반으로 다양한 데이터베이스 환경 통합하기

이 글은 Docker를 ‘들어는 봤지만’, ‘어디에 어떻게 활용하면 좋을지’ 고민하시는 Docker 입문자를 위한 글입니다 :)

최근 국산 데이터베이스 툴인 SQLGate를 10여 년간 개발, 판매하고 있는 양용성 대표님과 다양한 OS에서 동작하는 Java 기반의 SQLGate 버전 개발을 진행하고 있습니다. 지난 편에 소개했던 하이브리드 웹 애플리케이션 기술들과, Scala, RPC 등 다양한 기술들을 조합해서 10여 년 이상 개발, 유지보수 되어왔던 Delphi 버전 SQLGate를 HTML5/Java/Scala를 기반으로 하는 완전히 새로운 애플리케이션으로 설계하고 있습니다.

(현재 진행 중인 디자인 프로토타입을 살짝 보여드리자면…)

저는 가장 먼저 테스트와 빌드, 배포 자동화를 위한 환경부터 구축하기 시작했습니다. 기존에 운영하던 환경들을 분석해보니, 다양한 데이터베이스를 테스트 하기 위해 AWS EC2를 3~4대씩 운영하고 있었고, 테스트 용도로 항상 켜두기엔 비효율 적이다 보니, 비용절감을 위해 테스트할 때만 특정 인스턴스를 껐다, 켰다 하는 형태로 운영하고 있었습니다.

한대의 인스턴스에 여러 개의 데이터베이스를 동시에 설치하는 것이 까다롭기도 하고, 환경적 문제때문에 불가할수도 있다보니 각각의 인스턴스가 데이터베이스 머신 한대의 역할을 하고 있었습니다. 리소스, 관리비용, 인스턴스 비용 모두를 줄이기위해 저는 Docker를 기반으로 모든 데이터베이스를 통합하기로 했습니다.

이제 Docker를 사용해서 4대의 인스턴스를 한대의 인스턴스에 어떻게 통합했는지 간단히 소개하겠습니다.

기존에는 t2.small 머신 4대 정도가 운영되고 있었습니다. 기존 인스턴스를 그대로 둔채로 t2.medium (2CPU / 4G Memory) 인스턴스(Cent OS 7.0) 한대를 더 추가한 후 Docker를 설치했습니다.

주의! CentOS 7 미만에서는 Docker 최신버전사용이 불가합니다. CentOS 6.x 쓰실 경우는 Docker 1.7.1 버전까지만 사용할 수 있으니 참고하세요.

1. Docker 설치

sudo yum -y install docker

yum을 사용하면 간단하게 Docker 설치가 가능합니다.

2. Oracle 10g 설치

Docker는 Docker Hub에 공개된 이미지들을 검색할 수 있는 search라는 명령어를 제공합니다.

docker search oracle

Docker Hub에 등록된 오라클 10g 이미지는 없는 것 같아서 구글링을 한 번 해봤습니다.

몇몇 오라클 10g XE 버전 Docker 이미지가 있었지만, 제대로 동작하는 이미지가 하나도 없었습니다. (아마도 Docker 버전업이 되면서, 비교적 오래된 이미지들이 동작하는 데 문제가 있는 것 같아요 ) 결국 직접 10g Docker 이미지를 구성해야 겠군요. ㅜ.ㅜ

오래된 버전이다 보니 오라클 공식 사이트에서 10g 설치 파일을 제공하지 않고 있어 구글링으로 데비안 계열에 설치할 수 있는 설치 파일을 하나 찾았습니다.

데비안 설치 파일이다보니 먼저 Debian OS 이미지를 내려받습니다. 왠지 구형 데이터베이스는 구형 OS에서 더 잘 설치될꺼같다는 느낌이 들어서 Debian 최신 버전인 Jessie 대신 Wheezy 버전으로 내려받았습니다. pull 명령을 사용하면 Docker Hub에서 해당 이미지를 내려받을 수 있습니다.

docker pull debian:wheezy

내려받은 이미지는 docker images 명령으로 확인할 수 있습니다.

이제 해당 이미지를 실행한 후, Debian OS에 접속하여 오라클을 설치합니다. (run 옵션에 대한 자세한 설명 : http://pyrasis.com/book/DockerForTheReallyImpatient/Chapter20/28)

docker run -i -t -p 1600:1521 --entrypoint /bin/bash {IMAGE_ID}

물리 머신 1600번 포트로 들어오는 데이터를 Docker 컨테이너 내부에 동작하는 1521 포트로 연결하고, -i (STDIN keep), -t (tty) 모드로 실행합니다.

만약 호스트 머신에 있는 파일을 Docker 컨테이너 내부로 복사해야 할 경우에는 docker cp 명령으로 파일을 복사할 수 있습니다.

docker cp oracle-xe_10.2.0.1-1.0_i386.deb {CONTAINER_ID}:/root

오라클 설치가 완료된 후 리스너를 실행하면 다음과 같이 1600 포트로 오라클에 접속할 수 있습니다.

3. Oracle 11g 설치

Oracle 11g의 경우는 잘 동작하는 몇몇 이미지들이 있어서 별도의 설치 과정이 필요 없었습니다. 저는 Docker Hub에서 가장 인기가 많은 alexeiled/docker-oracle-xe-11g 이미지를 사용했습니다.

docker pull alexeiled/docker-oracle-xe-11g
docker run --shm-size=2g -p 1601:1521 --name 11g alexeiled/docker-oracle-xe-11g

두 줄의 명령어가 완료되면 1601 포트로 오라클 11g에 접속할 수 있습니다.

4. Oracle 12c 설치

Oracle 12c의 경우는 파티셔닝과 몇몇 특정 오라클 기능들을 테스트하기 위해 Enterprise 버전으로 설치해야 했습니다. 오라클 블로그에 12c Enterprise Docker 이미지 생성 가이드가 있어서 쉽게 따라 할 수 있었습니다 ( https://blogs.oracle.com/developer/entry/creating_and_oracle_database_docker )

블로그에 나온 대로만 잘~ 따라 하면 30분 내외로 Oracle 12c Enterprise Docker 이미지를 만들 수 있습니다!

이미지 생성 후 10g/11g와 동일하게 12c 또한 실행해줍니다.

docker run --shm-size=2g -p 1602:1521 --name 12c oracle/database:12.1.0.2-ee

한대의 인스턴스에 3대의 오라클 데이터베이스가 Docker 내부에서 실행되고 있고, 각각의 오라클은 1601, 1602, 1603 포트로 연결할 수 있도록 구성되었습니다.

5. SQL Server 설치

얼마 전 Microsoft가 Linux에서 동작하는 SQL Server 버전을 공개했는데요, 이 또한 Docker를 통해 설치할 수 있습니다.

docker pull microsoft/mssql-server-linux
docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=yourStrong(!)Password' -p 1700:1433 --name mssql -d microsoft/mssql-server-linux

이렇게 한대의 머신에 오라클 3개 버전, SQL Server까지 통합되었고요, 추가로 Jenkins도 Docker 기반으로 구성했습니다.

이렇게 Docker를 사용하면 호스트 머신(물리 머신)을 깨끗하게 유지한채로 다양한 OS와 프로그램들을 Docker 컨테이너 내부에서 실행할 수 있습니다.

Docker를 조금 더 깊이 있게 들여다보시면 이 포스팅에서 소개한 간단한 인스턴스 통합 외에도 무중단 배포나 클라우드 기반의 서비스 개인화 등에도 활용할 수 있습니다.

감사합니다 :) 끝!