Docker는 애플리케이션을 컨테이너(Container) 형태로 패키징하고 실행하는 플랫폼
코드+라이브러리+실행 환경을 하나로 묶어서 어디서든 동일하게 실행되도록 만듬.

컨테이너란?
- 프로세스 격리기술(Linux namespace + cgroup 기반) >>> "가볍고 빠른 가상 서버" 가 된다고 생각하면 된다.
- VM처럼 보이지만 OS를 통째로 가상화하지 않음
- 가볍고 빠르다
*namespace = 프로세스가 시스템 자원을 독립된 공간처럼 보이게 만드는 커널 기능
*cgroup은 "사용 가능한 자원"을 제한하는 기능
eg)docker run -m 512m --cpus="1.5" nginx
VM 과 Docker 차이
구분VMDocker
| 가상화 대상 | 하드웨어 | OS 커널 |
| 부팅 속도 | 느림 (OS 필요) | 즉시 실행 |
| 리소스 사용 | 큼 | 작음 |
| 구조 | Hypervisor 위 Guest OS | Host OS 위 컨테이너 |
#Docker는 OS커널을 공유
VM은 각자 OS를 따로 가짐.
Docker 구성 요소
1. Docker Engine
- docked(데몬)
- container runtime
- REST API
2. Image
- 실행 가능한 템플릿
- 계층 구조
Image Container
| 설계도 | 실행 중인 인스턴스 |
| 변경 불가 | 실행 상태 |
| 저장 가능 | 종료/삭제 가능 |
Docker가 해결하는 문제
- "내 PC에서는 되는데 서버에서는 안됨" 문제 해결
- 의존성 충돌 제거
- CI/CD 자동화 기반 제공
- 마이크로서비스 환경 구축
여기서 마이크로 서비스 환경 구축이란 말이 이해가 안될수도 있다.
예전에는 하나의 코드, 하나의 배포단위, 하나의 서버 프로세스 로 일부기능만 수정해도 전체 재배포 하거나 장애나면 전체가 다운이 되었다. 이런 문제를 극복하기 위해
독립된 프로세스, 독립된 배포, 독립된 확장
기능 단위로 서비스를 쪼개서 각각 독립적으로 운영하는 아키텍쳐 인것이다.
[ 하나의 애플리케이션 ]
├─ 로그인
├─ 게시판
├─ 결제
└─ 관리자
이 구조를 아래와 같이 변경한것이다.
[Auth Service]
[Board Service]
[Payment Service]
[Admin Service]
서비스환경
| Auth | Node 18 |
| Payment | Java 17 |
| AI 추천 | Python 3.10 |
이런식으로 사용하는 언어나 라이브러리 버전 런타임 환경이 다르면 충돌이 발생할수 있기때문에
Docker가 각 서비스를 컨테이너로 격리 하게 되는 것이다.