노트

컨테이너와 이미지

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로 누가 붙잡고 있는지 찾는 절차.

  • Terraform

    Terraform은 클라우드와 온프렘 리소스를 사람이 읽는 설정 파일로 만들고, 바꾸고, 버전 관리하는 IaC(Infrastructure as Code) 도구다. 콘솔에서 클릭해 만들던 서버·스토리지·DNS 레코드를 코드로 적어 두면 같은 파일로 같은 인프라를 다시 만들 수 있고, 설정 파일을 git 같은 버전 관리 시스템에 올려 변경 이력을 남길 수 있다.

  • Kafka

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

보기 옵션