[Docker] 데이터 관리 및 볼륨 - Section 3-1

liljoon·2023년 12월 17일
0

이 글은 Udemy의 "【한글자막】 Docker & Kubernetes : 실전 가이드" 강의의 학습 노트입니다.
https://www.udemy.com/course/docker-kubernetes-2022/

그냥 저장

일반적으로 컨테이너 내부에 파일을 저장하게 되면 컨테이너 레이어에 저장하게 된다. 그러기 때문에 같은 이미지를 사용하는 컨테이너끼리도 당연히 공유가 안된다. 그리고 컨테이너가 삭제되면 해당 파일도 같이 삭제된다.

볼륨(volume)

볼륨이라는 것을 이용하게 되면 컨테이너 내부에 저장되는 것이 아닌 호스트 머신에 저장이 된다. 지속적인 연결이 되며 컨테이너가 삭제되어도 유지된다. 참고로 볼륨은 도커 내부에서 자체적으로 관리한다.
docker run, 즉 컨테이너 생성 시 지정해야 한다.

1. 익명 볼륨 (anonymous volume)

일반적으로는 잘 쓰이지 않는 것 같다. 볼륨 이름을 지정하지 않고 생성 하면 volume 이름이 랜덤으로 생성되고 docker run 할 시 옵션에 --rm이 붙어있으면 컨테이너 종료(바로 삭제된다)될 시 같이 지워진다.
익명 볼륨을 만드는 법은 두가지가 있다.

  1. image를 빌드할 시 명령어를 추가 시키는 것이다.

    ```
    VOLUME [ "/app/test" ]
    ```

    이러한 식으로 경로 지정을 하면 해당 경로로 익명 볼륨이 생긴다.

  2. docker run 할 시 option으로 추가하는 것이다.

docker run -v /app/test <image>

특정 어플리케이션에서는 에러가 발생할 수 있다. 파일을 rename하는 방식으로 저장하면 에러가 난다. 서로 다른 디바이스로 인식하고 있기 때문에 copy하는 방식으로 옮겨야 에러가 안난다.

특정한 상황에서는 사용된다. 예를 들어 추후에 나올 바인드 마운트를 통해 소스코드와 경로를 연결시키면 컨테이너 내부의 파일이 덮어써지면서 지워질 수 있다. 안 지워지게 해당 부분만 익명 볼륨을 사용할 수 있다.

2. 명명 볼륨 (named volume)

익명 볼륨과 다르게 볼륨 이름을 직접 지정하는 것이다. 이러한 방식으로 하면 자동으로 지워지지 않을 뿐더러 다시 재사용하기도 수월하다.

docker run -v <volume name>:/app/test <image>

' : '를 기준으로 볼륨 이름과 컨테이너 내부 경로를 지정하면 된다.

바인드 마운트(bind mount)

바인드 마운트는 명명 볼륨(named volume)과 유사하다. 하지만 가장 큰 차이점은 호스트 머신의 경로를 지정하여 매핑할 수 있다. 이를 이용해서 소스코드를 실시간으로 변화, 적용시킬 수 있고 특정 폴더에 대해서 관리할 수 있다.(하지만 배포 상황에선 권장하지 않음)
영구적이고 편집가능하다.
바인드 마운트는 도커에서 관리하지 않는다.
(docker volume ls 로 조회되지 않음)

docker run -v "<host path>:/app/test" <image>

특수문자가 경로에 존재하는 경우 에러 방지를 위해 쌍따옴표로 감싸면 좋다.

주의점은 기본적으로 파일 충돌이 일어날 경우 호스트 머신이 우선 순위가 되어 도커 내부의 파일이 덮어 써진다. 그래서 아까 말한 익명 볼륨을 통해 방지할 수 있다.


+추가내용

읽기 전용 볼륨이란?

기본적으로 컨테이너 입장에서 볼륨은 read, write가 전부 가능하다.
소스코드와 같은 정보를 write 못하게 read-only로 설정할 수 있다.
... -v "<path>:/app:ro ..

이러한 식으로 끝에 :ro (read-only)를 추가하여 생성해주면 된다.

볼륨 주요 관련 명령어

  • 볼륨 리스팅
    docker volume ls
  • 수동으로 볼륨 생성
    docker volume create <volume name>

  • 볼륨 정보 조회
    docker volume inspect <volume name>

    매핑된 경로를 확인할 수 있지만 실제 로컬에서 경로를 확인할 수 없고 docker engine에 존재하는 작은 가상 머신에서의 경로이다.

0개의 댓글