logoRawon_Log
홈블로그소개

Built with Next.js, Bun, Tailwind CSS and Shadcn/UI

Docker

Docker - 스토리지와 볼륨

Rawon
2025년 9월 12일
목차
Storage & Volume
컨테이너의 상태(State)
Pet & Cattle
Docker Volume
바인드 마운트
Docker Volume 명령어

목차

Storage & Volume
컨테이너의 상태(State)
Pet & Cattle
Docker Volume
바인드 마운트
Docker Volume 명령어

Storage & Volume

컨테이너의 상태(State)

컨테이너는 상태없음(Stateless) 입니다.

이미지는 읽기 전용 레이어이고 이를 활용해 컨테이너를 실행하면 읽기/쓰기 레이어인 컨테이너 레이어가 추가되며, 이후 발생하는 모든 변경사항들은 컨테이너 레이어에 쌓이게 됩니다.

그래서 컨테이너가 실행된 후 발생하는 모든 변경사항은 컨테이너 레이어에만 있으며, 컨테이너가 종료되면 변경사항이 모두 사라집니다.

또한, 컨테이너를 실행할 때 한번 지정한 이미지는 변경할 수 없습니다.

예를 들어 컨테이너 A를 실행 중인 상태에서 이 컨테이너의 이미지 버전을 변경하고 싶다면 실행 중인 컨테이너를 삭제하고 새로운 이미지로 실행시켜야 합니다.

이렇게 상태를 가지지 않는다는 것은 컨테이이너의 중요한 특징 중 하나 입니다.

상태를 가지지 않는다는게 부정적으로 보일 수 있지만

상태를 갖는다는 것은 갯수가 많아질수록 이 하나하나의 경우의 수가 늘어난다는 것을 의미하고 결국 하나하나를 따로 관리해야 하기 때문에

Stateless 하다는 점이 빠르고 쉽게 갯수를 증가시킬 수 있다는 장점을 갖습니다.

이해가 쉽도록 예시를 들어보겠습니다.

만약 기존 서비스되고 있는 애플리케이션의 소스코드나 사용된 라이브러리의 버전을 업데이트 할 경우에는 서버에 접근한 다음 기존 애플리케이션을 중지시키고 새로운 버전의 애플리케이션을 덮어쓰기 한 후 다시 실행시켜야 했습니다.

이러한 상황에 동일한 서버가 10대가 있다면 이 10대에 모두 위와 같은 변경사항을 적용하는 과정을 거쳐야 하고 이는 즉, 서버 한대마다 유일한 상태 를 가진다는 것을 의미합니다.

또한, 변경사항을 모두 적용했더라도 서버 10대가 모두 동일한 상태라는 것을 보장하기 어려울 겁니다.

하지만 컨테이너는 자체 상태를 갖지 않고 이미지 라는 템플릿을 기반으로 동작하며, 모든 상태는 이미지에 기록합니다.

그래서 애플리케이션의 소스나 라이브러리 버전 업데이트 등과 같은 변경사항은 모두 새로운 버전의 이미지 로 만들고 재배포해버리면 그만입니다.

그리고 기존 컨테이너는 제거를 해버림으로서 이전 방식에 비해 빠르고 쉽게 변경사항을 적용할 수 있습니다.

이처럼 컨테이너는 Stateless하기 때문에 빠르고 트래픽이 갑자기 증가하더라도 더 유연하게 대처할 수 있습니다.

💡 컨테이너의 이미지는 한번 지정된 후 변경되지 않으며 컨테이너는 Stateless 하다는 특징 때문에 특별히 주의해야 할 것들이 있습니다.

  1. 컨테이너는 상태가 없기 때문에 데이터를 영구적으로 저장하기 위해서는**(저장 및 공유가 필요한 데이터)** 별도의 데이터베이스 서버를 사용하는 것이 필수!

  2. 사용자의 세션정보나 캐시 같은 정보도 외부(캐시 서버나 쿠키)에 저장해 놓아야 함!

  3. 동일한 요청은 항상 동일한 결과를 제공할 수 있어야 함!

  4. 환경변수나 구성 파일을 사용해서 설정을 외부에서 주입할 수 있어야 함!


Pet & Cattle

클라우드 네이티브 환경에서는 MSA 아키텍처로 개발이 이루어지며, 아키텍처 구조 상 서버의 갯수가 아주 많아집니다.

이에 따라 서버를 바라보는 관점의 변화가 생겼는데, 전통적인 서버 방법론이 Pet 방식이며,

컨테이너를 활용한 서버 방법론이 Cattle 방식 입니다.

Pet 방식은 서버 한대를 소중히 생각하여 한대 한대 직접 관리하는 방식을 의미합니다.

그에 반해 Cattle 방식은 서버를 일종의 소모품이라고 생각합니다. 그래서 서버가 종료되면 새로운 서버를 빠르게 실행시켜서 기존의 서버를 대체시켜 버립니다.


Docker Volume

Docker에서 컨테이너 데이터를 관리하는 방식

컨테이너는 상태를 갖지 않기 때문에 컨테이너가 삭제되거나 재시작되면 모든 데이터가 이미지의 상태로 초기화 된다고 했습니다.

그런데 간혹 특정 데이터를 유지해야 하는 경우가 있는데 이 유지한다는 것을 IT 용어로는 Persistence(영속성) 이라고 표현합니다.

특히, DB 서버의 경우 저장되는 데이터들이 DB 서버의 특정 디렉토리에 저장되는데 이런 데이터들이 컨테이너가 삭제되거나 재생성될 때마다 초기화되면 운영에 차질이 생길 수 있습니다.

일반적으로 컨테이너를 운영하는 환경에서는 같은 역할을 하는 서버가 여러 개로 운영됩니다.

이를 서버가 이중화 되어있다고 표현하며, 보통 같은 이미지로 실행된 컨테이너이기 때문에 동일한 기능을 제공해야 합니다.

여기에 영속성이 필요한 데이터는 같은 종류의 모든 컨테이너가 함께 공유하고 있어야 합니다.

( 상품 주문 금액 관련 예시를 생각하면 이해가 쉽습니다.)

그래서 Docker는 이렇게 영속성이 필요한 데이터를 위해 Docker Volume 이라는 기능을 제공합니다.

컨테이너 자체는 상태를 가지지 않지만 상태가 필요한 데이터는 외부 공유 저장소에 저장해두는 기능 입니다.

그렇다고 컨테이너의 모든 데이터를 저장하는 것은 아니고 특정 폴더를 공유용 폴더로 만들 수 있습니다.

이를 컨테이너의 폴더를 볼륨에 Mount 한다고 표현합니다.

💡 마운트 (Mount)
마운트는 컴퓨터의 특정 디렉토리를 외부 저장소와 연결(대체)하는 것을 의미합니다.

그리고 Docker Volume 은 USB처럼 데이터를 외부에 보관하는 기능을 제공합니다.

컨테이너들은 이 볼륨을 컨테이너의 특정 경로에 마운트해서 사용합니다.

예를 들어 같은 역할을 하는 3개의 컨테이너가 있고 컨테이너의 특정 경로인 /var/lib/postgresql/data 에 볼륨을 마운트했다고 가정했을 때, 볼륨은 1개이고 컨테이너는 3개인 환경이 구성됩니다.

그리고 1개의 볼륨을 3개의 컨테이너가 모두 동일한 경로에 마운트 했기 때문에 모든 컨테이너는 동일한 데이터를 제공할 수 있게 됩니다.

즉, 3개의 컨테이너의 /var/lib/postgresql/data 데이터 경로는 실제로는 하나의 경로에 저장되어 있는 것입니다.

그래서 컨테이너가 삭제되거나 새로운 컨테이너가 생성되어도 동일한 경로가 다시 마운트되고 볼륨의 데이터는 그대로 남아있기 때문에 데이터의 영속성을 보장할 수 있는 것 입니다.

쉽게 이해하면 Docker 볼륨 하나를 한개의 USB와 동일한 개념으로 이해하면 될 것 같습니다.

컨테이너를 실행할 때, Docker 볼륨을 마운트 하는 방법 은 아래와 같이 : 을 기준으로 좌측에는 Docker의 볼륨 이름을 입력하고 우측에는 마운트할 컨테이너 경로를 입력하면 됩니다.

docker
docker run -v 도커의볼륨명:컨테이너의내부경로
# 예시) docker run -v volume1:/var/lib/postgresql/data

이렇게 설정해두고 나서 이 볼륨과 연결된 컨테이너가 삭제되어도 볼륨은 남아있기 때문에 다시 새로운 컨테이너가 위와 동일한 경로로 마운트 하면 이전 볼륨에 만들어져있던 데이터를 그대로 유지할 수 있습니다.

그리고 하나의 컨테이너에는 여러 개의 볼륨을 마운트할 수 있습니다.

즉, 하나의 컴퓨터에 여러 개의 USB를 꽂을 수 있는 것과 같습니다.

docker
docker run -v volume1:/etc/postgresql -v volume2:/var/lib/postgresql/data

또한, Docker Volume 은 여러 개의 컨테이너가 공유 할 수 있습니다.

예를 들어 DB 컨테이너를 여러 대 실행 시킨 상태에서 하나의 볼륨을 각각의 컨테이너들의 데이터를 저장하는 경로(모두 같은 경로)로 마운트시키면 이 컨테이너들은 어떤 컨테이너로 요청을 보내도 동일한 데이터를 제공할 것 입니다.

docker
docker run -v volume1:/var/lib/postgresql/data --name postgresql1

docker run -v volume1:/var/lib/postgresql/data --name postgresql2

바인드 마운트

볼륨을 마운트할 때는 일반적으로 Docker 볼륨의 이름을 지정합니다.

그리고 이 볼륨의 Host OS의 데이터를 저장하는 경로를 volumes 라고 하는데 실제로는 Docker가 실행되는 가상머신 안에서 저장되기 때문에 이 볼륨이 저장하는 경로에 사용자가 직접 접근하기는 어렵습니다.

그래서 HostOS에서 데이터를 직접 관찰하고 싶은 경우에 Bind Mount 기능을 사용합니다.

Bind Mount 기능을 사용하면 HostOS의 경로를 직접 지정할 수 있습니다.

하지만 바인드 마운트 기능을 사용하면 볼륨이 별도로 만들어지지 않기 때문에 주로 직접 디렉토리 내용을 관찰해야 하는 디버깅 같은 상황에서만 유용하게 사용됩니다.

Docker Volume 명령어

docker
# 관리하는 볼륨 리스트를 조회
docker volume ls

# 해당 볼륨의 상세 정보 조회
docker volume inspect 볼륨명

# 볼륨명을 지정해서 새로운 볼륨 생성
docker volume create 볼륨명

# 볼륨 삭제
docker volume rm 볼륨명

이 링크를 통해 구매하시면 제가 수익을 받을 수 있어요. 🤗

https://inf.run/CigvZ