Blog

Docker 컨테이너에서  데이터부분을 분리하여, 외부 저장소로 관리하는 방법에 대해 알아보겠습니다.

도커는 volume를 관리할수 있는 명령을 제공해주며 다양한 스토리지를 사용할수 있습니다. (volume 에대한 설명은 생략)

또한 서버컨테이너를 쉽고 자유롭게 배포및 실행 가능한 장점이 있는반면, 볼륨개념을 이해하지 못하면 그동안 축적된 데이터의

휘발 위험성이 있습니다. 그래서 네트워크보다 먼저 개념을 잡고 휘발이 안되게하거나, 파편화된 스토리지를 잘 관리하는 방법이 필요합니다.

여기서는 Rancher-NFS(네트워크파일공유) 를 이용하는 방법을 알아보겠습니다. NFS를 이용하는 방법도 도커를 어떻게 사용하느에따라 차이가 있을뿐

그 컨셉은 유사하니, 각각 환경에 맞게 활용이 가능할것으로 보입니다.


실습환경


<외부 스토리지가 설정된 모습 >


외부 저장소는 도커객체를 여러개 가지고 있는 메인 OS에서 하는것이 유리하며

메인 OS에서 NFS서버를 구동을합니다. 여기서 사용되는 네트워크는 메인컴퓨터-도커객체간

통신이 될수있는 hostnetwork를 이용을 합니다. 네트워크로 접근만 가능 하면

독립된 파일서버기능만 가질수도 있으나, 외부 네트워크로 노출은 NFS의 보안구성상 추천하지는 않습니다.

  • host : 192.168.56.1
  • guest : 192.168.56.201 ~


NFS 서버준비

sudo apt-get update
sudo apt-get install nfs-kernel-server

sudo mkdir /docker_data
sudo chown nobody:nogroup /docker_data


# sudo vi /etc/exports

# NFS for Docker
/docker_data 192.168.56.0/24(rw,sync,no_root_squash,no_subtree_check)

/docker_data
        192.168.56.0/24
        
# Restart        
sudo systemctl restart nfs-kernel-server

공유를 사용할 루트 디렉토리를 위와같이 NFS 공유가 될수있도록 공유 시스템을 준비를 합니다.

이것을 준비하는 호스트의 네트워크를 가진 컴퓨터의 IP는 Gateway 인 192.168.56.1 이 되겠습니다.


NFS를 사용하기위한 게스트 모듈 탑재

Rancher에서 Rancher-NFS 를 설치하면, 기존 구성된 도커 컨테이너에서  NFS를 이용한 스토리지 사용이 가능합니다.


주요옵션:

  • NFS_SERVER: 192.168.56.1
  • MOUNT_DIR: /docker_data : 호스트의 스토리지 루트 디렉토리
  • MOUNT_OPTS: ',nfsvers=4
  • ON_REMOVE: purge(제거) or retain(유지) - 컨테이너가 제거될때 제거할지 유지할지에대한 옵션


NFS를 사용하는 DockerCompose

version: '2'
services:
  bitbucket:
    image: atlassian/bitbucket-server:5.6.1
    environment:
      - BITBUCKET_HOME=/var/atlassian/application-data/bitbucket/
    volumes:
      - gitdata:/var/atlassian/application-data/bitbucket
    ports:
      - 10000:7990/tcp
    labels:
      io.rancher.scheduler.affinity:host_label: host=docker1
      io.rancher.container.hostname_override: container_name
volumes:
  gitdata:
    driver: rancher-nfs
    driver_opts:
      exportBase: /bitbucket

 이전 단계에서 rancher-nfs 드라이브가 설치되었으며, 원격의 스토리지 이용이 가능해졌습니다.

디렉토리 생성룰에의해   실제 호스트에서는 /docker_data/{exportBase}_{볼륨명}_{자동해시) 의 조합으로 생성되며

이 디렉토리는 도커 객체의 /var/atlassian/application-data/Bitbucket 와 연결이됩니다.


아래는 유사하게, vargrant 를통해 nfs를 VM 디렉토리와 호스트 경로를 공유한 샘플이다.

nfs는 그만큼 다양하게 , 원격 저장소로 간편하게 사용이 가능한 프로토콜이다. 

  config.vm.synced_folder "/media/psmon/DataB/docker_data2", "/vagrant_data",
    type: "nfs",
    linux__nfs_options: ['rw','no_subtree_check','all_squash','async']


Host의 파일 모습

도커의 Data들이 한곳에 모이면서 백업및 관리를 할수있게되었습니다. 

공유디렉토리를 통해 언제든 Data를 확인및 수정이 가능합니다. 


Storage가 UI로 관리되는 모습

우리가 사용하는 도커객체가 얼만큼의 Data 저장장치를 사용하는지 알수가 있으며, 여기서 관리되는 스토리지 데이터만 잘 백업을하고 유지를 한다고하면

도커 인스턴스를 새롭게 리셋을 한다고해도 복원이 가능해집니다.  ON_REMOVE 의 옵션에따라 도커객체가 사라질때 호스트의 파일도 자동으로 사라질수 있으며

이옵션이 retain 일때 도커 저장소의 퍼시던트(영속성)를 유지할수 있게됩니다. 그렇지 않을시(purge)에는 컨테이너 삭제전 백업 에 유의를합니다.


이 방식은 인프라를 집적 구성하고, 스토리지 소프트웨어를 집접 관리하는 온프레미스 방식이라고도 불립니다.

처음부터 클라우드 기반에 제공되는 소프트웨어를 사용하고 클라우드 스토리지를 활용한다고 하면 이것보다 훨씬 간편한 절차로

이용이 가능할것이지만,  어플리케이션과 데이터부분을 분리한다는 전략은 일치를 합니다.

결국 클라우드와 온프레미스는 비용과 관리의 문제이며, 최근 클라우드 전환이 가속화되다가 만만치 않은 비용의 문제로 다시 회귀하는 경향도 보이고 있습니다.