4 minute read

도커(Docker)는 애플리케이션을 컨테이너 단위로 패키징하고 실행할 수 있게 해주는 플랫폼이다. 코드, 라이브러리, 설정 같은 실행 환경을 하나로 묶어서 어느 환경에서든 동일하게 실행할 수 있도록 해준다.

컨테이너와 VM

VM

VM(Virtual Machine)은 하이퍼바이저 위에서 가상의 하드웨어를 만들고, 그 위에 Guest OS를 포함해 실행하는 방식이다.

  • 운영체제 전체를 포함
  • 자원 사용량 많음
  • 무겁고 느림
  • 격리 수준 높음

컨테이너

컨테이너는 호스트 OS의 커널을 공유하면서 애플리케이션을 격리된 프로세스 형태로 실행한다.

  • OS 미포함
  • 가볍고 빠름
  • 배포 용이

차이

구분 VM 컨테이너
구조 OS 포함 커널 공유
속도 느림 빠름
크기 큼 작음

도커 내부 구조

도커는 여러 계층으로 구성된다.

  1. dockerd
    사용자 인터페이스, containerd와 통신

  2. containerd
    컨테이너 lifecycle, 이미지 관리

  3. runC
    실제 컨테이너 실행 (OCI runtime)

흐름:


Docker CLI → dockerd → containerd → runC → container process

Docker Compose

여러 컨테이너를 하나의 서비스로 정의하고 실행하는 도구이다.

Docker Compose를 사용하는 이유

여러 컨테이너를 각각 실행하면 관리가 어려워진다.

예:

  • web
  • db
  • redis

→ 각각 docker run 필요

→ 설정 중복 + 순서 문제

해결:

  • YAML로 정의
  • 한번에 실행

docker-compose up


Docker Compose 동작

  • YAML 읽음
  • dockerd 호출
  • 컨테이너 생성

도커 네트워크

컨테이너는 기본적으로 서로 격리되어 있다.
통신하려면 네트워크가 필요하다.

컨테이너 통신

같은 네트워크에 있으면 이름으로 접근 가능


db:3306

도커 네트워크 내부 동작

도커 네트워크는 리눅스 네트워크 기능 기반으로 동작한다.

핵심 4가지:

  • Network Namespace
  • veth
  • bridge
  • NAT

1. Network Namespace

컨테이너는 각각 독립된 네트워크 공간을 가진다.

  • IP
  • 포트
  • 인터페이스

완전히 분리됨

2. veth pair

컨테이너와 호스트 연결


container eth0 ↔ veth ↔ docker0

  • 항상 쌍으로 존재
  • 하나는 컨테이너
  • 하나는 호스트

3. bridge (docker0)

도커 기본 브리지

  • 가상 스위치 역할
  • 여러 컨테이너 연결

container1 ─┐
├─ docker0
container2 ─┘

4. NAT (iptables)

외부 통신 처리

  • 컨테이너 → 외부: SNAT
  • 외부 → 컨테이너: DNAT (포트포워딩)

localhost:8080 → container:80

패킷 흐름

컨테이너 → 컨테이너


container A
→ veth
→ docker0
→ veth
→ container B

컨테이너 → 외부


container
→ veth
→ docker0
→ iptables (NAT)
→ host NIC
→ internet

도커 네트워크 종류

도커는 컨테이너 통신 방식에 따라 여러 네트워크 드라이버를 제공한다. 대표적으로 많이 쓰는 네트워크는 bridge, host, none, overlay 이다.

bridge

bridge 는 가장 기본적으로 많이 사용하는 네트워크다.
같은 호스트 안에서 실행되는 컨테이너들을 가상 브리지에 연결해 통신하게 한다.

기본적으로 단일 서버에서 여러 컨테이너를 함께 실행할 때 사용한다.

특징:

  • 같은 호스트 내 컨테이너 간 통신에 사용
  • 가장 일반적인 네트워크 방식
  • 컨테이너마다 독립된 IP를 가짐
  • 포트 매핑을 통해 외부 접근 가능

예를 들어 웹 서버 컨테이너와 DB 컨테이너를 하나의 서버에서 함께 띄울 때 적합하다.

host

host 는 컨테이너가 호스트의 네트워크를 그대로 사용하는 방식이다.
즉, 컨테이너가 별도의 네트워크를 가지지 않고 호스트 네트워크에 직접 붙어서 동작한다.

특징:

  • 별도의 포트 매핑이 거의 필요 없음
  • 네트워크 성능 손실이 적음
  • 호스트와 포트를 공유함
  • 격리 수준이 낮음

성능이 중요하거나 포트 포워딩 없이 바로 테스트하고 싶을 때 사용할 수 있다.
반대로 호스트와 포트 충돌이 날 수 있다는 점은 주의해야 한다.

none

none 은 네트워크를 아예 사용하지 않는 방식이다.
컨테이너가 외부와 통신하지 않도록 완전히 분리할 때 사용한다.

특징:

  • 네트워크 인터페이스가 거의 없음
  • 외부와 통신 불가
  • 완전한 격리 상태

보안 테스트나 네트워크가 필요 없는 특수한 작업용 컨테이너에서 사용할 수 있다.

overlay

overlay 는 여러 호스트에 걸쳐 실행되는 컨테이너들을 하나의 네트워크처럼 연결하는 방식이다.
주로 Docker Swarm 같은 클러스터 환경에서 사용한다.

특징:

  • 여러 서버의 컨테이너를 하나의 네트워크로 연결
  • 멀티 호스트 환경 지원
  • 클러스터 환경에 적합
  • Docker Swarm에서 자주 사용

즉, 단일 서버를 넘어서 여러 노드에서 실행되는 컨테이너들이 서로 통신해야 할 때 사용한다.

네트워크 종류 정리

네트워크 설명
bridge 같은 호스트 내 컨테이너 통신
host 호스트 네트워크 직접 사용
none 네트워크 비활성화
overlay 여러 호스트 간 컨테이너 연결

Compose 네트워크

Compose는 자동으로 네트워크 생성


project_default

서비스 이름으로 통신 가능


web → db

DNS 자동 제공됨

정리

  • 컨테이너는 namespace로 격리됨
  • veth로 연결됨
  • bridge가 스위치 역할
  • NAT로 외부 통신 처리
  • Compose는 네트워크 자동 구성

Leave a comment