본문 바로가기
DevOps

[Docker] Volume & BindMount

by stdhsw 2023. 7. 25.

도커 컨테이너 파일 시스템의 생명 주기는 컨테이너의 생명 주기와 같습니다. 그렇기 때문에 컨테이너가 지워지면 컨테이너에서 기록한 데이터도 같이 지워지는데요. 이런 경우를 방지하기 위해 컨테이너의 데이터를 유지하고 관리할 수 있어야 합니다. 이런 기능을 제공하는 것이 대표적으로 2가지가 있는데 바로 volume과 bind mount입니다. 이번에는 volume과 bind mount에 대해서 정리하였습니다.

 

Docker volume

volume 생성하기

volume 명령어를 사용하여 직접적으로 volume을 생성하게 되면 /var/lib/docker/volumes/볼륨명으로 해당 볼륨의 디렉토리가 생성됩니다. 컨테이너는 해당 디렉토리를 컨테이너 경로로 마운트 하여 데이터를 읽고 쓰게 되면서 컨테이너가 기록하는 데이터를 유지할 수 있습니다.

$ docker volume create 볼륨명

volume 확인하기

생성된 volume을 `docker volume ls` 를 통하여 확인할 수 있습니다.

$ docker volume ls

volume 컨테이너에 마운트 하기

생성한 볼륨을 컨테이너에 마운트 합니다.

$ docker run 이미지명 --name 컨테이너명 -d -v <볼륨명>:<컨테이너 경로>

volume 삭제하기

`docker volume rm 볼륨명`을 통하여 볼륨을 삭제할 수 있는데 만약 해당 볼륨을 컨테이너가 사용 중이라면 해당 컨테이너부터 삭제하고 볼륨을 삭제해야 합니다.

$ docker volume rm 볼륨명

사용하지 않은 volume 전부 삭제하기

볼륨을 무작위로 생성하다 보면 사용하지 않는 볼륨들이 많이 존재하게 되는데 다음과 같은 명령어를 통하여 사용하지 않는 볼륨을 한 번에 삭제할 수 있습니다.

$ docker volume prune --all --force

dockerfile로 볼륨 생성하기

도커파일에서 생성한 볼륨은 호스트 경로의 /var/lib/docker/volumes/볼륨해쉬에 만들어집니다. Dockerfile로 생성한 volume은 매번 컨테이너를 생성할 때마다 무작위로 생성되기 때문에 사용할 때 주의해야 하며 나중에 사용 안 하는 볼륨을 지워줘야 한다.

FROM ubuntu:latest

# 볼륨을 마운트할 디렉토리 생성
RUN mkdir /app

# 볼륨 마운트 지정
VOLUME /app

# 컨테이너 내부의 파일 생성
RUN echo "Hello, Docker Volume!" > /app/data.txt

--volume-from 옵션 사용하기

Docker 컨테이너에게 다른 컨테이너에서 마운트 된 볼륨을 공유하도록 지시하는 명령어입니다. 이를 통해 볼륨을 한 컨테이너에서 생성하고 다른 컨테이너에서 사용할 수 있습니다.

$ docker volume create my-volume
$ docker run -d --name test-1 ubuntu:20.04 -v my-volume:/data
$ docker run -d --name test-2 ubuntu:20.04 --volume-from test-1

위 명령어를 이용하면 test-1에서 사용 중인 my-volume을 test-2에서도 사용할 수 있습니다.

 

Bind Mount

바인드 마운트는 호스트 시스템의 특정 경로를 컨테이너 내부 경로에 직접 연결을 하기 때문에 호스트와 컨테이너 간에 파일이 실시간으로 동기화할 수 있습니다. 저 같은 경우 개발을 한 애플리케이션의 로그를 확인하기 쉽게 하기 위해 로그 파일의 경로를 바인트 마운트 경로로 잡아서 사용하는 경우가 많습니다.

$ docker run -v 호스트경로:컨테이너경로 이미지:태그

또한 --mount 옵션을 이용하여 Bind Mount를 수행할 수 있는데 --mount를 이용하면 보다 섬세한 설정을 할 수 있습니다.

아래를 --mount 옵션을 이용하여 readonly 설정을 통해 컨테이너는 해당 파일 시스템에 readonly 권한으로 밖에 접근할 수 없도록 설정한 예시입니다.

$ docker run --mount type=bind,source=~/data,target=/data,readonly -d 이미지:태그

그밖에 옵션을 통해 여러가지 형식으로 마운트를 할 수 있습니다.

$ docker run --mount type=bind,source=호스트경로,target=컨테이너경로,옵션=값,옵션=값,...