컨테이너화(Containerization)란 애플리케이션과 그 실행에 필요한 모든 환경(JDK, 라이브러리, 설정 파일 등)을 "컨테이너"라는 격리된 표준 단위로 패키징하는 기술입니다. Docker는 이를 위한 가장 대표적인 플랫폼입니다.
핵심 장점: "제 컴퓨터에서는 되는데, 서버에서는 안 돼요" 문제를 근본적으로 해결합니다. 컨테이너는 OS나 환경에 구애받지 않고 어디서든 동일하게 동작하는 것을 보장합니다.
Dockerfile 작성:
Dockerfile은 나만의 커스텀 Docker 이미지를 만들기 위한 설명서(Recipe)입니다.# 1. 베이스 이미지: Java 17 환경이 설치된 경량 리눅스
FROM openjdk:17-jdk-slim
# 2. 작업 디렉토리 설정
WORKDIR /app
# 3. 빌드된 JAR 파일을 컨테이너 안으로 복사
COPY build/libs/*.jar app.jar
# 4. 컨테이너가 시작될 때 실행할 명령어
CMD ["java", "-jar", "app.jar"]
Docker 이미지 빌드:
Dockerfile을 기반으로 docker build 명령어를 실행하여 애플리케이션의 스냅샷인 Docker 이미지를 생성합니다.docker build -t my-spring-app:0.0.1 .Docker 컨테이너 실행:
docker run 명령어로 실행하여, 실제 동작하는 컨테이너를 띄웁니다.docker run -p 8080:8080 my-spring-app:0.0.1문제점: 실제 애플리케이션은 웹 서버, 데이터베이스 등 여러 개의 컨테이너가 함께 동작해야 합니다. 이들을 docker run 명령어로 하나씩 관리하는 것은 매우 번거롭습니다.
Docker Compose: 여러 개의 컨테이너로 구성된 애플리케이션을 하나의 YAML 파일(docker-compose.yml)로 정의하고, 단 하나의 명령어로 전체 서비스를 관리할 수 있게 해주는 도구입니다.
docker-compose.yml의 역할:
spring-app, database)을 services 아래에 정의합니다.database)으로 서로를 참조할 수 있습니다.environment 키를 통해 안전하게 주입합니다.volumes를 설정합니다.CI/CD는 애플리케이션 개발부터 배포까지의 전체 과정을 자동화하여, 개발자가 코드 작성에만 집중하고, 빠르고 안정적으로 서비스를 제공할 수 있도록 하는 개발 문화이자 방법론입니다.
CI (Continuous Integration, 지속적 통합): 개발자가 코드를 Git 리포지토리에 푸시(Push)하면, 자동으로 빌드(Build)되고 테스트(Test)되는 과정입니다.
CD (Continuous Deployment, 지속적 배포): CI 단계가 성공적으로 완료되면, 그 결과물이 자동으로 실제 운영 서버에 배포(Deploy)되는 과정입니다.
.yml 설정 파일만으로 파이프라인을 쉽게 구축할 수 있습니다.트리거 (Trigger): 개발자가 main 브랜치에 코드를 푸시(Push)하면 파이프라인이 자동으로 시작됩니다.
[CI] 빌드 및 이미지 생성 (GitHub Actions 서버에서 실행):
a. JDK를 설정하고, ./gradlew build로 Spring Boot 프로젝트를 빌드하여 JAR 파일을 생성합니다.
b. Dockerfile을 사용하여 Docker 이미지를 빌드합니다.
c. 빌드된 이미지를 Docker Hub와 같은 이미지 레지스트리에 푸시(Push)합니다.
[CD] 서버 배포 (AWS EC2 서버에서 실행):
a. GitHub Actions가 SSH를 통해 AWS EC2 서버에 원격으로 접속합니다.
b. EC2 서버에서 다음 명령어들을 순차적으로 실행합니다.
i. 최신 이미지 풀(Pull): Docker Hub에서 방금 푸시한 최신 버전의 이미지를 내려받습니다.
ii. 기존 컨테이너 중지/제거: 이전에 실행 중이던 구버전 컨테이너를 중지하고 제거합니다. (무중단 배포를 위해서는 블루/그린, 카나리 등의 고급 전략 필요)
iii. 새 컨테이너 실행: 최신 이미지를 기반으로 새로운 컨테이너를 실행하여 배포를 완료합니다.
${{ secrets.MY_SECRET }} 형태로 참조하여 보안을 유지해야 합니다.docker-compose.yml 파일 하나로 손쉽게 관리할 수 있게 해줍니다..yml 파일로 정의하여 간편하게 구축할 수 있습니다.