컨테이너와 이미지란?
컨테이너는 애플리케이션 실행에 필요한 것들만 격리된 상자 안에 담아서 돌리는 방식입니다. 같은 컴퓨터 안에서 여러 프로그램을 동시에 돌리다 보면 서로 필요한 라이브러리 버전이 다르거나 포트가 겹치는 등 충돌이 생기기 쉬운데, 컨테이너는 이런 충돌을 막아줍니다.
왜 격리가 필요할까
비유하자면 원룸에서 여러 명이 냉장고 하나를 같이 쓰는 상황과 비슷합니다. 누가 뭘 넣었는지, 유통기한이 언제인지 서로 섞이면 곤란하겠죠. 컨테이너는 각자에게 자기만의 냉장고(파일시스템, 네트워크, 프로세스 공간)를 하나씩 나눠주는 셈입니다.
가상머신(VM)과 뭐가 다를까
VM은 컴퓨터 한 대 안에 컴퓨터를 통째로 하나 더 만드는 방식이라 자신만의 OS 커널을 가집니다. 반면 컨테이너는 호스트의 커널을 그대로 빌려 쓰고, 프로세스 수준에서만 격리합니다. 그래서 훨씬 가볍고 빠릅니다.
| 구분 | 가상머신(VM) | 컨테이너 |
|---|---|---|
| 격리 단위 | OS 전체 | 프로세스 |
| 용량 | 수 GB | 수십~수백 MB |
| 시작 속도 | 분 단위 | 초 단위 |
| 커널 | 자기 커널 따로 가짐 | 호스트 커널 공유 |
이미지란?
이미지는 컨테이너를 실행하는 데 필요한 모든 걸 담아둔 파일입니다. 붕어빵 틀과 붕어빵 사이의 관계로 생각하면 됩니다. 이미지가 틀이고, 그 틀로 찍어낸 결과물이 컨테이너입니다.
Next.js 앱을 돌리려면 node 환경이, Django 앱을 돌리려면 Python 환경이 필요한데, 이런 기본 환경이 이미 다 준비된 이미지를 Docker Hub에서 그냥 내려받아 쓸 수 있습니다. 바닥부터 환경을 만들 필요가 없습니다.
이미지는 레이어로 쌓여있다
이미지 하나는 사실 여러 개의 "레이어"가 겹겹이 쌓인 형태입니다. 그래서 이미지를 받을 때 여러 파일이 순서대로 다운로드되는 걸 볼 수 있고, 이미지를 여러 개 받다 보면 저장공간이 금방 부족해질 수 있습니다.
docker image ls # 받아둔 이미지 목록 확인
docker image rm <이미지명> # 안 쓰는 이미지 삭제참고: 개인 Notion 학습 노트