Docker
Docker는 container 형태의 애플리케이션을 구축, 테스트 및 배포할 수 있는 소프트웨어 플랫폼입니다.
Container
container는 application과 그 실행에 필요한 모든 것(code, runtime, library, 설정 등)을 하나의 독립된 패키지로 묶은 것입니다.
쉽게 말하면, container는 “이 앱은 어디서든 똑같이 실행된다”를 보장하는 기술입니다.
VM vs Container
VM은 각 application마다 완전한 Guest OS가 필요하지만, container는 Host OS의 kernel을 공유하기 때문에 훨씬 가볍습니다.


Container 사용 이유
- 환경 일관성
- 동일한 환경에서 개발/테스트/운영 되므로 Library 버전이나 OS 차이로 발생하는 문제가 없음.
- 자원 효율
- Guest OS 없이 Host OS의 Kernel을 공유하기 때문에 같은 서버에서 VM보다 훨씬 많은 application을 동시에 실행할 수 있음.
- 프로세스 격리
- Python2를 사용하는 application과 Python3를 사용하는 application을 충돌 없이 같은 서버에서 실행할 수 있음.
- 빠른 배포
- VM에 비해 시작 시간이 월등히 빠름 (few seconds…)
- 따라서 traffic이 급증하면 container를 즉시 복제해 수평 확장할 수 있음.
- 이식성
- Docker Image만 있다면 local, AWS, GCP, Azure 어디서든 동일하게 실행.
- Cloud 이전이 훨씬 쉬워짐.
- 수평 확장
- traffic에 따라 container 수를 자동으로 늘리고 줄이는 auto-scaling이 가능.
Docker Architecture
- Docker는 Client-Server architecture를 사용하고 있으며, Client와 Server가 REST API를 통해 통신합니다.
- Docker Client
- Docker CLI
- “docker” Command를 의미하며, Docker daemon에 command를 전송합니다.
- 기본적으로 Docker Client와 Docker Host는 동일 Host에서 실행되어 Unix Socket으로 communication하지만, Docker Client를 원격 Docker Host에 TCP/IP로 연결 할 수도 있습니다.
- Docker CLI
- Docker Host
- Docker Daemon (dockerd)
- Host Machine에서 Background로 실행되는 핵심 서버 프로세스입니다.
- Client의 요청을 받아 아래 자원들을 관리합니다.
- Images
- Containers
- Volumes
- Networks
- Images
- Docker에 포함된 Local image repository입니다.
- Containers
- Docker Daemon (dockerd)
- Registry
- Docker Hub와 같은 Public Repository 혹은 별도의 Private Repository가 될 수 있음.

