RECENT POSTS

최근에 작성한 글

01 / 03

전체 글

전체 보기

[TIL] Docker, Docker Compose, CI/CD, Amazon ECS

오늘은 Docker의 기본 개념부터 Docker Compose, CI/CD, 그리고 AWS ECS까지 전체적인 컨테이너 배포 흐름을 정리했다.

🐳 Docker

❓ Docker는 언제 사용할까?

다음과 같은 상황에서 Docker를 사용하는 것이 효과적이다.

  • 일관된 개발 환경이 필요할 때
    • 개발자마다 환경이 달라도 동일한 컨테이너를 실행하기 때문에 환경 차이로 인한 오류를 줄일 수 있다.
  • 애플리케이션을 빠르게 배포하고 싶을 때
  • MSA(Microservice Architecture)를 구축할 때
  • CI/CD 파이프라인을 구성할 때
  • 리소스 효율을 높이고 싶을 때
  • 애플리케이션 간 격리가 필요할 때
  • 서비스를 쉽게 확장(Scaling)하고 싶을 때
  • Kubernetes와 함께 운영하고자 할 때

🤔 핵심 개념

📦 Image

Docker Image는 애플리케이션 실행에 필요한 모든 요소를 포함한 읽기 전용 템플릿이다.

이미지에는 다음과 같은 내용이 포함된다.

  • 애플리케이션 코드
  • Runtime
  • 라이브러리
  • 환경 변수
  • 설정 파일

즉, 컨테이너를 생성하기 위한 설계도(청사진) 역할을 한다.


🚀 Container

Container는 Docker Image를 실제로 실행한 상태이다.

이미지가 정적인 템플릿이라면 컨테이너는 동적으로 실행되는 환경이다.

특징

  • 독립된 공간에서 실행된다.
  • 필요한 모든 의존성을 포함한다.
  • 하나의 호스트에서 여러 컨테이너를 동시에 실행할 수 있다.

📝 Dockerfile

Dockerfile은 Docker 이미지를 생성하기 위한 스크립트 파일이다.

이미지를 만드는 과정을 코드로 작성하기 때문에

  • 이미지 생성 자동화
  • 일관된 환경 구성
  • 유지보수 용이

라는 장점이 있다.


☁️ Docker Hub

Docker Hub는 Docker 이미지를 저장하고 공유하는 공식 이미지 저장소(Registry) 이다.

필요한 이미지를 다운로드하거나 직접 만든 이미지를 업로드하여 사용할 수 있다.


💾 Volume

Volume은 컨테이너의 데이터를 영구적으로 저장하기 위한 기능이다.

컨테이너는 삭제되면 내부 데이터도 함께 삭제되지만,

Volume을 사용하면 데이터는 컨테이너와 분리되어 유지된다.

주로 사용하는 경우

  • Database 데이터
  • 로그 파일
  • 업로드 파일 저장

🌐 Network

Docker Network는 컨테이너 간 통신을 담당하는 기능이다.

기본적으로 Docker는 Bridge Network를 사용한다.


🌐 Docker Network 종류

1. Bridge Network

가장 기본적으로 사용되는 네트워크이다.

특징

  • 별도 설정이 없으면 자동으로 Bridge Network 사용
  • 같은 Bridge Network에 있는 컨테이너끼리 통신 가능
  • 외부와는 NAT(Network Address Translation)를 통해 통신
  • 단일 서버에서 여러 컨테이너를 연결할 때 적합

2. Host Network

컨테이너가 호스트의 네트워크를 그대로 사용한다.

장점

  • NAT를 거치지 않아 성능이 좋다.

단점

  • 네트워크 격리가 없다.
  • 포트 충돌 가능성이 있다.
  • 보안상 위험할 수 있다.

3. Overlay Network

여러 Docker Host에 존재하는 컨테이너를 연결하기 위한 네트워크이다.

주로

  • Docker Swarm
  • Kubernetes

같은 오케스트레이션 환경에서 사용된다.

대규모 클라우드 환경이나 분산 시스템 구축 시 활용된다.


💻 Docker vs Virtual Machine

구분DockerVirtual Machine

동작 방식 호스트 OS 커널 공유 Guest OS 포함
시작 속도 매우 빠름(초 단위) 느림(분 단위 가능)
리소스 사용 가볍다 무겁다
이식성 높음 낮음
보안 격리 VM보다 약함 매우 강함
운영체제 호스트 OS와 같은 커널 사용 서로 다른 OS 실행 가능

📌 정리

Docker 장점

  • 빠른 실행 속도
  • 낮은 리소스 사용량
  • 높은 이식성
  • 배포가 간편

Docker 단점

  • 호스트 OS 커널에 의존한다.
  • VM보다 보안 격리가 약하다.

VM 장점

  • 완전한 운영체제 격리
  • 다양한 운영체제 실행 가능

VM 단점

  • 부팅 시간이 길다.
  • 리소스를 많이 사용한다.

🐙 Docker Compose

Docker Compose는 여러 개의 Docker 컨테이너를 하나의 파일로 정의하고 실행할 수 있도록 해주는 도구이다.

서비스 간의 의존성을 쉽게 관리할 수 있으며, 복잡한 환경을 간단하게 구성할 수 있다.


📜 Docker Compose 기본 구조

version: "3"

services:
  web:
    image: nginx
    ports:
      - "8080:80"

  app:
    build: .
    ports:
      - "8081:8080"
    depends_on:
      - db

  db:
    image: postgres
    environment:
      POSTGRES_PASSWORD: example

주요 옵션

  • version
    • Compose 파일 버전
  • services
    • 실행할 컨테이너들을 정의
  • image
    • 사용할 Docker 이미지
  • build
    • Dockerfile을 이용해 이미지 생성
  • ports
    • 포트 매핑
  • depends_on
    • 다른 서비스가 먼저 실행되도록 설정
  • environment
    • 환경 변수 설정

🔄 CI/CD

CI/CD는 빌드, 테스트, 배포를 자동화하는 개발 방식이다.


✔️ CI (Continuous Integration)

지속적인 통합을 의미한다.

개발자가 코드를 Push하면 자동으로

  • Build
  • Test
  • Code Quality 검사

등을 수행하여 오류를 빠르게 발견할 수 있다.

장점

  • 빠른 피드백
  • 코드 품질 향상
  • 버그 조기 발견

✔️ CD (Continuous Delivery / Continuous Deployment)

지속적인 배포를 의미한다.

테스트를 통과한 애플리케이션을 자동으로 운영 환경에 배포한다.

장점

  • 반복 작업 자동화
  • 배포 실수 감소
  • 일관된 배포
  • 개발 속도 향상

📌 CI/CD의 장점

  • 빠른 피드백
  • 자동화된 프로세스
  • 일관된 배포
  • 높은 품질 유지
  • 개발 생산성 향상

☁️ Amazon ECS

Amazon ECS(Elastic Container Service)는 AWS에서 제공하는 완전관리형(Container Orchestration) 서비스이다.

Docker 컨테이너를 쉽게 배포하고 운영할 수 있도록 지원한다.

특징

  • Docker 컨테이너 관리 자동화
  • AWS 서비스와 높은 연동성
  • Kubernetes보다 비교적 설정이 간단
  • 소규모~중규모 프로젝트에서 많이 사용
  • Serverless(Fargate) 방식 지원

ECS와 Fargate

ECS는 EC2 기반과 Fargate 기반으로 사용할 수 있다.

EC2 방식

  • 직접 EC2를 생성하고 관리해야 한다.
  • 서버 설정을 자유롭게 할 수 있다.

Fargate 방식

  • 서버를 직접 관리할 필요가 없다.
  • 컨테이너만 실행하면 된다.
  • 사용한 만큼만 비용을 지불한다.
  •  

  • Docker는 애플리케이션 실행 환경을 컨테이너 단위로 표준화하는 기술이다.
  • Image는 설계도, Container는 실행 중인 애플리케이션이다.
  • Dockerfile을 이용하면 이미지를 자동으로 생성할 수 있다.
  • Volume을 사용하면 컨테이너가 삭제되어도 데이터를 유지할 수 있다.
  • Bridge, Host, Overlay Network는 각각 사용 목적이 다르다.
  • Docker Compose는 여러 컨테이너를 하나의 YAML 파일로 관리할 수 있게 해준다.
  • CI는 코드 통합과 테스트를 자동화하고, CD는 배포를 자동화한다.
  • Amazon ECS는 AWS에서 Docker 컨테이너를 쉽게 운영할 수 있도록 지원하는 완전관리형 오케스트레이션 서비스이며, Fargate를 이용하면 서버를 직접 관리하지 않아도 된다.