2차 배포 및 운영전략 점검(Docker의 volumes)

김의석 ·2025년 1월 2일

Hello! Poko Ver.2

목록 보기
21/28

1차 개발과 2차 개발의 volumes로 인해 DB 데이터 간섭 여부

문제

  • 문제 요약:
    다른 디렉토리의 두 Docker Compose 설정에서 동일한 postgres_data, static_volume, media_volume를 사용하고 있다.

  • 오류 메시지:

    • DB 데이터 간섭 가능성
      postgres_data는 PostgreSQL 데이터가 저장되는 볼륨이다. 동일한 이름의 볼륨을 사용하면, 1차 개발과 2차 개발 모두 같은 데이터베이스 데이터를 참조하게 될 가능성이 있다.

    • 정적 파일(static_volume) 및 미디어 파일(media_volume)
      동일한 이름의 볼륨을 사용하면 1차와 2차 개발에서 업로드된 미디어 파일이나 정적 파일이 공유된다.

문제 해결 과정

1차 개발 코드와 2차 개발 코드의 독립성을 높이기 위해 다른 volumes를 사용하도록 코드를 수정하습니다.

운영/개발서의 docker-compose.yml에서 고유한 볼륨 이름을 참조하도록 수정한다.

운영서버 docker-compose.prod.yml

volumes:
  postgres_data_v2:
  static_volume_v2:
  media_volume_v2:

기존의 1차 개발 코드의 volumes와 구분하기 위해 각 volumes의 뒤에 _v2를 붙여 독립적인 volumes를 생성하게 한다.


1차 개발과 2차 개발의 컨테이너 전환 가능 여부

문제

  • 문제 요약: 두 개발 코드에서 동일한 포트(80, 443)와 동일한 이름의 컨테이너(nginx, web, db, certbot)를 사용.

  • 오류 메시지:

문제 해결 과정

운영 시 컨테이너 전환 가능

  • docker-compose down으로 기존 컨테이너(1차 개발 코드)를 중지하고, 다른 개발 코드의 docker-compose up으로 컨테이너를 실행할 수 있다.

주의사항

  • 동일한 포트를 사용하기 때문에, 한쪽 컨테이너가 실행 중인 경우 다른 컨테이너를 시작하면 포트 충돌이 발생할 수 있다. 반드시 중지 후 실행한다.

Docker의 volumes

Docker의 볼륨(volumes)은 컨테이너 외부에서 데이터를 영구적으로 저장하기 위한 Docker의 저장소 입니다. 볼륨은 Docker가 관리하는 특정 위치에 저장되며, 컨테이너와 호스트 간 데이터 공유를 지원합니다.

1. Docker Volumes의 기본 위치

  • Docker는 볼륨 데이터를 일반적으로 호스트 머신의 다음 경로에 저장합니다.
/var/lib/docker/volumes/

프로젝트에서 정의한 볼륨들이 고유한 이름을 가진 디렉토리로 저장됩니다.

2. 현재 프로젝트에서 정의된 볼륨

docker-compose.prod.yml에서 정의된 볼륨은 다음과 같습니다.

volumes:
  postgres_data_v2:
  static_volume_v2:
  media_volume_v2:
  • postgres_data_v2: 데이터베이스(PostgreSQL)의 데이터를 저장합니다.
  • static_volume_v2: Django에서 생성된 정적 파일을 저장합니다.
  • media_volume_v2: 업로드된 미디어 파일을 저장합니다.

이들 볼륨은 각각의 Docker 컨테이너와 연결되며, 컨테이너가 삭제되어도 이 데이터는 유지됩니다.

3. 볼륨 위치 확인

볼륨이 실제로 저장된 경로를 확인하려면, 다음 명령을 사용하여 볼륨 경로를 찾을 수 있습니다.

docker volume inspect <볼륨이름>

예시 코드입니다.

docker volume inspect poko_ver2_postgres_data_v2

출력 예시

[
    {
        "CreatedAt": "2025-01-01T09:00:00Z",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/poko_ver2_postgres_data_v2/_data",
        "Name": "poko_ver2_postgres_data_v2",
        "Options": null,
        "Scope": "local"
    }
]

이때 Mountpoint가 실제 볼륨 데이터가 저장된 디렉토리를 의미합니다.

/var/lib/docker/volumes/poko_ver2_postgres_data_v2/_data

4. Docker 볼륨의 생성

볼륨 생성 시점

직접 명령을 실행 시

docker volume create

docker-compose up 실행 시

  • docker-compose.yml 파일에서 정의된 volumes가 처음으로 사용될 때 생성됩니다.
  • docker-compose build 단계에서는 볼륨이 생성되지 않습니다.
  • 볼륨은 컨테이너가 시작될 때(docker-compose up) 자동으로 생성됩니다.

5. Docker가 볼륨을 독립적으로 관리하는 방식

프로젝트 디렉토리Compose 파일 이름의 역할

  1. Docker Compose는 COMPOSE_PROJECT_NAME을 기반으로 볼륨 이름을 생성합니다.
  • 명시적으로 COMPOSE_PROJECT_NAME을 지정하지 않으면, 기본적으로 Compose 파일이 위치한 디렉토리 이름이 프로젝트 이름으로 사용됩니다.
  • ~/github/Hello_Poko/docker-compose.yml프로젝트 이름: hello_poko
  • ~/poko_ver2/docker-compose.prod.yml → 프로젝트 이름: poko_ver2
  1. 볼륨 이름은 프로젝트 이름을 기준으로 자동으로 독립적 생성
  • hello_poko_postgres_data는 1차 개발 프로젝트에 속한 볼륨.
  • poko_ver2_postgres_data는 2차 개발 프로젝트에 속한 볼륨.
  • Docker가 기본적으로 프로젝트 이름을 기준으로 관리하기 때문에, 다른 프로젝트 간 볼륨 충돌은 발생하지 않습니다.
profile
널리 이롭게

0개의 댓글