
Docker는 애플리케이션과 필요한 모든 의존성을 컨테이너라는 단위로 묶어 어디서든 일관되게 실행할 수 있도록 해주는 플랫폼입니다. Docker를 사용하면 개발 환경과 프로덕션 환경 간의 차이를 최소화하여 배포 과정을 단순화할 수 있습니다.
운영체제에 맞는 Docker Desktop을 설치한 후 아래 명령어로 Docker 버전을 확인합니다.
docker --version
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:컨테이너 시작시 실행될 명령어를 정의합니다.Dockerfile이 있는 디렉토리에서 아래 명령어를 실행합니다.

spring-app은 이미지 이름이고 prod는 이미지 태그입니다.
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.yml 파일을 작성한 후 아래 명령어로 모든 컨테이너를 실행합니다
docker-compose up -d
-d: 백그라운드에서 실행결과는 docker ps 명령어를 사용해 확인할 수도 있지만 docker Desktop을 사용하면 더욱더 시각화되어 확인할 수 있습니다.
