컨테이너의 상태
컨테이너는 기본적으로 상태 없음(Stateless)이다.
컨테이너가 실행된 후 발생하는 모든 변경 사항은 컨테이너 레이어에만 있으며 컨테이너가 종료되면 변경 사항이 모두 사라진다.
컨테이너는 Stateless하기 때문에 쉽게 개수를 증가시킬 수 있으며 다른 환경에서도 빠르게 배포할 수 있다.
컨테이너는 이미지라는 템플릿을 기반으로 동작하기 때문에 기존과는 다른 방식으로 동작한다.
모든 상태는 이미지에 기록된다. 그래서 소프트웨어의 버전 등 컨테이너의 상태 변경이 필요한 경우 새로운 버전의 이미지를 만들어서 배포한다. 실행 중이던 이전 버전의 컨테이너는 제거한다.
컨테이너는 상태가 없기 때문에 여러 대의 컨테이너를 여러 곳에 빠르게 배포할 수 있다.
그리고 다른 환경에서도 애플리케이션을 바로 실행할 수 있는 시작점 상태인 이미지만 있으면 배포가 가능하다.
애플리케이션 실행에 필요한 것은 모두 이미지에 저장되어 있다.
그래서 이미지의 컨테이너 레이어만 추가하면 바로 컨테이너를 실행시킬 수 있기에 컨테이너의 개수가 늘어나도 작은 공간만 차지한다.
Pet & Cattle
Pet & Cattle
Pet & Cattle은 클라우드 네이티브 그조에서 서버를 다루는 방법론이다.
클라우드 네이티브 환경에서는 MSA 아키텍처에 따라 서버의 개수가 매우 많아진다.
모던 애플리케이션의 요구사항을 충족시키기 위해 서버 관리 방법론이 변화했다.
전통적인 서버 방법론은 서버 한대를 중요하게 생각하는 Pet 방식이다.
- 서버 한 대를 소중하게 케어합니다.
컨테이너를 활용한 서버 방법론은 Cattle 방식이다.
- 서버를 빠르게 교체할 수 있으며 서버의 상태를 최대한 제거합니다.
컨테이너의 Stateless 특징
컨테이너의 이미지는 한번 지정된 후 변경되지 않는다. (불변성,Immutability)
새로운 설정이나 패치가 필요할 경우 새로운 이미지를 만들어야 한다.
컨테이너는 언제든지 새로운 컨테이너로 대체할 수 있다.
컨테이너는 이미지를 기반으로 실행되고 실제 실행되기를 원하는 서버의 상태는 이미지에 저장되어 있다
그래서 컨테이너를 종료하고 실행하는 것이 자유로워진다.
특정 컨테이너에 쌓인 파일들이 다른 컨테이너의 동작에 영향을 주지 않는다.
컨테이너는 어떤 호스트에서든 컨테이너를 실행할 수 있다.
호스트라는 것은 배포되는 환경을 의미한다.
컨테이너는 동일한 컨테이너를 여러개 쉽게 생성해서 트래픽에 유연하게 대응할 수 있다.
장애가 발생한 경우 새로운 컨테이너를 빠르게 시작할 수 있습니다.
컨테이너의 Stateless 제약
- 데이터를 영구적으로 저장하기 위해서는 데이터베이스 서버 사용이 필수이다.
- 컨테이너 자체로는 상태가 없기 때문에 저장 및 공유가 필요한 데이터는 무조건 외부에 저장해야 한다.
- 사용자 세션 정보나 캐시 같은 정보도 외부에 저장해야 한다.
- 예를들어 캐시 서버나 쿠키를 통해 관리한다.
- 파일이나 메모리에 저장하지 않아야 한다.
- 동일한 요청은 항상 동일한 결과를 제공해야 한다.
- 서버마다 다른 응답을 제공하면 안된다.
- 환경 변수나 구성 파일을 통해 설정을 외부에서 주입할 수 있어야 한다.
- 다양한 환경에서 컨테이너 이미지를 활용할 수 있다.
스토리지
컨테이너의 영속성
컨테이너가 삭제되거나 재생성될 경우 컨테이너 레이어가 초기화된다.
서버를 운영하다 보면 데이터를 유지해야 하는 경우가 있다.
유지한다는 것은 IT 환경에서는 영속성이 있다고 표현한다.
일반적으로 컨테이너 환경에서는 같은 서버의 대수가 여러 개 존재한다.
컨테이너는 상태가 없기 때문에 재생성되면 데이터가 모두 삭제된다.
그래서 영속성이 필요한 데이터를 저장할 공간이 필요하다.
도커는 영속성이 필요한 데이터를 위해서 도커 볼륨이라는 기능을 제공한다.
컨테이너 자체는 상태를 가지지 않지만 상태가 필요한 데이터는 외부 공유 저장소에 저장해 둔다.
도커의 볼륨 기능을 사용하면 컨테이너가 데이터를 외부에 저장하고 다른 컨테이너들과 공유할 수 있다.
컨테이너의 특정 폴더를 공유용 폴더로 만들 수 있다.
여기서 컨테이너의 폴더를 볼륨에 마운트 한다고 표현한다.
마운트(Mount)
마운트는 컴퓨터의 특정 디렉터리를 외부 저장소와 연결한다는 것을 의미한다.
마운트를 통해 외부 저장 공간을 특정 경로에 연결할 수 있다.
외부 저장공간은 물리적으로 연결하거나, 네트워크에 연결할 수 있다.
마운트는 특정 디렉터리를 외부 저장소로 대체하는 것을 의미한다.
컨테이너의 특정 디렉터리에 볼륨을 마운트 해서 사용합니다.
도커 볼륨은 USB처럼 데이터를 외부에 보관하는 기능을 제공한다.
그리고 컨테이너들은 도커 볼륨을 컨테이너의 특정 경로에 마운트해서 사용한다.
/var/lib/postgresql/data 경로를 도커의 볼륨에 마운트 한다고 생각해 보자.
그러면 컨테이너가 실행된 다음에 이 경로에 저장되는 파일들은 컨테이너 레이어에 저장되는 것이 아니라 마운트 되어 있는 외부 볼륨이 저장된다.
도커 볼륨
컨테이너 실행 시 볼륨을 컨테이너의 내부 경로에 마운트 할 수 있다.
도커 볼륨 하나를 한 개의 USB와 동일한 개념으로 이해하면 된다. USB를 꽂는 것과 유사하다.
컨테이너가 삭제돼도 볼륨은 남아 있다.
컨테이너가 실행 시 다시 마운트 할 수 있다.
재생성된 컨테이너가 다시 동일한 경로에 볼륨을 마운트 하면 이전 볼륨에 만들어져 있던 데이터를 유지할 수 있다.
하나의 컨테이너가 여러 개의 볼륨을 사용할 수 있다.
여러 개의 컨테이너가 하나의 볼륨을 공유할 수 있다.
정리
도커 볼륨은 외부 데이터를 저장하는 저장소이고 하나의 컨테이너에 여러 개의 볼륨을 마운트 시킬 수 있다.
반대로 하나의 볼륨을 여러 개의 컨테이너로도 마운트시킬 수 있다.
도커 볼륨과 컨테이너의 관계를 나타내는 도식도
도커는 여러 개의 볼륨을 생성하고 관리할 수 있다.
도커 볼륨을 4개 생성하면 호스트 OS의 역할을 하는 실습 PC의 특정 공간에 데이터를 저장하는 볼륨이 만들어진다.
바인드 마운트
HostOS에서 데이터를 직접 관찰하고 싶은 경우에 사용
도커 볼륨 관련 명령어
컨테이너에 마운트 되어 있는 볼륨을 삭제할 수 없다.
실제로 볼륨을 사용하는 컨테이너가 없을 때만 볼륨을 삭제할 수 있다.
참고
인프런의 개발자를 위한 쉬운 도커 강의를 보고 정리한 글입니다.
'Docker' 카테고리의 다른 글
10. 도커와 DevOps (0) | 2024.08.16 |
---|---|
9. Docker Compose (0) | 2024.08.16 |
6. 네트워크 (0) | 2024.08.15 |
5. 컨테이너 애플리케이션 구성 (0) | 2024.08.15 |
4. 이미지 빌드 (0) | 2024.08.14 |