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