Posting

Machbase의 최신 소식을 지금 만나보세요

Docker external storage 공유 방법

개요

마크베이스는 Fog 에디션 Docker Image을 제공합니다.

도커이미지를 통해 컨테이너를 생성하면 기본적으로 컨테이너내에서 마크베이스DB 가 구축되게 됩니다.

하지만, 컨테이너상에서 운영하다가 실수로 컨테이너가 삭제되거나, 재생성해야할 때 어렵게 구축해놓은 DB데이터를 날려야되는 상황이 생기게됩니다.

이 문제를 해결하기 위해 호스트의 볼륨을 공유하여 컨테이너가 삭제되더라도 데이터를 유지할 수 있는 방법을 안내드리겠습니다.

스토리지 공유

볼륨을 공유하기 위한 방법은 크게 2가지가 존재하며, 추가적으로 docker-compose 활용한 공유 방법도 존재합니다. 

컨테이너를 생성할 때 아래 방법들을 사용해야합니다.

첫번째 방법은 docker volume 생성을 통한 방법으로 / (root) 볼륨과 연관이 있어 실용성이 높진않습니다.

두번째 방법은 docker mount 옵션을 통한 방법으로 실제 외부 스토리지 및 다른 볼륨과 공유하고자 할 때 사용하게 됩니다.

세번째 방법은 두번째 방법을 docker-compose 를 통해 사용하는 방법입니다.

스토리지 공유 설정시 주의사항

마크베이스 컨테이너를 생성하면, 컨테이너상에서 uid 가 1000 인 권한으로 구동 및 운영됩니다.

하여, 공유할 호스트의 스토리지 및 디렉토리 접근권한은 uid 가 1000 으로 변경 및 생성해줘야합니다.

OS 설치후 최초 생성한 계정으로 사용할 경우에는 기본 uid가 1000 으로 되어있을 것 입니다.

만약, uid가 1000 인 계정이 없을 경우는 아래와 같이 계정 추가후, uid 를 1000 으로 변경해주고 스토리지 및 디렉토리 접근권한을 해당 계정 권한으로 변경해줍니다.

Step 1. 계정 추가

$ useradd shareduser

Step 2. UID 를 1000 으로 변경

$ usermod -u 1000 shareduser

Step 3. 계정 생성 및 uid 확인

$ cat /etc/passwd
 
 
lucas:x:1002:1002::/home/lucas:/bin/bash
shareduser:x:1000:1003::/home/shareduser:

Step 4. 공유 스토리지 및 디렉토리 접근 권한 변경(root 권한에서 진행)

  • 여기서부터는 /data 볼륨의 SharedVolume1, SharedVolume2 디렉토리와 공유하기로 한다.
  • SharedVolume1 은 두번째 방법용이며, SharedVolume2 는 세번째 방법용 디렉토리이다.
$ mkdir /data/SharedVolume1
$ mkdir /data/SharedVolume2
$ chown -R shareduser /data/SharedVolume1
$ chown -R shareduser /data/SharedVolume2

docker volume 생성을 통한 스토리지 공유방법

volume을 생성하면 기본적으로 /var/lib/docker/volumes 밑에 설정한 볼륨명으로 공유볼륨이 생성됩니다.

물론, docker data root  경로를 변경한다면 해당 경로가 아닌 사용자 정의 경로에 볼륨을 생성할 수 있습니다. 

다만 docker 관련 데이터가 모두 변경된 경로에서 관리되게 됩니다. data root 경로 변경 부분에 대해서는 논외로 여기서는 다루지않겠습니다.

Step 1. 마크베이스 도커 이미지 받기

$ docker pull machbase/machbase
$ docker images

Step 2. volume 생성(/var/lib/docker/volumes 에 생성됨)

  • 여기서는 volume 명을 machdata 로 설정하였다.
$ docker volume create machdata
$ docker volume ls

Step 3. 컨테이너 생성

$ docker run -d --network host -v machdata:/home/machbase/machbase/dbs -it --name=machbase machbase/machbase bash

Step 4. dbs 생성 확인(root 권한에서 확인)

$ ls -l /var/lib/docker/volumes/machdata/_data/
 
 
root@debian:/var/lib/docker/volumes/machdata/_data# ls -l /var/lib/docker/volumes/machdata/_data/
total 268
-rw-r--r--   1 shareduser 1000 118784 Feb 23 13:21 meta.dbs-0
-rw-r--r--   1 shareduser 1000 118784 Feb 23 13:21 meta.dbs-1
-rw-r--r--   1 shareduser 1000  12288 Feb 23 13:21 meta.dbs-2
-rw-r--r--   1 shareduser 1000      0 Feb 23 13:21 meta.dbs-3
-rw-r--r--   1 shareduser 1000      0 Feb 23 13:21 meta.dbs-4
-rw-r--r--   1 shareduser 1000  12288 Feb 23 13:21 meta.dbs-5
drwxrwxr-x 103 shareduser 1000   4096 Feb 23 13:21 SYSTEM_TABLESPACE
drwxrwxr-x   2 shareduser 1000   4096 Feb 23 13:21 TAG_TABLESPACE
root@debian:/var/lib/docker/volumes/machdata/_data#

Step 5. 컨테이너 삭제

  • 컨테이너 삭제 후에도 dbs 파일이 그대로인지 확인한다.
$ docker stop machbase
$ docker rm machbase

Step 6. dbs 파일 유지 확인

  • 컨테이너가 삭제되어도 dbs 파일이 유지됨을 확인할 수 있다.
  • 다시 컨테이너를 생성하여도 해당 dbs 파일을 그대로 사용할 수 있다.
$ ls -l /var/lib/docker/volumes/machdata/_data/
  
  
root@debian:/var/lib/docker/volumes/machdata/_data# ls -l /var/lib/docker/volumes/machdata/_data/
total 268
-rw-r--r--   1 shareduser 1000 118784 Feb 23 13:21 meta.dbs-0
-rw-r--r--   1 shareduser 1000 118784 Feb 23 13:21 meta.dbs-1
-rw-r--r--   1 shareduser 1000  12288 Feb 23 13:21 meta.dbs-2
-rw-r--r--   1 shareduser 1000      0 Feb 23 13:21 meta.dbs-3
-rw-r--r--   1 shareduser 1000      0 Feb 23 13:21 meta.dbs-4
-rw-r--r--   1 shareduser 1000  12288 Feb 23 13:21 meta.dbs-5
drwxrwxr-x 103 shareduser 1000   4096 Feb 23 13:21 SYSTEM_TABLESPACE
drwxrwxr-x   2 shareduser 1000   4096 Feb 23 13:21 TAG_TABLESPACE
root@debian:/var/lib/docker/volumes/machdata/_data#

docker mount 옵션을 통한 스토리지 공유방법

외부 스토리지와 공유를 위해서는 아래와 같은 방법으로 진행합니다.

위 volume 생성을 통한 스토리지 공유방법을 수행하였다면, 아래 Step 1 은 건너뛰어도 좋습니다.

Step 1. 마크베이스 도커 이미지 받기

$ docker pull machbase/machbase
$ docker images

Step 2. 공유 대상 디렉토리 설정

위 스토리지 공유 설정시 주의사항을 확인하여 진행해주시면 되겠습니다.

Step 3. 컨테이너 생성

$ docker run -d --network host --mount type=bind,source=/data/SharedVolume1,target=/home/machbase/machbase/dbs -it --name=machbase1 machbase/machbase bash

Step 4. dbs 생성 확인

  • 아래와 같이 dbs 파일이 생성된 것을 확인할 수 있다.
$ ls -l /data/SharedVolume1
 
 
lucas@debian:~$ ls -l /data/SharedVolume1/
total 268
-rw-r--r--   1 shareduser 1000 118784 Feb 23 14:42 meta.dbs-0
-rw-r--r--   1 shareduser 1000 118784 Feb 23 14:30 meta.dbs-1
-rw-r--r--   1 shareduser 1000  12288 Feb 23 14:42 meta.dbs-2
-rw-r--r--   1 shareduser 1000      0 Feb 23 14:30 meta.dbs-3
-rw-r--r--   1 shareduser 1000      0 Feb 23 14:30 meta.dbs-4
-rw-r--r--   1 shareduser 1000  12288 Feb 23 14:30 meta.dbs-5
drwxrwxr-x 103 shareduser 1000   4096 Feb 23 14:30 SYSTEM_TABLESPACE
drwxrwxr-x   2 shareduser 1000   4096 Feb 23 14:30 TAG_TABLESPACE
lucas@debian:~$

Step 5. 컨테이너 삭제

  • 컨테이너 삭제 후에도 dbs 파일이 그대로인지 확인한다.
$ docker stop machbase1
$ docker rm machbase1

Step 6. dbs 파일 유지 확인

  • 컨테이너가 삭제되어도 dbs 파일이 유지됨을 확인할 수 있다.
  • 다시 컨테이너를 생성하여도 해당 dbs 파일을 그대로 사용할 수 있다.
$ ls -l /data/SharedVolume1
 
lucas@debian:~$ ls -l /data/SharedVolume1/
total 268
-rw-r--r--   1 shareduser 1000 118784 Feb 23 14:42 meta.dbs-0
-rw-r--r--   1 shareduser 1000 118784 Feb 23 14:30 meta.dbs-1
-rw-r--r--   1 shareduser 1000  12288 Feb 23 14:42 meta.dbs-2
-rw-r--r--   1 shareduser 1000      0 Feb 23 14:30 meta.dbs-3
-rw-r--r--   1 shareduser 1000      0 Feb 23 14:30 meta.dbs-4
-rw-r--r--   1 shareduser 1000  12288 Feb 23 14:30 meta.dbs-5
drwxrwxr-x 103 shareduser 1000   4096 Feb 23 14:30 SYSTEM_TABLESPACE
drwxrwxr-x   2 shareduser 1000   4096 Feb 23 14:30 TAG_TABLESPACE
lucas@debian:~$

docker-compose 를 통한 스토리지 공유방법

복수개의 컨테이너 실행 및 서비스 관리에 유용한 docker-compose 를 이용하는 방법입니다.

docker-compose 설치는 https://docs.docker.com/compose/install/ 에서 참고바랍니다.

위 mount 옵션을 통한 스토리지 공유방법을 진행하였다면, Step 2 는 건너뛰어도 좋습니다.

docker-compose 로 컨테이너를 생성하기 위해서는 docker-compose.yml 파일이 필요합니다.

Step 1. docker-compose.yml 파일 생성 및 작성

  • 아래와 같이 내용을 작성합니다.
$ vi /home/lucas/docker-compose.yml
 
version: '3'
services:
    machbase:
        container_name: machbase2
        build:
            context: .
        network_mode: "host"
        volumes:
            - /data/SharedVolume2:/home/machbase/machbase/dbs
        restart: always
        tty: true
  • 참고로, docker-compose 버전은 다음과 같습니다.
$ docker-compose version
 
docker-compose version 1.24.1, build 4667896b
docker-py version: 3.7.3
CPython version: 3.6.8
OpenSSL version: OpenSSL 1.1.0j  20 Nov 2018

Step 2. 마크베이스 도커 이미지 받기

$ docker pull machbase/machbase
$ docker images

Step 3. 컨테이너 생성

  • 실행 로그를 확인하기 위해서는 docker-compose logs -f 명령으로 확인할 수 있습니다.
$ docker-compose up -d

Step 4. dbs 생성 확인

  • 아래와 같이 dbs 파일이 생성된 것을 확인할 수 있다.
$ ls -l /data/SharedVolume2
 
lucas@debian:~$ ls -l /data/SharedVolume2/
total 268
-rw-r--r--   1 shareduser 1000 118784 Feb 23 15:09 meta.dbs-0
-rw-r--r--   1 shareduser 1000 118784 Feb 23 15:05 meta.dbs-1
-rw-r--r--   1 shareduser 1000  12288 Feb 23 15:09 meta.dbs-2
-rw-r--r--   1 shareduser 1000      0 Feb 23 15:05 meta.dbs-3
-rw-r--r--   1 shareduser 1000      0 Feb 23 15:05 meta.dbs-4
-rw-r--r--   1 shareduser 1000  12288 Feb 23 15:05 meta.dbs-5
drwxrwxr-x 103 shareduser 1000   4096 Feb 23 15:05 SYSTEM_TABLESPACE
drwxrwxr-x   2 shareduser 1000   4096 Feb 23 15:05 TAG_TABLESPACE
lucas@debian:~$

Step 5. 컨테이너 삭제

  • 컨테이너 삭제 후에도 dbs 파일이 그대로인지 확인한다.
$ docker-compose down

Step 6. dbs 파일 유지 확인

  • 컨테이너가 삭제되어도 dbs 파일이 유지됨을 확인할 수 있다.
  • 다시 컨테이너를 생성하여도 해당 dbs 파일을 그대로 사용할 수 있다.
$ ls -l /data/SharedVolume2
 
lucas@debian:~$ ls -l /data/SharedVolume2/
total 268
-rw-r--r--   1 shareduser 1000 118784 Feb 23 15:09 meta.dbs-0
-rw-r--r--   1 shareduser 1000 118784 Feb 23 15:05 meta.dbs-1
-rw-r--r--   1 shareduser 1000  12288 Feb 23 15:09 meta.dbs-2
-rw-r--r--   1 shareduser 1000      0 Feb 23 15:05 meta.dbs-3
-rw-r--r--   1 shareduser 1000      0 Feb 23 15:05 meta.dbs-4
-rw-r--r--   1 shareduser 1000  12288 Feb 23 15:05 meta.dbs-5
drwxrwxr-x 103 shareduser 1000   4096 Feb 23 15:05 SYSTEM_TABLESPACE
drwxrwxr-x   2 shareduser 1000   4096 Feb 23 15:05 TAG_TABLESPACE
lucas@debian:~$

맺음말

docker 사용시 마크베이스의 dbs 를 유지하여 운영할 수 있는 방법에 대해서 알아보았습니다.

여러 방법들을 소개하여 드렸는데 저는 docker-compose 를 사용한 방법이 편리하고 좋았습니다.

항상 컨테이너 삭제시 dbs 파일이 삭제되는 고민과 컨테이너내 dbs 파일을 호스트로 옮기는 일이 고민이였으나 위 방법들로 고민을 해결할 수 있는 계기가 되었습니다.

연관 포스트

C언어로 Binary data를 Machbase에 넣기

1.개요 Data를 다루다 보면 numeric, varchar 형 데이터뿐만 아니라 JPG, PNG, MP3와 같은 Binary data도 database에 저장해야 할 때가 존재한다. 그러나 일반 data들과는 달리 Binary

[MACHBASE 연동] Android studio에서 JDBC 연결하기

마크베이스 기술지원본부 이현민 1. 개요 수많은 데이터들이 많은 환경에서 생성되고 있는 오늘날, 우리 현대인들의 동반자인 스마트폰 또한 데이터생성의 주체로써 또는 전달자로서 알게 모르게 그 구실을