백엔드 개발자
도커 본문
도커는 컨테이너 기반 가상화를 제공한다. 가상화란 무엇인가?
가상화는 물리적인 하드웨어를 논리적으로 분리하여 여러 운영 체제나 애플리케이션을 독립적으로 실행할 수 있도록 하는 기술이다.
- 하이퍼바이저 기반 가상화
- 하드웨어 위에 하이퍼바이저(예: VMware, Hyper-V)를 설치해 각 가상 머신(VM)이 독립된 운영 체제를 실행할 수 있도록 한다.
- 장점: 각 VM이 완전한 운영 체제를 포함해 높은 격리성과 호환성을 제공한다.
- 단점: 무겁고, 많은 리소스를 소모한다.
- OS 수준 가상화 (컨테이너)
- 호스트 운영 체제 위에서 컨테이너를 실행하며, 커널을 공유하지만 애플리케이션과 라이브러리는 독립적으로 실행된다.
- 장점: 경량화되어 빠르게 시작되고, 리소스 소모가 적다.
- 단점: 같은 운영 체제 커널을 사용하므로 호환성은 제한적이다.
도커에서 컨테이너를 제공하는 방법
도커는 리눅스 커널의 namespace와 cgroups를 활용하여 격리된 컨테이너 환경을 만든다.
- Namespace:
- 각 컨테이너가 독립된 프로세스, 네트워크, 파일 시스템을 가지는 것처럼 보이게 만든다.
- 예: 컨테이너 A와 B는 동일한 파일 경로(/tmp)를 사용할 수 있지만, 서로의 데이터를 볼 수 없다.
- cgroups:
- CPU, 메모리 등 하드웨어 자원을 컨테이너별로 제한하고 관리한다.
- 예: 컨테이너가 무한히 많은 메모리를 사용하는 것을 방지.
결론적으로 도커는 가볍고 빠른 가상화를 제공하며, 애플리케이션 실행 환경을 간단히 배포할 수 있게 한다.
컨테이너 구조와 동작 원리
컨테이너
컨테이너는 애플리케이션과 실행에 필요한 모든 것을 포함한 경량화된 실행 환경이다. 실행 환경이 표준화되어 있어 어디에서나 동일하게 동작한다.
도커 이미지와 컨테이너의 관계
- 도커 이미지는 컨테이너를 실행하기 위한 템플릿이다. 애플리케이션 코드와 종속성, OS 라이브러리를 포함한다.
- 컨테이너는 이 이미지를 기반으로 실행되는 인스턴스이다. 즉, 컨테이너 내부에는 해당 이미지가 포함되어 실행된다.
컨테이너를 생성할 때 이미지를 읽어들여 쓰기 가능한 레이어를 추가한다. 이 레이어는 컨테이너가 실행되는 동안 변경 사항을 기록한다.
멀티스테이지 빌드
멀티스테이지 빌드는 최종 이미지를 간결하고 작게 유지하기 위해 사용된다.
- 예를 들어, 빌드 도구와 의존성은 애플리케이션 컴파일에만 필요하며 실행 시 필요하지 않는다.
- 멀티스테이지 빌드를 사용하면 빌드 단계에서만 필요한 파일을 제외하고 최종 실행 파일만 포함할 수 있다.
# Example of Multi-stage Build
FROM golang:1.18 AS builder
WORKDIR /app
COPY . .
RUN go build -o main .
FROM alpine:latest
WORKDIR /root/
COPY --from=builder /app/main .
CMD ["./main"]
이 방식은 불필요한 파일을 제외하여 이미지 크기를 최소화하고 배포 속도를 높인다.
도커 네트워크
컨테이너는 서로 통신하거나 외부와 연결해야 할 경우가 많다.
기본적으로 도커는 브릿지 네트워크를 사용하지만, 사용 사례에 따라 다른 네트워크를 설정할 수 있다.
네트워크를 분리해야 하는 이유
- 보안:
- 민감한 데이터를 처리하는 데이터베이스 컨테이너는 외부에 노출되지 않도록 내부 네트워크로 제한할 수 있다.
- 예: 웹 서버와 데이터베이스 서버를 분리하여 외부 공격으로부터 보호.
- 트래픽 관리:
- 여러 컨테이너가 있는 환경에서 불필요한 트래픽 혼잡을 방지한다.
- 예: 로드 밸런서를 통해 특정 컨테이너만 외부 요청을 받도록 설정.
- 다중 호스트 통신:
- 클러스터링 도구(Kubernetes, Swarm)에서 컨테이너가 여러 서버에 분산될 때 필요한 연결을 설정.
주요 네트워크 드라이버와 사용 사례
- Bridge:
- 단일 호스트 내에서 컨테이너 간 통신을 제공한다.
- 기본적으로 외부 네트워크와 연결되며, 포트 매핑을 통해 접근 가능하다.
- Host:
- 컨테이너가 호스트의 네트워크를 직접 사용한다. 성능이 중요한 애플리케이션에서 유용하다.
- None:
- 컨테이너를 네트워크에서 완전히 분리한다. 독립적인 작업에 적합하다.
- Overlay:
- 여러 호스트 간의 컨테이너 통신을 지원한다. 클러스터 환경에서 사용된다.
- Macvlan:
- 컨테이너에 고유한 IP 주소를 부여하여 물리적 네트워크와 직접 통신할 수 있게 한다.
네트워크 설정 예시
- 데이터베이스 컨테이너를 내부 네트워크에만 노출:
docker network create internal-network
docker run --network=internal-network --name db-container mysql
- 웹 서버 컨테이너를 외부와 연결:
docker run --network=bridge -p 80:80 --name web-container nginx
Comments