Post

02 Docker

02 Docker

1. Note

1. Note

  • 다시 복습!

2. VM / Docker

1. VM / Docker / Container

  • VM → OS 단위로 가상화 / 하나의 VM = 독립된 컴퓨터 1대
  • Docker → 컨테이너를 만들고 실행하는 도구(플랫폼)
  • Container → 애플리케이션 실행 단위 (격리된 프로세스)

2. 비교

기준VMContainer
가상화 대상OS프로세스
OS 포함 여부포함 (각 VM마다)없음 (커널 공유)
격리 수준OS 단위 (강함)프로세스 단위
무게무거움가벼움
실행 속도느림 (부팅 필요)빠름 (즉시 실행)

3. 구조 차이

  • VM 구조
    1
    2
    3
    4
    
    물리 서버 
    └─ VM
    └─ OS
      └─ App (직접 설치)
    
  • 도커 사용패턴
    1
    2
    3
    4
    5
    
    물리 서버 (클라우드/온프레 등)
    └─ VM (☆) # VM 없이 바로 사용함. 설비를 어떻게 했는지 차이
    └─ Host OS (Linux 등)
      └─ Docker Engine (☆)
        └─ Container(☆)
    

4. 가상화 영역

  • 실제로는 하나인데, 여러 개처럼 보이게 만드는 것
  • 가상화 구분

    구분실제가상으로 보이는 것
    VMOS 1개OS 여러 개
    ContainerOS 1개여러 개의 독립된 실행 환경
  • 비교
    • VM (OS 가상화)
      • OS가 따로 있음 (Ubuntu, Windows 등)
      • 커널도 따로 있음
      • 재부팅 가능
      • 완전히 다른 컴퓨터 느낌
    • Container (프로세스 환경 가상화)
      • / 루트 디렉토리가 따로 있음
      • ps 찍으면 자기 프로세스만 보임
      • 포트도 따로 씀
      • 다른 컨테이너 안 보임

5. Container의 이점

1. 환경 일관성

  • 주요 문제
    • 로컬에서는 가능하지만, 서버에서 안되는 경우 발생함.
    • OS 차이 / 라이브러리 버전 차이 / 설정 누락
  • Container의 이점
    • 이미지에 모든 환경이 담겨있어서 이미지 하나로 어디서든 동일 실행
    • 클라우드 변경, 또는 다른 시스템에서 진행해도 동일한 조건이 됨.

2. 빠른 배포 & 롤백

  • 주요 문제
    • 서버 접속 → 파일 복사 → 설정 변경 → 재시작
    • 의미 없는 반복적인 작업 필요함
  • Container의 이점
    • 이미지 pull → 컨테이너 실행
    • CI 단계에서 공통 이미지를 만들고 CD에서는 컨테이너를 실행으로 분리.

3. 확장성

  • 주요 문제
    • VM에서는 트래픽이 몰리면 VM을 계속 증설 필요함
    • 하드웨어 성능에 따라서 무한히 증설이 불가능함.
  • Container의 이점
    • 트래픽 증가하면 컨테이너를 복제해서 확장함

4. 자원 효율성

  • 주요문제
    • VM이 늘어날때마다 OS도 증가하여 메모리 차지
    • 불필요한 메모리 낭비가 많음
  • Container의 이점
    • 커널을 공유하여 사용함
    • 컨테이너로 필요한 것(AP 등)만 실행하여 메모리 감소

3. Docker

1. Docker란?

  • 컨테이너 기술을 활용하여 애플리케이션을 실행하는 플랫폼
  • 가상 머신과 비교하여 가볍고 빠른 환경 제공

2. Docker의 핵심 개념

1. 이미지 (Image)

  • 컨테이너 실행을 위한 설계도 (immutable)
  • 애플리케이션 + 라이브러리 + 실행환경 포함
  • 변경 불가능 (새로 만들면 됨)
    • Spring Boot + JDK + 설정 등으로 이미지마다 다르게 구성
    • 재사용가능

2. 컨테이너 (Container)

  • 실행 중인 독립된 환경
  • 이미지를 실행한 실제 인스턴스
  • 프로세스 단위 실행

3. Dockerfile

  • 컨테이너를 정의하는 설정 파일
  • 이미지를 만드는 설계 스크립트
    1
    2
    3
    
     FROM openjdk:17
     COPY app.jar app.jar
     ENTRYPOINT ["java", "-jar", "app.jar"]
    

4. Volume

  • 컨테이너 외부에 데이터를 저장하는 공간
  • 컨테이너는 기본적으로 휘발성
    • DB등의 중요한 데이터들은 사라지면 문제가 됨.
    • 데이터를 Host 또는 별도 영역에 저장

5. Network

  • 컨테이너 간 통신
  • 컨테이너 이름으로 통신 가능
  • 내부 DNS 제공

6. Registry

  • 이미지를 저장하는 저장소
  • Docker Hub, Private Registry
  • 흐름
    1
    2
    3
    
    build → push → pull → run
    # CI 과정에서 빌드를 하면 빌드된 파일은 이미지 레지스트리에 Push
    # 디플로이할때 이미지 레지스트리에서 Pull하고 Run을 시키게됨  
    

3. Docker Architecture

내 그림

  • Docker Client (CLI, REST API, UI)
    • 사용자가 Docker와 상호작용할 수 있도록 명령을 전달하는 인터페이스
    • CLI(Command Line Interface) 또는 REST API를 사용하여 컨테이너를 실행하거나 관리할 수 있음
  • Docker Daemon (dockerd)
    • Docker의 핵심 엔진으로, 컨테이너와 이미지를 관리하는 역할
    • Clinet 로 부터 명령을 받아 컨테이너 생성, 네트워크 관리, 스토리지 할당 등을 처리
  • Docker Images
    • 컨테이너를 실행하는 데 필요한 파일 시스템과 애플리케이션 코드가 포함된 템플릿
    • Layer 기반의 구조로, 같은 이미지에서 여러 개의 컨테이너 생성 가능
  • Containers
    • 독립적으로 실행되는 애플리케이션 인스턴스
    • 각 컨테이너는 자체 파일 시스템과 네트워크 인터페이스를 가지며, 다른 컨테이너와 격리됨
    • docker run 명령으로 생성 가능
  • Docker Registry (Docker Hub, Private Registry)
    • Docker 이미지를 저장하고 배포하는 서비스
    • Docker Hub(공개), Amazon ECR, Google GCR 등의 사설 레지스트리를 사용 가능
    • docker pull 또는 docker push 명령으로 이미지를 업로드/다운로드
  • Storage & Networking
    • Storage: 컨테이너의 데이터를 지속적으로 저장하기 위해 Volumes, Bind Mounts, Tmpfs 사용
    • Networking: 브리지(Bridge), 호스트(Host), 오버레이(Overlay) 등의 네트워크 드라이버를 통해 컨테이너 간 통신을 제공

4. Docker 기본명령어

1
2
3
4
5
6
7
8
9
10
11
  # 현재 시스템에서 사용 가능한 모든 Docker 이미지 목록 확인
  $ docker images
  
  # 특정 이미지 다운로드
  $ docker pull <이미지 이름>
  
  # 이미지 정보 확인
  $ docker inspect <이미지 이름>
  
  # 이미지 삭제
  $ docker rmi <이미지 이름>

5. 컨테이너 관련

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  # 컨테이너 실행 (제일 중요)
  docker run -d -p 8080:80 nginx
  
  # 실행 중 컨테이너 조회
  docker ps
  # 전체 컨테이너 조회
  docker ps -a
  # 컨테이너 정지
  docker stop <컨테이너ID>
  
  # 컨테이너 재시작
  docker start <컨테이너ID>
  
  # 컨테이너 삭제
  docker rm <컨테이너ID>

4. Docker Compose

1. Docker Compose

  • 여러 개의 컨테이너를 하나의 서비스로 관리하는 도구
  • YAML 파일로 컨테이너 정의 및 실행 가능
  • 개발 및 배포 환경에서 다중 컨테이너 애플리케이션을 쉽게 설정할 수 있습니다

2. 기본구조

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  version: "3.8"
  
  services: # 컨테이너 정의 영역
    app:
      build: .
      ports:
        - "8080:8080"
      depends_on:
        - db
  
    db:
      image: mysql:8
      environment:
        MYSQL_ROOT_PASSWORD: root
        MYSQL_DATABASE: test
      ports:
        - "3306:3306"

3. 주요 명령어

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  # 전체 실행(최신버전은 하이픈이 없음)
  docker-compose up
  docker compose up
  
  # 백그라운드 실행
  docker compose up -d
  
  # 종료
  docker compose down
  
  # 로그 확인
  docker compose logs
  docker compose logs app # 특정서비스 실행
  
  # 재빌드
  docker compose up --build
This post is licensed under CC BY 4.0 by the author.