Docker 사용법

여준서·2024년 11월 16일
post-thumbnail

1. Docker란?

Docker는 애플리케이션과 필요한 모든 의존성을 컨테이너라는 단위로 묶어 어디서든 일관되게 실행할 수 있도록 해주는 플랫폼입니다. Docker를 사용하면 개발 환경과 프로덕션 환경 간의 차이를 최소화하여 배포 과정을 단순화할 수 있습니다.

2. Docker의 주요 개념

  • 이미지(Image): 애플리케이션과 필요한 환경(라이브러리,설정)을 포함한 읽기 전용 템플릿입니다.
  • 컨테이너(Container): 이미지를 실행한 상태로 독립된 프로세스로 동작하며 서로 격리됩니다.
  • Dockerfile: 이미지를 정의하는 텍스트 파일로 애플리케이션을 컨테이너화하기 위한 명세가 포함됩니다.
  • Docker Hub: Docker 이미지를 공유할 수 있는 클라우드 기반의 저장소입니다.

3. Docker를 이용한 애플리케이션 배포 흐름

3.1 Docker 설치

운영체제에 맞는 Docker Desktop을 설치한 후 아래 명령어로 Docker 버전을 확인합니다.

docker --version

3.2 Dockerfile 작성

Dockerfile은 Docker 이미지를 빌드하는데 필요한 명령어를 정의합니다.
아래 코드는 실제 우리 프로젝트에서 작성한 Dockerfile 코드입니다.

FROM openjdk:17-jdk-slim AS builder
WORKDIR /app
COPY gradlew .
COPY gradle gradle
COPY build.gradle .
COPY settings.gradle .
COPY src src
RUN chmod +x ./gradlew
RUN ./gradlew bootJar

FROM openjdk:17-jdk-slim
RUN apt-get update && \
    apt-get install -y curl redis-tools && \
    rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY --from=builder /app/build/libs/*.jar app.jar

# JVM 옵션 설정
ENV JAVA_OPTS="-Xmx512m -Xms256m -XX:+UseG1GC"

ENTRYPOINT ["java", "-jar", "app.jar"]
  • FROM: 기본 베이스 이미지를 지정합니다.
  • COPY: 빌드와 실행에 필요한 파일을 이미지로 복사합니다.
  • RUN: 실행 시 필요한 명령어를 실행합니다.
  • ENTRYPOINT:컨테이너 시작시 실행될 명령어를 정의합니다.

3.3 Docker 이미지 빌드

Dockerfile이 있는 디렉토리에서 아래 명령어를 실행합니다.


spring-app은 이미지 이름이고 prod는 이미지 태그입니다.

3.4 Docker Compose 작성

Doker Compose를 사용하면 다중 컨테이너를 손쉽게 관리할 수 있습니다. 아래는 저희 프로젝트에서 Nginx,Spring Boot,Redis를 포함한 docker.compose.yml 파일입니다.

version: '3.8'

services:
  nginx:
    image: nginx:alpine
    container_name: nginx
    ports:
      - "80:80"
    depends_on:
      app:
        condition: service_started
    restart: always
    networks:
      - app-network
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf
    healthcheck:
      test: [ "CMD-SHELL", "apk add --no-cache curl && curl -f http://localhost/actuator/health || exit 1" ]
      interval: 30s
      timeout: 10s
      retries: 5
  app:
    image: ${DOCKER_USERNAME}/spring-app:${IMAGE_TAG}
    container_name: spring-app
    ports:
      - "8080:8080"
    env_file:
      - .env
    networks:
      - app-network
    healthcheck: # 헬스체크 추가
      test: [ "CMD-SHELL", "curl -f http://localhost:8080/actuator/health || exit 1" ]
      interval: 30s
      timeout: 10s
      retries: 5
      start_period: 40s    # 애플리케이션 시작 대기 시간
  redis:
    image: redis:alpine
    container_name: redis
    ports:
      - "6379:6379"
    networks:
      - app-network
    healthcheck:
      test: [ "CMD", "redis-cli", "ping" ]
      interval: 30s
      timeout: 10s
      retries: 5
    volumes:
      - /C/Redis/Redis-7.4.1/redis.conf:/usr/local/etc/redis/redis.conf # redis.conf 파일 마운트
    command: [ "redis-server", "/usr/local/etc/redis/redis.conf" ] # 커스텀 설정
networks:
  app-network:
    name: app-network
    driver: bridge

Docker Compose 실행

docker.compose.yml 파일을 작성한 후 아래 명령어로 모든 컨테이너를 실행합니다

docker-compose up -d
  • -d: 백그라운드에서 실행

결과

결과는 docker ps 명령어를 사용해 확인할 수도 있지만 docker Desktop을 사용하면 더욱더 시각화되어 확인할 수 있습니다.

profile
블로그 이전했습니다 https://duwnstj.github.io

0개의 댓글