노트

컨테이너와 이미지

Containers and Images

인프라#docker · 연결된 개념 8개

쉽게 말하면

이미지는 붕어빵 틀, 컨테이너는 그 틀로 구운 붕어빵이에요. 앱에 필요한 런타임과 라이브러리까지 틀에 새겨 두니 노트북에서든 서버에서든 똑같이 구워져서 '내 컴퓨터에선 되는데'가 줄어요.

비유가 깨지는 곳 붕어빵과 달리 컨테이너는 호스트 OS 커널을 같이 쓰는 격리된 프로세스예요. 그래서 VM보다 가볍고 빨리 뜨지만 격리는 약하고, 안에 쓴 데이터는 컨테이너를 지우면 사라져요.

이미지는 앱 실행에 필요한 코드·런타임·라이브러리·설정을 묶은 읽기 전용 패키지이고, 컨테이너는 그 이미지를 실행한 격리된 프로세스다. 클래스와 인스턴스처럼 이미지 하나로 컨테이너를 여러 개 띄울 수 있다.

왜 쓰나

"내 컴퓨터에선 되는데"의 원인은 대개 실행 환경 차이(런타임 버전, OS 라이브러리, 환경변수)다. 컨테이너는 이 환경까지 통째로 묶어서, 노트북·CI·서버 어디서든 같은 방식으로 돈다.

VM과의 차이

  • VM(Virtual Machine, 가상 머신)은 게스트 OS를 통째로 올린다. 무겁고(GB 단위) 부팅이 느리다
  • 컨테이너는 호스트의 OS 커널을 공유하고 프로세스·파일시스템·네트워크만 격리한다. 가볍고(MB 단위) 거의 즉시 뜬다
  • 그래서 수십~수백 개를 띄웠다 지우는 오케스트레이션(orchestration, 쿠버네티스 핵심 개념)이 가능하다. 대신 커널을 공유하므로 격리 강도는 VM보다 약하다

기본 흐름

docker build -t app .          # Dockerfile로 이미지 만들기
docker run -d -p 3000:3000 app # 백그라운드 실행, 호스트 3000 → 컨테이너 3000
docker ps                      # 실행 중인 컨테이너
docker logs -f <id>
docker exec -it <id> sh        # 컨테이너 안으로
docker rm -f <id>              # 정지 + 삭제
docker tag app user/app:1.0 && docker push user/app:1.0   # 레지스트리(registry)에 올리기
  • 이미지는 레이어를 쌓아 만들고, 같은 레이어는 캐시·공유된다(Dockerfile: 레이어 캐시와 멀티 스테이지)
  • 컨테이너 안에 쓴 데이터는 컨테이너를 지우면 사라진다. 남길 데이터는 볼륨에 둔다
  • 컨테이너 하나에는 프로세스 하나(역할 하나)를 두고, 여러 컨테이너는 네트워크로 잇는다. 여러 개를 한 번에 정의할 때는 Docker Compose
  • 이미지를 만들어 레지스트리에 올리고 운영 환경이 그 이미지를 받아 쓰는 것이 일반적인 CI 파이프라인이다(GitLab CI/CD 파이프라인, GitOps)

출처: What is a container? · What is an image?

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • CPU 아키텍처와 네이티브 모듈

    CPU 아키텍처는 CPU가 실행하는 명령어 집합(Instruction Set Architecture, ISA)의 종류다. 서버와 PC에서는 x86-64와 ARM64 두 계열이 주로 쓰이고, 한 계열용으로 컴파일된 기계어는 다른 계열 CPU에서 실행되지 않는다. Node.js 프로젝트에서는 이 차이가 네이티브 모듈에서 드러난다.

  • 스프링 빈과 IoC 컨테이너

    스프링 빈은 스프링 IoC(Inversion of Control, 제어의 역전) 컨테이너가 만들고, 의존성을 연결하고, 생명주기(lifecycle)를 관리하는 평범한 자바 객체(POJO, Plain Old Java Object)다. 컨테이너(ApplicationContext)는 이 빈들을 담는 공간이고, 내가 new로 만든 객체는 컨테이너가 모른다.

  • 운영 Node 프로세스의 메모리 누수 찾기

    살아 있는 Node 서버에 inspector를 붙이고, 힙 스냅샷 두 장을 비교해 무엇이 쌓이는지, retainer로 누가 붙잡고 있는지 찾는 절차.

  • Kafka

    Kafka는 이벤트(메시지)를 디스크의 추가 전용 로그(append-only log)에 쌓아 두고, 여러 소비자가 각자 읽은 위치를 기억하며 꺼내 가게 하는 분산 이벤트 스트리밍 플랫폼(distributed event streaming platform)이다. 흔히 메시지 큐(message queue)라고 부르지만 동작은 큐보다 로그에 가깝다.

  • 커넥션 드레이닝과 무중단 재시작

    배포 중 서버를 재시작하는 몇 초 동안 로드밸런서가 그 서버로 요청을 보내면 502가 난다. 먼저 로드밸런서에서 빼고(드레이닝), 진행 중인 요청을 마친 뒤 재시작하고, 준비되면 다시 넣는다.

보기 옵션