docker-compose의 volumes 구문을 이해하려면 다음 세 가지 핵심 개념을 알아야 합니다.


1. 볼륨(Volume)

도커 볼륨은 컨테이너가 생성, 실행, 삭제될 때 컨테이너의 수명 주기와 독립적으로 데이터를 저장하고 관리하는 데 사용되는 메커니즘입니다. 이는 컨테이너가 사라져도 데이터는 보존되게 하여 영속성을 확보합니다.

볼륨을 사용하는 방법은 크게 세 가지입니다.

  • 익명 볼륨(Anonymous Volumes): docker run -v /data와 같이 이름 없이 사용하며, 컨테이너가 제거될 때 함께 삭제되는 경우가 많습니다.
  • 네임드 볼륨(Named Volumes): docker volume create my-volume처럼 이름을 부여하여 관리하며, 컨테이너가 삭제되어도 데이터가 안전하게 보존됩니다.
  • 바인드 마운트(Bind Mounts): 호스트 머신의 특정 경로를 컨테이너의 특정 경로에 연결합니다. 사용자가 직접 경로를 지정하므로 가장 많이 사용되는 방식입니다. docker-compose.yml 파일에 ${CI_PROJECT_DIR:-../../}:/app 구문이 바로 이 바인드 마운트 방식입니다.

2. 셸 확장(Shell Expansion)

$VARIABLE, ${VARIABLE}, ${VARIABLE:-default}와 같은 구문은 운영체제 셸(Shell)에서 환경 변수를 다루는 문법입니다. Docker Compose는 이 문법을 지원하여 동적인 설정을 가능하게 합니다.

  • $VARIABLE: VARIABLE이라는 환경 변수의 값을 가져옵니다.
  • ${VARIABLE:-default}: VARIABLE이라는 환경 변수가 정의되지 않았거나 비어 있는 경우, default라는 값을 대신 사용합니다. 질문에 나온 :-가 바로 이 역할을 합니다. 이는 CI/CD 환경처럼 변수가 설정된 곳에서는 해당 값을 사용하고, 로컬 개발 환경처럼 변수가 없는 곳에서는 기본값을 사용하도록 유연성을 제공합니다.

3. 리눅스 권한(Linux Permissions)

리눅스 및 유닉스 기반 시스템에서는 파일과 디렉터리에 대한 접근을 제어하기 위해 권한 시스템을 사용합니다. 이는 다음과 같이 세 가지 주체와 세 가지 권한으로 나뉩니다.

  • 주체:
    • 소유자(User): 파일 또는 디렉터리를 생성한 사람.
    • 그룹(Group): 소유자와 같은 그룹에 속한 사람들.
    • 기타(Others): 소유자나 그룹에 속하지 않은 모든 사용자.
  • 권한:
    • 읽기(r): 파일의 내용을 읽거나 디렉터리의 파일 목록을 볼 수 있는 권한.
    • 쓰기(w): 파일의 내용을 수정하거나 디렉터리에 파일을 생성, 삭제할 수 있는 권한.
    • 실행(x): 파일을 실행하거나 디렉터리에 접근할 수 있는 권한.

chmod 777, chmod 755와 같은 숫자는 이 권한들을 8진법으로 표현한 것입니다.

  • 첫 번째 자리(소유자): 4(읽기) + 2(쓰기) + 1(실행)의 합.
  • 두 번째 자리(그룹): 동일
  • 세 번째 자리(기타): 동일

따라서 755는 (4+2+1)(4+0+1)(4+0+1)로 소유자에게는 읽기/쓰기/실행 권한을, 그룹과 기타 사용자에게는 읽기/실행 권한만 부여하는 것을 의미합니다. Docker 컨테이너가 호스트의 특정 디렉터리에 접근할 때 권한 문제가 발생하는 것은 컨테이너의 실행 사용자호스트 디렉터리의 소유자, 그룹, 또는 기타 사용자의 권한을 제대로 부여받지 못했기 때문입니다.

 

Questions

1. UID와 GID는 왜 동일한가?

UID와 GID에 대한 이해

UID(User ID)와 GID(Group ID)는 리눅스 시스템에서 사용자와 그룹을 식별하는 고유한 번호입니다. 사용자 이름(예: user1, root)은 사람이 읽기 쉽게 만들어진 별명이며, 시스템은 실제로 이 번호를 사용해 권한을 관리합니다.

  • root 사용자의 UID는 항상 0입니다.
    • root는 시스템의 모든 권한을 가진 최고 관리자 계정입니다. 그래서 UID 0은 특별한 의미를 가집니다.
  • 일반 사용자의 UID는 보통 1000부터 시작합니다.
    • 최신 리눅스 배포판에서는 관례적으로 첫 번째로 생성되는 일반 사용자에게 UID 1000을 부여합니다.
  • UID와 GID가 같은 이유:
    • 일반적으로 사용자가 생성되면 동일한 이름의 그룹이 함께 생성됩니다. 예를 들어, user1을 만들면 user1 그룹(GID 1000)도 함께 만들어지고, user1 사용자가 이 그룹의 유일한 멤버가 됩니다. 이렇게 하면 각 사용자가 자신의 파일을 독립적으로 관리할 수 있어 편리합니다.
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기