Docker Compose에서 볼륨(Volume) 설정하기

Docker Compose에서 볼륨(Volume) 설정하기

DevOps
Docker Compose
Docker Compose에서 볼륨(Volume) 설정하기
Author

gabriel yang

Published

October 7, 2024


Docker Compose에서 볼륨(Volume) 설정하기

Docker Compose는 여러 컨테이너를 효율적으로 관리할 수 있도록 도와주는 도구입니다. 그 중에서도 볼륨(Volume)은 컨테이너가 삭제되거나 재시작되더라도 데이터를 유지하고, 여러 컨테이너 간에 데이터를 공유할 수 있는 강력한 기능을 제공합니다. 이 글에서는 Docker Compose에서 볼륨을 사용하는 방법을 단계별로 알아보겠습니다.

1. 볼륨이란 무엇인가?

볼륨(Volume)은 컨테이너의 파일 시스템 외부에 위치한 저장소로, 컨테이너가 삭제되더라도 데이터를 유지할 수 있습니다. 볼륨은 Docker에서 데이터를 영구적으로 보관하거나 여러 컨테이너에서 데이터를 공유할 때 사용됩니다.

볼륨의 주요 특징:

  • 데이터 영속성: 컨테이너가 삭제되더라도 볼륨에 저장된 데이터는 유지됩니다.
  • 컨테이너 간 데이터 공유: 여러 컨테이너가 동일한 볼륨을 참조하여 데이터를 공유할 수 있습니다.
  • 호스트와의 데이터 공유: 로컬 호스트의 디렉토리와 컨테이너 내 디렉토리를 연결할 수 있습니다.

2. 기본 볼륨 설정

Docker Compose에서 볼륨을 설정하는 가장 간단한 방법은 서비스의 volumes 섹션에서 컨테이너 내부 경로를 지정하는 것입니다. 별도의 볼륨을 정의하지 않으면 익명 볼륨이 생성되어 사용됩니다.

예시:

version: '3'

services:
  web:
    image: nginx
    volumes:
      - /var/www/html

설명:

  • web 서비스는 nginx 이미지로 생성되며, /var/www/html 경로에 익명 볼륨이 자동으로 마운트됩니다. 이 볼륨은 컨테이너가 종료되거나 삭제되어도 데이터가 유지됩니다.

3. 명명된 볼륨 사용

명명된 볼륨은 이름을 지정하여 데이터를 보다 쉽게 관리할 수 있습니다. 명명된 볼륨은 여러 컨테이너에서 참조할 수 있으며, 컨테이너를 삭제하더라도 Docker에 저장된 데이터는 유지됩니다.

예시:

version: '3'

services:
  web:
    image: nginx
    volumes:
      - mydata:/var/www/html

volumes:
  mydata:

설명:

  • mydata라는 이름의 볼륨을 정의하고, 이를 web 서비스의 /var/www/html 경로에 마운트합니다.
  • 명명된 볼륨 mydata는 컨테이너가 삭제되어도 유지되며, 이후 다른 서비스에서도 동일한 볼륨을 사용할 수 있습니다.

4. 호스트 디렉토리를 볼륨으로 사용하기

로컬 머신(호스트)의 디렉토리를 컨테이너에 마운트하여, 개발 환경에서 실시간으로 파일을 수정하고 테스트할 수 있습니다. 이를 통해 컨테이너 내부의 파일을 직접 편집하지 않고도 로컬에서 작업한 결과를 컨테이너에서 반영할 수 있습니다.

예시:

version: '3'

services:
  web:
    image: nginx
    volumes:
      - ./local-data:/var/www/html

설명:

  • ./local-data는 호스트의 로컬 디렉토리입니다. 이 디렉토리는 nginx 컨테이너의 /var/www/html 경로에 마운트됩니다.
  • 호스트 디렉토리에서 파일을 수정하면, 컨테이너 내에서도 즉시 변경 사항이 반영됩니다. 이를 통해 개발자가 로컬 파일을 수정하면서 실시간으로 컨테이너에서 반영되는 결과를 확인할 수 있습니다.

5. 읽기 전용 볼륨 설정

일부 경우에는 데이터를 읽기 전용으로 설정하여 컨테이너 내에서 파일을 수정할 수 없도록 할 수 있습니다. 읽기 전용 볼륨은 데이터를 안전하게 유지할 때 유용합니다.

예시:

version: '3'

services:
  web:
    image: nginx
    volumes:
      - ./local-data:/var/www/html:ro

설명:

  • :ro는 읽기 전용(read-only)을 의미합니다.
  • web 서비스는 ./local-data 디렉토리를 마운트하지만, 이 디렉토리는 컨테이너 내에서 수정할 수 없습니다. 이는 중요한 데이터가 수정되지 않도록 보호하는 데 유용합니다.

6. 여러 컨테이너에서 볼륨 공유하기

같은 볼륨을 여러 컨테이너에서 공유하여 데이터를 협업할 수 있습니다. 예를 들어, 웹 애플리케이션 컨테이너와 백업 컨테이너가 동일한 데이터 볼륨을 사용할 수 있습니다.

예시:

version: '3'

services:
  web:
    image: nginx
    volumes:
      - shared-data:/var/www/html

  backup:
    image: busybox
    volumes:
      - shared-data:/data
    command: tar cvf /backup.tar /data

volumes:
  shared-data:

설명:

  • webbackup 서비스는 동일한 볼륨 shared-data를 공유합니다.
  • web 서비스는 이 볼륨을 /var/www/html 경로에 마운트하고, backup 서비스는 동일한 볼륨을 /data로 마운트하여 데이터를 백업합니다.
  • 이를 통해 데이터가 두 컨테이너 간에 공유되며, backup 서비스는 web 서비스의 데이터를 백업할 수 있습니다.

7. 볼륨 옵션 설정

Docker Compose에서 볼륨의 동작을 세부적으로 제어할 수 있는 다양한 옵션을 설정할 수 있습니다. 예를 들어, driver를 사용하여 특정 드라이버로 볼륨을 생성하거나, driver_opts로 볼륨의 설정을 상세하게 조정할 수 있습니다.

예시:

version: '3'

services:
  web:
    image: nginx
    volumes:
      - mydata:/var/www/html

volumes:
  mydata:
    driver: local
    driver_opts:
      type: none
      device: /srv/docker-data
      o: bind

설명:

  • mydata 볼륨은 local 드라이버를 사용하여 생성되며, 호스트의 /srv/docker-data 디렉토리가 컨테이너에 바인딩됩니다.
  • driver_opts 옵션을 통해 볼륨의 세부 설정을 지정할 수 있습니다. 이 예에서는 로컬 디렉토리를 볼륨으로 사용하도록 설정했습니다.

8. 익명 볼륨과 명명된 볼륨의 차이점

  • 익명 볼륨: 이름이 없는 볼륨이며, 컨테이너가 삭제될 때 볼륨도 삭제될 가능성이 있습니다. 주로 일회성 데이터 저장에 사용됩니다.
  • 명명된 볼륨: 이름이 지정된 볼륨으로, 컨테이너가 삭제되더라도 데이터는 유지됩니다. 데이터가 중요할 경우 명명된 볼륨을 사용하는 것이 좋습니다.

9. 볼륨 제거하기

더 이상 필요하지 않은 볼륨을 제거하려면 docker-compose down -v 명령어를 사용하여 관련된 모든 볼륨을 삭제할 수 있습니다.

docker-compose down -v

이 명령은 모든 컨테이너를 종료하고, 사용 중인 모든 볼륨을 삭제합니다. 단, 명명된 볼륨은 docker volume rm <volume_name> 명령을 통해 직접 삭제해야 합니다.

10. 정리

Docker Compose에서 볼륨을 설정하는 것은 데이터의 영속성을 유지하고, 여러 컨테이너 간에 데이터를 공유하는 데 중요한 역할을 합니다. 볼륨을 사용하면 데이터를 안전하게 보관하고 관리할 수 있으며, 개발 환경에서도 실시간으로 파일을 수정하고 반영할 수 있는 편리함을 제공합니다.

  • 기본 볼륨 설정을 통해 데이터를 영속적으로 보관할 수 있습니다.
  • 명명된 볼륨은 데이터가 손실되지 않도록 안전하게 관리할 수 있습니다.
  • 호스트 디렉토리와 컨테이너 간의 실시간 데이터 동기화가 가능합니다.
  • 여러 컨테이너가 동일한 볼륨을 공유하여 협업할 수 있습니다.