학습
Ruby 컨테이너화 (Docker) 사용법
Ruby 컨테이너화 (Docker) 사용법 — 고급
컨테이너화 (Docker) 사용법
1. 도입 (왜 배워야 하는가)
Docker는 애플리케이션을 컨테이너라는 독립된 환경에서 실행할 수 있게 해주는 도구입니다. 실무에서 Docker를 사용하는 이유는 다음과 같습니다:
- 환경 일관성: 개발, 테스트, 프로덕션 환경이 동일하게 유지되어 "내 컴퓨터에서는 잘 되는데?" 같은 문제를 방지할 수 있습니다.
- 배포 용이성: 애플리케이션과 그 의존성을 패키징하여 쉽게 배포하고 관리할 수 있습니다.
- 자원 절약: 가상 머신보다 가벼워서 시스템 자원을 효율적으로 사용할 수 있습니다.
- 컨테이너: 애플리케이션과 그 의존성을 포함하는 격리된 환경. 마치 음식이 담긴 도시락이라고 생각할 수 있습니다. 도시락 안에는 음식(애플리케이션)과 필요한 조미료(의존성)가 함께 담겨 있죠.
- 이미지: 컨테이너를 생성하기 위한 청사진. 레시피와 유사합니다. 어떤 재료(소프트웨어, 라이브러리)가 필요한지 명시합니다.
- Dockerfile: 이미지를 만들기 위한 스크립트. 요리법을 설명하는 문서입니다.
Docker를 모르면 서로 다른 환경에서 발생하는 문제를 해결하기 어려워지고, 배포 과정에서 많은 시간과 노력을 소모하게 됩니다.
2. 핵심 개념 설명
| 용어 | 설명 |
|---|---|
| 컨테이너 | 실행 중인 애플리케이션의 인스턴스 |
| 이미지 | 컨테이너를 생성하는 청사진 |
| 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"]
실행 결과
코드 한 줄씩 동작 설명
FROM ruby:2.7: Ruby 2.7 이미지를 기반으로 새로운 이미지를 생성합니다.WORKDIR /app: 컨테이너 내에서 작업할 디렉토리를/app으로 설정합니다.COPY Gemfile Gemfile.lock ./: 현재 디렉토리의 Gemfile과 Gemfile.lock을 컨테이너의 작업 디렉토리로 복사합니다.RUN bundle install: Gemfile에 명시된 의존성을 설치합니다.COPY . .: 현재 디렉토리의 모든 파일을 컨테이너의 작업 디렉토리로 복사합니다.CMD ["ruby", "app.rb"]: 컨테이너가 시작될 때 실행할 명령어를 설정합니다.- 잘못된 코드:
- 올바른 코드:
- 주의:
bundle update는 Gemfile.lock을 변경할 수 있어 의도치 않은 버전 업데이트를 초래할 수 있습니다. - 잘못된 코드:
- 올바른 코드:
- 주의: 포트를 설정하지 않으면 외부에서 접근할 수 없습니다.
- Docker는 애플리케이션을 컨테이너화하여 환경 일관성을 제공합니다.
- Dockerfile은 이미지를 생성하는 스크립트로, 이를 통해 환경을 설정할 수 있습니다.
- 실무에서는 데이터베이스와의 연동, CI/CD 파이프라인 구축 등 다양한 활용이 가능합니다.
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을 잘못 작성
COPY Gemfile ./
RUN bundle update
COPY Gemfile Gemfile.lock ./
RUN bundle install
실수 2: 포트 설정 누락
# 포트 설정 없음
EXPOSE 3000
6. 정리
다음에 학습하면 좋은 주제로는 Kubernetes(컨테이너 오케스트레이션)와 Docker Compose(다중 컨테이너 관리) 등을 추천합니다.