ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Docker 볼륨 사용하기
    Container 2016. 4. 6. 09:00
    반응형
    Docker 이용해서 실행한 컨테이너에 저장한 데이터는 컨테이너가 중지되면 보존되지 않는다. 이런 컨테이너의 특성 때문에 각종 예제에서 docker 이야기할때 자주 나오는 예제중에 데이터의 저장이 필요하지 않고 캐시로 사용할 있는  redis 자주 언급되는 이유다. Docker 이용해서 작업을 할때는 기본적으로 영구저장이 필요한 데이터들은 컨테이너 내부가 아니라 외부 데이터 저장소를 이용해서 저장해야 한다. 하지만 작업을 하다보면 컨테이너 내부에 저장을 하고 컨테이너가 중지되더라도 사용중이던 데이터를 보존해야할 필요가 있기 마련이다. 뿐만 아니라 작업했던 데이터를 컨테이너로 매번 복사해 넣지 않고 직접 수정하면서 컨테이너 내부에서 사용하고 싶을 수도 있다. 이런 경우를 위해서 Docker 볼륨 혹은 Docker 볼륨 컨테이너를 이용하면 된다.
     
    데이터 볼륨
    데이터 볼륨은 컨테이너에서 데이터를 저장하고 공유하기 위해서 다음과 같은 기능들을 제공한다.
    • 볼륨은 컨테이너가 초기화될때 만들어 진다. 컨테이너의 기본 이미지가 특정 마운트 지점에 데이터를 가지고 있으면, 데이터는 볼륨 초기화때 새로운 볼륨에 복사된다.
    • 여러개의 컨테이너가 공유해서 사용할 있다.
    • 데이터 볼륨의 데이터를 직접 변경할 있다.
    • 데이터 볼륨에서 작업한 내역은 이미지를 업데이트할 포함되지 않는다.
    • 컨테이너를 지워도 데이터 볼륨에 작업한 데이터는 남아 있는다.
     
    데이터 볼륨은 컨테이너가 없어져도 데이터를 보존하기위해 준비된 기능이기 때문에 컨테이너를 지워도 볼륨이 자동으로 지워지거나 하는 일은 없다.
    데이터 볼륨은 컨테이너를 실행할때 –v 옵션을 줘서 추가할 있다. –v 옵션을 여러번 지정해서 컨테이너 하나에 데이터 볼륨을 여러개 지정할 수도 있다.
    우선 다음 명령으로 컨테이너를 실행한 다음 컨테이너에 들어가면 /webapp 디렉토리가 있는걸 확인할 있다.
    docker run -d -P --name web -v /webapp training/webapp python app.py
     
    docker 볼륨은 기본으로 디렉토리를 읽기-쓰기 가능한 모드로 만들지만 옵션을 줘서 읽기전용으로 볼륨을 만들수도 있다.
    docker run -d -P --name web -v /opt/webapp:ro training/webapp python app.py
     
    단순히 볼륨을 생성하는 것뿐만 아니라 호스트에 있는 파일이나 디렉토리를 컨테이너에 마운트할수도 있다.
    방법은 간단하다.
    -v  [호스트 경로]:[컨테이너 경로]
    이런 식으로 옵션을 주면 컨테이너 내부에서  [컨테이너경로] 접근하면 호스트의 [호스트경로] 있는 데이터에 접근할 있게 된다. 이때 경로는 디렉토리를 명시할수도 있고, 파일을 명시할수도 있다. 이때 [컨테이너경로] 기존 데이터가 있더라도, 기존데이터는 무시되고 –v 옵션에서 지정한 [호스트경로] 있던 데이터가 컨테이너 내부의 [컨테이너경로] 있게 된다.
    Docker 볼륨은 주로 테스트용으로 많이 사용한다. 개발중인 소스코드를 docker 볼륨을 이용해서 컨테이너 내부에 마운트하고, 소스코드의 편집은 컨테이너 내부가 아닌 호스트에서 직접 함으로써 편리하게 개발을 진행할 있다.
    -v 옵션은 Dockerfile에서는 VOLUME 키워드를 이용해서 사용할 있는데, 호스트 경로를 명시하는 방식으로는 사용할 없다. Docker 이미지가 어떤 호스트에서 실행될지 없기 때문에 Dockerfile 지정된 호스트경로가 이미지를 실행하려는 호스트에는 없을수도 있기 때문이다.
     
     
    데이터 볼륨 컨테이너
    데이터 볼륨 컨테이너(Data Volume Container) 컨테이너간에 데이터를 공유하거나 영속성이 없는 컨테이너에서 데이터 볼륨용으로 사용하기 좋다.
    Postgresql 데이터베이스를 컨테이너를 이용해서 실행해보자. 데이터 저장은 공유하는 데이터볼륨컨테이너를 이용하고 postgresql 프로세스는 각각의 컨테이너를 이용해서 실행해 보도록 한다.
    우선 데이터볼륨 컨테이너를 실행한다.
    docker create -v /dbdata --name dbdata training/postgres /bin/true
    아무 이미지나 이용해서 볼륨을 마운트해주기만 하면 되지만, 굳이 postgres이미지를 사용한건, 다음에 사용할 postgresql 데이터베이스용 이미지와 공통된 이미지 레이어를 가지고 있기 때문에 디스크 용량을 아낄수 있어서다.
    이제 --volumes-from 옵션을 이용해서 앞서 실행했던 볼륨 컨테이너의 디렉토리를 새로 시작할 postgres 컨테이너에 마운트 해보자.
    docker run -d --volumes-from dbdata --name db1 training/postgres
    docker run -d --volumes-from dbdata --name db2 training/postgres
     
    명령을 실행하면 db1, db2라는 2개의 postgresql 컨테이너가 실행되고, 컨테이너들은 공통되게 dbdata 컨테이너의 볼륨을 가져와서 마운트한다. 이렇게 db1, db2에서 가져온 볼륨을 다시 다른 컨테이너에서 가져다가 마운트하는 것도 가능하다.
    docker run -d --name db3 --volumes-from db1 training/postgres
    이렇게 하면 db1 볼륨을 db3이라는 새로운 postgresql 컨테이너가 가져와서 사용하게 된다.
    앞서 실행했던 컨테이너들은 삭제할때 –v 옵션을 이용해서 삭제해야 한다.
    docker rm –v
    -v 옵션을 사용하지 않아도 컨테이너를 지우는데 이상은 없지만, 경우에는 컨테이너에서 사용했던 참조가 남아있게 되는데, 이렇게 남겨진 참조 데이터는 다른 컨테이너에서 다시 참조할 없게 되는데, 용량도 많이 차지하고 지우기도 어렵게 된다.
     
    데이터 볼륨은 컨테이너를 백업, 복구할때도 유용하게 사용할 있다. 아래 같은 명령을 통해서 /dbdata디렉토리를 통째로 백업해올 있다.
    docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
     
    이렇게 백업한 데이터는 아래처럼 간단하게 복구해서 사용할 있다.
    docker run --volumes-from dbdata2 -v $(pwd):/backup ubuntu cd /dbdata && tar xvf /backup/backup.tar
     
     
    참조
     
    반응형

    댓글

Designed by Tistory.