Docker (8) - 볼륨 마운트와 바인드 마운트
1. 개요
컨테이너 내부에 저장된 데이터는 컨테이너의 생명주기를 그대로 따라간다. 즉 컨테이너가 삭제되면 그 안에 쌓아둔 데이터도 함께 사라진다. DB 데이터처럼 컨테이너가 없어져도 유지되어야 하는 데이터가 있다면, 별도의 저장 매커니즘으로 데이터의 영속성을 확보해야 하는데 이때 쓰는 것이 볼륨이다.
Docker 볼륨은 스토리지의 한 영역을 분할한 것으로, 컨테이너에서 만들어서 재사용할 수 있고 호스트 운영체제에서 직접 접근도 가능하다. 이번 글에서는 볼륨을 마운트하는 두 가지 방식과 각각의 사용법을 정리한다.
2. 마운트 방식 두 가지
| 방식 | 설명Docker (7) - 컨테이너 생명주기와 실행 옵션 정리 |
|---|---|
| 볼륨 마운트 | Docker Engine이 관리하는 영역 안에 볼륨을 만들고 마운트해서 사용 |
| 바인드 마운트 | 호스트 컴퓨터의 특정 디렉토리를 컨테이너 경로에 그대로 연결해서 사용 |
볼륨 마운트는 Docker가 스토리지 영역을 직접 관리해주는 반면, 바인드 마운트는 호스트의 기존 파일/디렉토리를 그대로 마운트하기 때문에 일반적인 파일처럼 다루고 백업할 수 있다는 차이가 있다.
3. 볼륨 마운트 사용하기
1
2
3
4
5
6
7
8
# 생성
docker volume create 이름
# 삭제
docker volume rm 이름
# 컨테이너에 연결
docker run -v 볼륨이름:컨테이너의_마운트경로
실습
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 볼륨 생성
docker volume create my-app-vol-1
# 볼륨 목록 확인
docker volume ls
# ubuntu 컨테이너에 볼륨 연결
docker run -d -v my-app-vol-1:/var/log --name=vol-test ubuntu
# 볼륨 상세 정보 확인
docker volume inspect my-app-vol-1
# 볼륨 삭제
docker volume rm my-app-vol-1
볼륨은 사용 중인 컨테이너가 남아있으면 삭제되지 않는다. 볼륨을 지우려면 그 볼륨을 물고 있는 컨테이너부터 먼저 삭제해야 한다.
4. 바인드 마운트 사용하기
바인드 마운트는 볼륨 마운트보다 사용 범위가 제한적이지만, 호스트의 특정 경로를 그대로 컨테이너에 연결한다는 점에서 더 직관적으로 쓸 수 있다.
- 사용자가 지정한 호스트 경로가 존재하지 않으면 자동으로 생성되며, 이때 생성된 디렉토리는 루트 사용자 소유가 된다.
- 컨테이너를 실행할 때 지정해서 사용하며, 컨테이너를 삭제해도 마운트만 해제될 뿐 호스트 쪽 디렉토리와 파일은 그대로 남는다.
1
docker run -d -v 스토리지_실제경로:컨테이너_마운트경로 ubuntu
실습: httpd 컨테이너와 호스트 디렉토리 연결
1
2
3
4
5
# 마운트할 디렉토리 생성
mkdir apache
# htdocs 디렉토리와 연결
docker run --name apache -d -p 8000:80 -v $(pwd)/apache:/usr/local/apache2/htdocs httpd
이렇게 연결해두면 호스트의 apache 디렉토리에 파일을 놓기만 해도 컨테이너 안의 htdocs에 바로 반영되기 때문에, 컨테이너에 매번 docker cp로 파일을 복사하지 않아도 된다.
5. 정리
컨테이너의 데이터는 컨테이너가 삭제되면 함께 사라지므로, 유지되어야 할 데이터는 볼륨 마운트나 바인드 마운트로 컨테이너 생명주기 밖에 분리해둬야 한다. 볼륨 마운트는 Docker가 관리하는 영역을 쓰기 때문에 이식성이 좋고, 바인드 마운트는 호스트 경로를 그대로 쓰기 때문에 로컬 파일을 실시간으로 컨테이너에 반영하고 싶을 때 편리하다.
두 방식 모두 docker run -v 원본:마운트경로 형태로 연결한다는 점은 같지만, 원본이 Docker가 관리하는 볼륨 이름이냐 호스트의 실제 경로냐에 따라 역할이 나뉜다는 점을 기억해두면 상황에 맞는 방식을 고르기 쉽다.