CS 지식
컨테이너와 도커
경토리
2024. 12. 1. 16:51
728x90
컨테이너
컨테이너란?
- 어떤 환경에서나 실행하기 위해 필요한 모든 요소(의존성)를 포함하는 소프트웨어 패키지.
- 이를 통해 전체 기능을 유지하면서 컨테이너화된 애플리케이션을 환경(개발, 테스트, 프로덕션 환경 등) 간에 쉽게 이동할 수 있다.
컨테이너 = 마법 상자
- 내 물건과 다른 사람의 물건이 한 군데 뒤섞이면 내 것을 찾기 힘들다.
- 그런데 어떤 마법 상자는 A는 A의 물건만 들어있고, B는 B의 물건만 넣어서 관리해준다.
- 마법 상자는 어디서든 똑같이 열 수 있어서 집에서든, 카페에서든 상자를 열면 내 물건이 그대로 들어있다. 게다가 가벼워서 들고 다니기도 편하다!
- 컴퓨터에서도 프로그램을 실행할 때, 이 상자를 사용하면 어디서든 같은 환경에서 프로그램을 실행할 수 있다.
- 컨테이너 = 마법 상자
- 컨테이너 안에 들어 있는 프로그램 또는 데이터 = 내 물건
- Docker = 상자를 만들기 위한 모든 도구를 제공해주는 것
- Kubernates = 상자가 많아지면 관리가 필요한데 이 상자를 필요한 곳에 효율적으로 배치하고 관리해주는 것
왜, 사용할까?
- 개발 환경의 일관성
- 호환되지 않는 환경으로 인해 발생하는 충돌을 방지하고 시스템 전반에서 일관된 성능을 얻을 수 있다.
- “내 컴퓨터에서는 되는데?” 문제를 해결해준다.
- 개발자는 다양한 서버 환경에 상관 없이 애플리케이션 자체에 집중할 수 있다.
- 호환되지 않는 환경으로 인해 발생하는 충돌을 방지하고 시스템 전반에서 일관된 성능을 얻을 수 있다.
- 가상 머신에 비해 작은 크기와 빠른 속도
- 컨테이너는 시스템 OS 커널을 공유하므로 VM과 달리 애플리케이션마다 OS 인스턴스를 둘 필요가 없다.
- 즉, 부팅할 운영 체제가 없기 때문에 빠르게 실행할 수 있다.
- 컨테이너는 시스템 OS 커널을 공유하므로 VM과 달리 애플리케이션마다 OS 인스턴스를 둘 필요가 없다.
- 이식성
- 컨테이너가 모든 종속 항목을 함께 전달하므로, 한 번 만든 소프트웨어는 재구성 없이 어떤 환경에서든 실행할 수 있다.
- 모듈성
- 컨테이너를 더 작은 모듈로 나누어 개별 컨테이너를 유연하게 발전시키고 확장, 재사용할 수 있다.
- 결함 격리
- 한 컨테이너의 장애는 다른 컨테이너의 지속적인 운영에 영향을 주지 않기 때문에 다른 컨테이너의 가동 중단 없이 한 컨테이너 내의 문제를 식별하고 정정할 수 있다.
어디서 사용할까?
- 개발자는 로컬 환경에서 컨테이너를 사용해 애플리케이션을 개발, 테스트할 수 있다.
- 이때 컨테이너 안에서 애플리케이션이 실행되므로 개발 환경이 프로덕션 환경과 정확히 일치하게 된다.
- 마이크로서비스 아키텍처
- 마이크로서비스 아키텍처?
- 애플리케이션을 작고 독립적인 부분으로 나누어 개발하는 것
- 각 마이크로서비스를 개별 컨테이너에 분류해 개발자들은 전체 애플리케이션을 다시 작업하지 않고 독립적으로 업데이트할 수 있다.
- 마이크로서비스 아키텍처?
- CI/CD (지속적인 통합, 지속적인 배포)
- 빌드, 테스트, 배포될 때마다 일관된 환경에서 실행하므로 안전성이 높아진다.
Docker
- 개발자가 컨테이너를 빌드, 배포, 실행, 업데이트, 관리할 수 있는 오픈 소스 플랫폼
왜 굳이 도커를 사용해 컨테이너를 만들까?
- Linux 및 기타 OS에서 기본 제공하는 기능을 직접 사용하면 개발자가 Docker 없이 컨테이너를 생성하는 것도 가능하다. (리눅스 컨테이너 기술)
- 하지만 Docker를 사용하면 더 빠르고 편리하며 안전하게 컨테이너를 만들 수 있다.
- 이식성
- 다양한 OS에서 실행될 수 있어 어느 환경에서나 동일하게 실행할 수 있다.
- 클라우드 환경과 온프레미스 환경 간의 이동성도 높여준다.
- 버전 관리와 재현성
- 도커 이미지는 버전 관리가 가능해 어떤 시점의 애플리케이션 상태도 재현할 수 있다.
구성 요소
- 도커 엔진
- 시스템의 핵심으로, 클라이언트 서버 아키텍처를 사용하는 애플리케이션이며 호스트 시스템에 설치된다.
- 도커 데몬(실행 파일)이다. REST API를 통해 docker 명령어를 클라이언트와 통신한다.
- 도커 엔진은 아래 도커 요소들을 포함한다.
- 도커 파일(Dockerfile)
- 모든 도커 컨테이너는 도커 컨테이너 이미지의 빌드 방법에 관한 지시사항이 포함된 단순 텍스트 파일로 시작한다.
- 도커 파일은 도커 이미지 생성 프로세스를 자동화한다.
- CLI 명령어 리스트로 이루어져있다.
- 도커 이미지
- 실행 가능한 애플리케이션 소스 코드와 이 애플리케이션이 컨테이너 형태로 실행되는 데 모든 툴, 라이브러리 및 종속성이 포함되어 있다.
- 도커 이미지를 실행하면 컨테이너의 인스턴스가 된다.
- 도커 이미지를 완전히 새로 빌드하거나 공통 저장소에서 이미지를 가져오기도 한다.
- 도커 컨테이너
- 도커 이미지의 현재 실행 중인 라이브 인스턴스이다.
- 독립된 컨테이너는 네트워크를 통해 서로 통신할 수 있다.
- 도커 허브
- 도커 이미지를 공유하는 저장소
작동 과정
- 도커 파일 작성
- Dockerfile은 애플리케이션을 실행하는 데 필요한 모든 지시사항을 포함한다.
- 사용할 기반 이미지, 추가할 파일, 실행할 명령어 등이 포함된다.
- Dockerfile은 애플리케이션을 실행하는 데 필요한 모든 지시사항을 포함한다.
- 이미지 빌드
- Dockerfile을 사용해 도커 이미지를 빌드한다.
- 도커 클라이언트는 Dockerfile에 명시된 지시사항을 순서대로 실행해 애플리케이션을 실행하는 데 필요한 모든 것을 포함하는 이미지를 생성한다.
- 컨테이너 생성 및 실행
- 빌드된 이미지를 기반으로 컨테이너를 생성하고 실행한다.
- 컨테이너를 격리된 환경에서 실행해 독립적으로 동작하도록 한다.
정리
Container : 한 대의 서버에서 여러 개의 소프트웨어를 안전하고 효율적으로 운영 가능
Docker : 컨테이너를 관리하기 위한 도구로 일종의 프로그램
쿠버네티스 : 서버가 여러 대 있는 환경에서 각각의 서버의 도커에게 지시해주는 오케스트레이션 도구
728x90