Docker

Docker Volume 개념 및 활용

무무11 2024. 11. 28. 20:55

Docker Volume이란?

Docker를 이용하게 되면 프로그램에 수정사항이 생겼을 때 컨테이너를 수정하는 것이 아니라 이미지를 아예 새로 만들고 컨테이너 역시 새롭게 만들어서 통째로 교체해야 한다.

 

그렇기 때문에 프로그램을 수정하여 컨테이너를 새로 띄우면 컨테이너 내부에 있던 데이터 역시 모두 사라지게 된다.

 

컨테이너 내부에 저장되어 있던 데이터가 삭제되면 안되는 경우에 이용할 수 있는 것이 볼륨(Volume)이다.

 

데이터 영속성을 위해 사용할 수 있는 것들은 바인드 마운트, 볼륨, tmpfs 마운트 등이 있다. 도커 공식문서에서는 볼륨 이용을 권장하고 있다.

 

바인드 마운트

직접 사용해보면서 익히는 것이 쉽고 빠르기 때문에 먼저 바인드 마운트부터 살펴보자. 바인드 마운트는 호스트의 특정 폴더나 파일을 도커 컨테이너 안에서 직접 쓸 수 있게 해주는 것이라고 생각하면 쉽다.

 

사용방법은 간단한데 docker run 사용시에 -v 옵션을 이용하여 경로만 지정해주면 된다. 컨테이너의 디렉터리 경로의 경우 이용할 이미지의 DockerHub 문서를 잘 읽어보면 확인할 수 있다.

# docker run -v (호스트의 디렉토리 절대경로):(컨테이너의 디렉토리 절대경로) 이미지명(:태그명)
$ docker run -v /Users/moomoo/Study/docker-postgres:/var/lib/postgresql/data \
             --name moomoo-postgres -e POSTGRES_PASSWORD=moomoopassword \
             -p 5432:5432 -d postgres

컨테이너가 시작될 때 호스트의 디렉토리 절대경로가 존재하지 않으면, 자동으로 호스트에 디렉토리를 생성한다. 그런 다음 컨테이너의 디렉토리에 있는 파일들이 호스트의 디렉토리로 복사된다.

 

반면 docker-postgres 디렉토리가 이미 존재하고, 데이터 파일들이 이미 들어있다면 컨테이너의 디렉터리는 호스트의 docker-postgres 디렉토리에 의해 덮어씌워진다.

 

위와 같은 명령어로 컨테이너를 실행하면 아래와 같이 경로에 데이터 파일들이 생성된 것을 확인할 수 있다.

이제 컨테이너 내부에 접속해서 데이터베이스를 생성해보았다.

# 컨테이너 내부에 접속
$ docker exec -it moomoo-postgres bash

# postgreSQL 실행
$ psql -U postgres

# Database 생성
postgres> CREATE DATABASE moomoodb;

# DB 목록 확인
postgres> \l

목록 확인을 하면 아래와 같다. moomoodb가 잘 생성된 것을 볼 수 있다.

이제 컨테이너를 완전히 삭제하고 다시 컨테이너를 새로 띄웠을 때 내가 생성한 DB가 지워지지 않은 것을 확인해보면 된다.

 

docker rm -f 명령어를 이용하여 컨테이너를 완전히 삭제한 후 다시 컨테이너를 띄워보았다.

 

그런 다음 바로 postgres에 접속해 DB 목록을 확인해보았다. 기존에 만들었던 DB가 삭제되지 않고 잘 있는 것을 확인할 수 있다.

 

볼륨(Volume)

볼륨 역시 컴퓨터에 따로 만들어진 폴더라고 생각하면 된다. 다만 Docker가 직접 이 폴더를 관리한다는 차이 점이 있다.

 

보통 볼륨은 '/var/lib/docker/volumes/'에 만들어진다.

 

볼륨은 백업이 쉽고 옮기기가 편하다. 또한 Docker 명령어로 관리할 수 있기 때문에 편리하다. 또한 어떤 운영체제에서도 다 잘 돌아간다. 여러 컨테이너가 같이 사용도 가능하다라는 등 여러가지 장점이 있다.

 

볼륨을 사용하는 법은 -v를 사용하는 것은 똑같다. 먼저 볼륨을 생성한 뒤에 사용할 수도 있고 그냥 run 명령어에 저렇게 볼륨 이름을 지정해두면 알아서 볼륨이 생성된다.

# Docker Volume 생성
$ docker volume create moomoo_postgres_data

# docker run -v (볼륨명):(컨테이너의 디렉토리 절대경로) 이미지명(:태그명)
$ docker run -v moomoo_postgres_data:/var/lib/postgresql/data \
             --name moomoo-postgres -e POSTGRES_PASSWORD=moomoopassword \
             -p 5432:5432 -d postgres

이렇게 생성한 뒤에 바인드 마운트 때와 마찬가지로 직접 접속해서 DB를 생성하고 컨테이너를 삭제한 뒤 다시 띄웠을 때 DB가 유지되는지 확인해보았고, 역시 잘 작동하는 것을 확인할 수 있었다.

 

볼륨을 활용하면 docker volume 명령어를 이용해 볼륨들을 확인하고 다양한 작업들을 할 수 있고, Docker Desktop에서도 쉽게 볼륨들을 확인할 수 있다.

# 볼륨 목록 확인
$ docker volume ls

아래와 같이 볼륨들의 목록을 확인할 수 있다.

이렇게 볼륨 개념을 활용하면 영속성이 필요한 데이터들을 잘 관리할 수 있다.