도커란?
도커(Docker)는 애플리케이션을 컨테이너 단위로 패키징하고 실행할 수 있게 해주는 플랫폼이다. 코드, 라이브러리, 설정 같은 실행 환경을 하나로 묶어서 어느 환경에서든 동일하게 실행할 수 있도록 해준다.
컨테이너와 VM
VM
VM(Virtual Machine)은 하이퍼바이저 위에서 가상의 하드웨어를 만들고, 그 위에 Guest OS를 포함해 실행하는 방식이다.
- 운영체제 전체를 포함
- 자원 사용량 많음
- 무겁고 느림
- 격리 수준 높음
컨테이너
컨테이너는 호스트 OS의 커널을 공유하면서 애플리케이션을 격리된 프로세스 형태로 실행한다.
- OS 미포함
- 가볍고 빠름
- 배포 용이
차이
| 구분 | VM | 컨테이너 |
|---|---|---|
| 구조 | OS 포함 | 커널 공유 |
| 속도 | 느림 | 빠름 |
| 크기 | 큼 | 작음 |
도커 내부 구조

도커는 여러 계층으로 구성된다.
-
dockerd
사용자 인터페이스, containerd와 통신 -
containerd
컨테이너 lifecycle, 이미지 관리 -
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