도커의 기본 개념들
컨테이너(Container)
컨테이너는 애플리케이션과 그 실행 환경을 하나로 묶어 격리된 환경에서 실행하는 경량화된 가상화 기술입니다.
컨테이너는 컨테이너는 읽기 전용 이미지(Read-only Image)와 쓰기 가능한 레이어(Writable Layer)의 결합으로 작동하며, 리눅스의 네임스페이스와 cgroup을 활용해 리소스를 격리합니다.
컨테이너의 핵심 요소
파일 시스템(Filesystem): 이미지에서 가져오는 읽기 전용 계층과 컨테이너 생성 시 추가되는 쓰기 가능한 계층.
리소스 격리: 리눅스 네임스페이스 및 cgroup으로 프로세스, 메모리, 네트워크 등을 격리.
네트워킹(Networking): 독립된 네트워크 스택과 IP 주소를 갖는 가상 네트워크 인터페이스.
프로세스(Process): 각 컨테이너는 자체 프로세스 트리를 갖고 있으며, 외부와 독립적.
컨테이너 실행 흐름
사용자가 docker run 명령어를 실행.
도커 데몬이 요청을 받아 이미지를 기반으로 컨테이너 생성.
네임스페이스, cgroup을 통해 리소스를 격리.
쓰기 가능한 레이어가 생성되고, 애플리케이션이 실행됨.
1. 읽기 전용 이미지란?
이미지(Image)는 컨테이너를 생성하는 데 필요한 설정 파일, 라이브러리, 실행 환경을 포함한 정적 템플릿입니다.
이미지는 읽기 전용입니다. 실행 중 컨테이너가 변경사항을 기록하더라도 원본 이미지는 수정되지 않습니다.
이미지의 생성 과정
1. Dockerfile 사용
이미지는 Dockerfile이라는 스크립트를 기반으로 생성됩니다.
Dockerfile은 애플리케이션 환경을 명시적으로 정의합니다.
# Ubuntu를 기반으로 하는 이미지 생성 FROM ubuntu:20.04 # curl 패키지 설치 RUN apt-get update && apt-get install -y curl # 실행 명령 정의 CMD ["echo", "Hello, Docker!"]
2. 이미지 빌드
명령어 docker build로 Dockerfile을 실행하여 이미지를 생성합니다.
이미지 내부에는 아래와 같은 요소들이 포함됩니다.
운영체제의 핵심 파일들 (예: Ubuntu의 libc, /bin/bash)
애플리케이션 코드 (예: Python 스크립트)
라이브러리 및 종속성 (예: Python 패키지, Curl)
예: 위 Dockerfile로 생성된 이미지는 ubuntu:20.04 기반 운영체제와 curl을 포함합니다.
2. 레이어
컨테이너 이미지는 여러 레이어(Layer)로 구성됩니다.
레이어의 특징
UnionFS: 도커는 UnionFS를 사용해 레이어를 합칩니다.
예: 아래 Dockerfile로 생성된 이미지는 다음과 같은 레이어를 형성합니다.
쓰기 가능한 레이어FROM ubuntu:20.04 -> 레이어 1: Ubuntu 기본 파일 시스템 RUN apt-get install curl -> 레이어 2: Curl 설치
컨테이너가 실행되면 쓰기 가능한 임시 레이어가 생성됩니다.
실행 중 변경 사항(파일 추가, 삭제 등)은 이 레이어에 저장됩니다.
컨테이너가 종료되면 이 레이어는 사라집니다.
레이어의 효율성
중복 제거: 동일한 이미지를 사용하는 컨테이너는 읽기 전용 레이어를 공유합니다.
빌드 속도: 기존 레이어를 캐시로 활용해 빌드 시간을 단축합니다.
이미지와 컨테이너의 관계
이미지는 컨테이너 생성의 템플릿 역할을 하며, 정적이고 읽기 전용입니다. 컨테이너는 이미지의 실행 가능한 인스턴스입니다.
데이터의 흐름
컨테이너 실행 전
이미지는 읽기 전용 상태로 저장됩니다.
컨테이너 실행
쓰기 가능한 레이어가 생성되어 변경 사항 기록.
데이터 유지
데이터 지속성을 위해 볼륨을 사용합니다.
예: docker run -v /data:/app/data my-app
이 모든 과정을 하나의 큰 그림으로 이해한다면 아래와 같습니다:
이미지는 애플리케이션 환경을 정의합니다.
컨테이너는 이미지를 기반으로 실행됩니다.
컨테이너 내부 격리는 네임스페이스로 구현되며, 리소스는 호스트와 공유합니다.
CI/CD는 컨테이너를 통해 일관된 환경에서 빌드, 테스트, 배포를 자동화합니다.
도커 허브(Docker Hub)
Docker Hub는 도커 이미지를 관리하고 공유하는 클라우드 기반 저장소입니다.
공식 이미지, 커뮤니티 이미지, 사용자 정의 이미지를 포함합니다.
주요 기능
이미지 저장 및 배포
docker push를 통해 이미지를 업로드.
공식 이미지 제공
NGINX, MySQL 등 검증된 이미지를 제공.
이미지 검색 및 다운로드
예: docker pull python:3.10