📌 Container 이해하기
- 애플리케이션의 코드, 라이브러리, 환경 설정을 포함
- 애플리케이션을 안전하고 효율적으로 실행 가능
- 한 곳에서 다른 곳으로 쉽게 배포 가능
→ 물류에서의 컨테이너와 유사점 多 (용기, 표준화, 이동 가능)
📣 Container 란?
애플리케이션을 실행하기 위한 가상 환경
- 가상화 기술의 일종으로 Docker와 Kubernetes와 같은 도구를 사용하여 배포하고 관리할 수 있음
- 커널(운영체제의 기본적인 기능)을 사용해 가볍고 효율적으로 실행 가능
커널(kernel)
- 컴퓨터의 하드웨어와 소프트웨어를 연결하고 관리하는 역할 (a.k.a 컴퓨터의 뼈대)
- 컴퓨터의 모든 부분을 작동시키는데 필요한 기본적인 기능들을 제공하는 가장 중요한 부분!

- 호스트 OS의 자원을 분리해 독립적으로 실행 → 컨테이너가 서로 영향을 미치지 않고 안전하게 실행
- 표준화된 이미지를 기반으로 컨테이너 생성 → 컨테이너는 쉽게 이동, 공유, 재사용 가능
- 컨테이너는 호스트 OS 커널을 공유하여 가벼움
→ 각 서버에서 Container를 구동해 그 안에 존재하는 애플리케이션을 별도의 설정 없이 쉽게 사용할 수 있게 함
📣 사용 이유
- 프로젝트 배포를 위해서는 필요한 환경(서버, OS, 네트워크 통신 포트 구성 및 개발 툴, 연동 환경 구성 등)을 구축해야 함
- 새로운 개발자의 합류 시, 동일한 환경에서 작업하도록 모든 설정을 반복해야 함 → 비효율적
→ 서버, OS, 네트워크 통신 포트 구성, 개발 툴 등의 환경 설정을 한 번 구축한 뒤 다른 곳에 배포해 사용 가능
📣 가상 머신 (VM, Virtual Machine) VS. 컨테이너 (Container)
🟠 가상 머신 (VM, Virtual Machine)
- 1960년대부터 연구되기 시작하여, 2000년대 이후부터 가상 머신 소프트웨어의 등장으로 본격적으로 사용되기 시작함
- 가상 머신은 호스트 OS 위에서 별도의 가상 OS를 실행함
- 가상 OS에 필요한 운영체제, 애플리케이션, 데이터 등을 설치해야 함

- 가상 머신 구축은 많은 시간이 소요됨
- 가상 OS는 호스트 OS와 별도로 실행 → 메모리 및 CPU 자원을 독점적으로 사용함
- 가상 머신을 노트북에서 사용한다면, 노트북의 성능이 저하될 수 있음
🟠 컨테이너 (Container)
- 가상 머신과 달리, 호스트 OS의 커널을 공유해서 애플리케이션을 실행하는 가상 환경
- 장점
- 경량화
- 가상머신과 달리 별도의 OS를 포함하지 않아 가볍고 효율적임
- 빠른 실행속도
- 컨테이너는 가상 머신과 달리 호스트 OS의 커널을 공유
- 단점
- 독립성
- 호스트 OS의 커널을 공유하여 가상 머신과 같은 독립성 제공 불가
- 호스트 OS의 업데이트, 문제 등으로 영향을 받을 수 있음
- 보안
- 가상 머신과 같은 강력한 보안 기능을 제공하지 못하므로 민감한 데이터를 포함하지 않도록 주의해야 함
📎 정리

- 가상 머신은 OS 전체를 가상화하여 독립적인 환경을 제공
- 컨테이너 기술은 OS의 커널만 공유하여 애플리케이션을 실행하는 방식
→ 컨테이너 기술은 가상 머신 기술에서 발전된 형태로 볼 수 있음

- 다양한 OS를 실행해야 하는 환경에서는 가상 머신 기술이 유용함
- 애플리케이션을 실행하는데 주로 사용되는 환경, 확장성과 비용 절감이 중요한 환경에서는 컨테이너 기술이 유용함
📌 Docker 이해하기
📣 Docker 란?
- 컨테이너를 기반으로 하는 오픈소스 가상화 플랫폼
- 컨테이너의 개념이 정립된 이후, 컨테이너를 보다 쉽게 생성, 관리할 수 있도록 등장함
- OS의 커널만 공유하여 컨테이너 생성
- OS 버전이나 하드웨어 사양에 관계없이 동일한 애플리케이션 실행 가능
- 컨테이너를 이미지 형태로 생성하고 관리 → A 서버에서 생성한 컨테이너 이미지를 B 서버에서도 쉽게 배포할 수 있음 (이식성 향상)
→ 애플리케이션을 배포, 테스트, 개발하는 데 유용한 도구로 개발 생산성을 높이고, 안정적으로 애플리케이션을 운용하는 것
📌 Docker Architecture 살펴보기
📣 Docker 핵심 구성 요소

🟠 Docker Daemon
- Docker API 요청을 수신하고 이미지, 컨테이너, 네트워크, 볼륨 같은 Docker Objects를 관리함
- Docker Client는 Daemon에게 명령어를 전달하고 Daemon이 명령어를 실행함
🟠 Docker Client
- 도커 사용자가 docker run, docker build, docker pull 등의 명령어를 사용해 도커와 상호작용하는 주요 수단
- 이러한 명령어들은 도커 API를 사용해 Daemon에게 전달됨
🟠 Docker Registry
- Docker Images를 저장함
- 종류
- Public Registry : 누구나 사용할 수 있는 공개 저장소 (ex. Docker Hub)
- Private Registry : 특정 조직이나 사용자만 사용할 수 있는 비공개 저장소
🟠 Docker Objects
- 도커에서 생성하고 사용하는 이미지, 컨테이너, 네트워크, 볼륨 등의 기타 개체
- 이미지 (images)
- 애플리케이션을 실행하는 데 필요한 모든 파일, 구성 및 설정을 포함하는 읽기 전용 파일 시스템 → 변경 불가
- 컨테이너를 생성하는데 사용됨
- 컨테이너 (Containers)
- 도커 이미지를 실행한 상태
- 별도의 실행 환경을 제공, 호스트 운영 체제와 격리되어 있음
- 컨테이너 상태각 변경될 수 있음
- 컨테이너 상태가 바뀌거나 삭제되더라도 이미지는 변하지 않고 그대로 남아있음