Stateless
Stateless(무상태)는 시스템이나 애플리케이션이 특정 요청 간의 상태를 저장하지 않는 구조를 의미한다. 즉, 각 요청은 서로 독립적이며, 요청을 처리하는 데 있어서 이전의 요청이나 세션 정보를 참조하지 않는다.
Docker에서 Stateless는 컨테이너의 성격과 관련이 깊다. Docker 컨테이너는 애플리케이션의 실행 환경을 격리된 상태로 제공하며, Stateless 방식으로 설계된 애플리케이션을 실행하기에 적합하다.
컨테이너의 Stateless 특성
- Docker 컨테이너는 일반적으로 Stateless 특성을 가진다. 즉, 컨테이너를 중지하거나 삭제하면 그 안에서 발생한 모든 변경 사항이 사라진다.
- Stateless 애플리케이션은 상태를 컨테이너 내부에 저장하지 않으므로, Docker의 Stateless 특성에 잘 맞는다. 상태를 저장할 필요가 없기 때문에 컨테이너를 언제든지 삭제하거나 다시 시작할 수 있다.
수평적 확장
- Stateless 애플리케이션은 상태를 저장하지 않기 때문에 여러 개의 컨테이너로 쉽게 수평적 확장이 가능하다. 애플리케이션의 요청이 어느 컨테이너로 가든 상관없기 때문에 로드 밸런서를 통해 자유롭게 트래픽을 분산할 수 있다.
- 반면, Stateful 애플리케이션은 상태를 공유해야 하므로 여러 컨테이너로 확장하는 것이 어려울 수 있다.
상태 저장소와의 분리
- Stateless 애플리케이션은 데이터를 외부 저장소(예: 데이터베이스, 파일 스토리지 등)에 저장하고, 그 상태는 애플리케이션이 아닌 별도의 시스템에서 관리한다. Docker는 이와 같은 Stateless 애플리케이션을 여러 개 실행하여 높은 가용성을 유지할 수 있도록 도와준다.
컨테이너의 stateless 특징
- 컨테이너의 이미지는 한번 지정된 후 변경되지 않음(새로운 설정이나 패치가 필요할 경우 새로운 이미지를 만들어야 함).
- 컨테이너는 언제든지 새로운 컨테이너로 대체할 수 있음.
- 컨테이너는 어떤 호스트에서든 컨테이너를 실행할 수 있음.
- 컨테이너는 동일한 컨테이너를 여러개 쉽게 생성해서 트래픽에 대응할 수 있음.
- 장애가 발생한 경우 새로운 컨테이너를 빠르게 시작할 수 있음.
컨테이너의 Stateless 제약
- 데이터를 영구적으로 저장하기 위해서는 데이터베이스 사용이 필수.
- 상태가 없기 때문에 저장 및 공유가 필요한 데이터는 무조건 외부에 저장해야 함.
- 사용자 세션 정보나 캐시 같은 정보를 캐시 서버나 쿠키를 통해 관리(파일이나 메모리에 저장하지 않아야 함).
- 동일한 요청은 항상 동일한 결과를 제공해야 함(서버마다 다른 응답을 제공하면 안됨).
- 환경 변수나 구성 파일을 통해 설정을 외부에서 주입할 수 있어야 함.
Docker Volume
Docker 볼륨(Docker Volume)은 Docker 컨테이너와 호스트 시스템 간의 데이터를 영구적으로 저장하거나 공유할 수 있도록 해주는 메커니즘이다.
컨테이너는 일시적이고 휘발성이기 때문에, 컨테이너를 삭제하거나 중지하면 내부의 데이터는 사라지게 된다.
Docker 볼륨은 이를 해결하기 위한 방법으로, 데이터를 컨테이너 외부에 저장할 수 있게 해준다.
- 컨테이너가 중지되거나 삭제되더라도, 볼륨에 저장된 데이터는 유지된다. 따라서 중요한 데이터를 안전하게 보관할 수 있다.
- 하나의 볼륨을 여러 컨테이너에서 공유할 수 있다. 이를 통해 여러 컨테이너가 동일한 데이터를 읽거나 쓸 수 있다.
- 볼륨을 사용하면 호스트 시스템의 디렉토리와 컨테이너 내부의 특정 경로를 연결할 수 있다. 이를 통해 호스트 시스템에서 생성한 데이터를 컨테이너 내부에서 사용할 수 있다.
- Docker 볼륨은 Docker가 독립적으로 관리하므로, 컨테이너와는 별도로 볼륨을 생성, 삭제, 관리할 수 있다.
관리형 볼륨
Docker 관리형 볼륨(Volume)은 Docker가 자동으로 생성하고 관리하는 방식이다.
사용자가 호스트 시스템의 경로를 지정할 필요가 없으며, Docker가 자동으로 볼륨을 생성하고 관리한다.
컨테이너와 별개로 독립된 데이터 저장소로 사용될 수 있다.
또한 하나의 컨테이너가 여러 개의 볼륨을 사용할 수 있다.
여러 개의 컨테이너가 하나의 볼륨을 공유하는 것도 가능하다.
- 장점: Docker가 자체적으로 관리하므로 이동성과 관리가 용이하다. 볼륨은 컨테이너의 생애주기와 무관하게 존재할 수 있다.
- 단점: 호스트 시스템의 특정 경로를 직접 연결하는 바인드 마운트에 비해 유연성이 떨어질 수 있다.
바인드 마운트
호스트 시스템의 특정 디렉토리를 컨테이너 내부의 디렉토리와 연결한다.
경로를 명시적으로 지정해야 하며, 호스트 시스템에 있는 데이터와 직접 연결된다.
Docker가 아닌 사용자가 경로를 관리하고, Docker는 그 경로에 대한 관리 권한이 없다.
docker run -v /host/path:/container/path --name my-container
- 장점: 호스트의 특정 디렉토리와 직접 연결되어 데이터를 쉽게 공유할 수 있다.
- 단점: 호스트 시스템의 디렉토리 경로를 명시적으로 지정해야 하므로, 이동성과 관리가 어렵다.
'DevOps > Docker' 카테고리의 다른 글
[Docker + SpringBoot] 스프링부트 로그 파일 남기기 (1) | 2024.10.11 |
---|---|
[Docker + SpringBoot] Docker와 SpringBoot의 타임존 동기화 (1) | 2024.10.09 |
[Docker] 도커 네트워크 (0) | 2024.09.11 |
[Docker] 이미지와 컨테이너 레이어 (0) | 2024.09.09 |
[Docker] SpringBoot + MySQL 컨테이너화 (1) | 2024.09.08 |