IMCAT.DEV
로그인 가입
Ruby 고급 DevOps

Ruby 컨테이너화 (Docker) 사용법

Ruby 컨테이너화 (Docker) 사용법 — 고급

컨테이너화 (Docker) 사용법

1. 도입 (왜 배워야 하는가)

Docker는 애플리케이션을 컨테이너라는 독립된 환경에서 실행할 수 있게 해주는 도구입니다. 실무에서 Docker를 사용하는 이유는 다음과 같습니다:

  • 환경 일관성: 개발, 테스트, 프로덕션 환경이 동일하게 유지되어 "내 컴퓨터에서는 잘 되는데?" 같은 문제를 방지할 수 있습니다.
  • 배포 용이성: 애플리케이션과 그 의존성을 패키징하여 쉽게 배포하고 관리할 수 있습니다.
  • 자원 절약: 가상 머신보다 가벼워서 시스템 자원을 효율적으로 사용할 수 있습니다.
  • Docker를 모르면 서로 다른 환경에서 발생하는 문제를 해결하기 어려워지고, 배포 과정에서 많은 시간과 노력을 소모하게 됩니다.

    2. 핵심 개념 설명

  • 컨테이너: 애플리케이션과 그 의존성을 포함하는 격리된 환경. 마치 음식이 담긴 도시락이라고 생각할 수 있습니다. 도시락 안에는 음식(애플리케이션)과 필요한 조미료(의존성)가 함께 담겨 있죠.
  • 이미지: 컨테이너를 생성하기 위한 청사진. 레시피와 유사합니다. 어떤 재료(소프트웨어, 라이브러리)가 필요한지 명시합니다.
  • Dockerfile: 이미지를 만들기 위한 스크립트. 요리법을 설명하는 문서입니다.
  • 용어설명
    컨테이너실행 중인 애플리케이션의 인스턴스
    이미지컨테이너를 생성하는 청사진
    Dockerfile이미지를 생성하기 위한 스크립트

    3. 기본 코드 예제

    가장 기본적인 Dockerfile을 작성해 보겠습니다.

    # 베이스 이미지로 Ruby를 사용
    FROM ruby:2.7
    
    # 작업 디렉토리 설정
    WORKDIR /app
    
    # Gemfile과 Gemfile.lock을 복사
    COPY Gemfile Gemfile.lock ./
    
    # 의존성 설치
    RUN bundle install
    
    # 애플리케이션 소스 복사
    COPY . .
    
    # 애플리케이션 실행
    CMD ["ruby", "app.rb"]

    실행 결과

  • 이 Dockerfile을 기반으로 이미지를 빌드하고 컨테이너를 실행하면, Ruby 애플리케이션이 실행됩니다.
  • 코드 한 줄씩 동작 설명

    1. FROM ruby:2.7: Ruby 2.7 이미지를 기반으로 새로운 이미지를 생성합니다.
    2. WORKDIR /app: 컨테이너 내에서 작업할 디렉토리를 /app으로 설정합니다.
    3. COPY Gemfile Gemfile.lock ./: 현재 디렉토리의 Gemfile과 Gemfile.lock을 컨테이너의 작업 디렉토리로 복사합니다.
    4. RUN bundle install: Gemfile에 명시된 의존성을 설치합니다.
    5. COPY . .: 현재 디렉토리의 모든 파일을 컨테이너의 작업 디렉토리로 복사합니다.
    6. CMD ["ruby", "app.rb"]: 컨테이너가 시작될 때 실행할 명령어를 설정합니다.
    7. 4. 실전 활용 예제

      예제 1: 데이터베이스와 함께 사용하는 웹 애플리케이션

      쇼핑몰 웹 애플리케이션을 만들 때, 데이터베이스도 함께 컨테이너화할 수 있습니다. 예를 들어, Rails 애플리케이션과 PostgreSQL 데이터베이스를 사용하는 경우입니다.

      version: '3'
      services:
        web:
          build: .
          ports:
            - "3000:3000"
          depends_on:
            - db
        db:
          image: postgres
          environment:
            POSTGRES_USER: user
            POSTGRES_PASSWORD: password

      예제 2: CI/CD 파이프라인

      CI/CD 도구인 Jenkins를 Docker로 실행하여 자동 배포 시스템을 구축할 수 있습니다.

      version: '3'
      services:
        jenkins:
          image: jenkins/jenkins:lts
          ports:
            - "8080:8080"
          volumes:
            - jenkins_home:/var/jenkins_home
      volumes:
        jenkins_home:

      5. 흔한 실수와 주의사항

      실수 1: Dockerfile을 잘못 작성

    8. 잘못된 코드:
    9. COPY Gemfile ./
      RUN bundle update
    10. 올바른 코드:
    11. COPY Gemfile Gemfile.lock ./
      RUN bundle install
    12. 주의: bundle update는 Gemfile.lock을 변경할 수 있어 의도치 않은 버전 업데이트를 초래할 수 있습니다.
    13. 실수 2: 포트 설정 누락

    14. 잘못된 코드:
    15. # 포트 설정 없음
    16. 올바른 코드:
    17. EXPOSE 3000
    18. 주의: 포트를 설정하지 않으면 외부에서 접근할 수 없습니다.
    19. 6. 정리

    20. Docker는 애플리케이션을 컨테이너화하여 환경 일관성을 제공합니다.
    21. Dockerfile은 이미지를 생성하는 스크립트로, 이를 통해 환경을 설정할 수 있습니다.
    22. 실무에서는 데이터베이스와의 연동, CI/CD 파이프라인 구축 등 다양한 활용이 가능합니다.

다음에 학습하면 좋은 주제로는 Kubernetes(컨테이너 오케스트레이션)와 Docker Compose(다중 컨테이너 관리) 등을 추천합니다.