docker와 docker-compose에 대해 작성한 글이 있었다.
부족한거 같아서 좀 더 보충해서 작성한다.
배포를 위해 도커환경을 구축하였다.
# 빌드 스테이지
FROM openjdk:17-slim AS builder
# 작업 디렉토리 설정
WORKDIR /app
# 소스 코드와 Gradle 래퍼 복사
COPY gradlew .
COPY gradle gradle
COPY build.gradle .
COPY settings.gradle .
# Gradle 래퍼에 실행 권한 부여
RUN chmod +x ./gradlew
# 종속성 설치
RUN ./gradlew dependencies --no-daemon
# 소스 코드 복사
COPY src src
# 애플리케이션 빌드
RUN ./gradlew build --no-daemon -x test
# 실행 스테이지
# 배포를 위한 경량화된 Alpine Linux 환경 세팅 안돼서 slim으로 바꿨음
FROM openjdk:17-slim
# 작업 디렉토리 설정
WORKDIR /app
# 첫 번째 스테이지에서 빌드된 JAR 파일 복사
COPY --from=builder /app/build/libs/*.jar app.jar
# RDS 연결할 때 사용될 부분
#ENV SPRING_DATASOURCE_URL=jdbc:mysql://<RDS-ENDPOINT>:3306/db-id
#ENV SPRING_DATASOURCE_USERNAME=db-id
#ENV SPRING_DATASOURCE_PASSWORD=db-password
# 포트 노출
EXPOSE 8080
# 실행할 JAR 파일 지정
ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=dev", "app.jar"]
빌드 스테이지와 실행 스테이지를 나눈 이유는 여러가지가 있는데,
이미지 크기 최적화, 불필요한 도구를 제거함으로써 보안 강화, 컨테이너 실행 속도 향상 등.. 이 있다.
그리고 도커의 이미지는 slim을 사용하였다. 원래는 alpine을 사용하려고 하였다. (가장 가벼우니까)
아니면은 CI/CD를 위하여 jenkins을 사용하려고했다.
1. alpine을 사용하지 못한 이유.
현재 나는 mac M2를 사용중이다. 즉, arm64상태이다. amd64가 호환되지 않아서. 오류가 터졌다.
그래서 멀티플랫폼을 사용하려고했다. 근데.. 귀찮았다. 그래서 다른 방법을 물색했다.
CI/CD를 사용하지 않은 이유.
아직 배포하려면 멀어서.
slim을 사용한 이유.
alpine보다는 무겁지만 드라마틱한 차이는 안남. 그리고 arm64, amd64 지원 다됨. 멀티플랫폼 사용할 필요 없음. 편했음.
나중에 일일이 세팅하기 귀찮아서 docker뿐만 아니라 docker-compose까지 구축하였다.
docker-compose만 실행하면 되니까, 매우매우 편했다. 처음에 구축할때만 귀찮았지, 괜찮았다.
version: '3.9'
services:
db:
image: mysql:latest
environment:
MYSQL_ROOT_PASSWORD: db-password
MYSQL_DATABASE: db-id
ports:
- "3306:3306"
networks:
- my-network
redis:
image: redis:latest
ports:
- "6379:6379"
networks:
- my-network
app:
build:
context: .
dockerfile: Dockerfile
container_name: name
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/db-id
SPRING_DATASOURCE_USERNAME: db-id
SPRING_DATASOURCE_PASSWORD: db-password
SPRING_DATASOURCE_DRIVER_CLASS_NAME: com.mysql.cj.jdbc.Driver
SPRING_JPA_HIBERNATE_DDL_AUTO: update
SPRING_JPA_PROPERTIES_HIBERNATE_DIALECT: org.hibernate.dialect.MySQL8Dialect
SPRING_JPA_PROPERTIES_HIBERNATE_SHOW_SQL: false
SPRING_JPA_PROPERTIES_HIBERNATE_FORMAT_SQL: true
SPRING_JPA_PROPERTIES_HIBERNATE_USE_SQL_COMMENTS: true
SPRING_JPA_PROPERTIES_HIBERNATE_DEFAULT_BATCH_FETCH_SIZE: 100
LOGGING_LEVEL_ORG_HIBERNATE_SQL: DEBUG
LOGGING_LEVEL_ORG_HIBERNATE_ORM_JDBC_BIND: TRACE
LOGGING_LEVEL_ORG_HIBERNATE_ORM_JDBC_EXTRACT: TRACE
SPRING_REDIS_HOST: redis
SPRING_REDIS_PORT: 6379
ports:
- "8080:8080"
depends_on:
- db
- redis
networks:
- my-network
networks:
my-network:
driver: bridge
redis를 병행하면서 docker-compose를 구축하려다가 더럽게 오류가 터졌다. 해결하는데 몇시간 걸린거같다.
이유를 찾아보니, redis를 불러올 수가 없단다.
docker ps에는 redis가 뻔히 잘 실행되고있었는데.. 이유가 뭘까.. 생각했다.
간단했다. 프로젝트를 빌드하고 도커파일을 포함시키지 않았으며, docker-compose를 리빌딩하지 않았었다.
겨우 이거때문에 3시간정도 걸린거같았다.
처음에만 귀찮지만, 나중에 일일이 프로젝트를 실행할 필요 없이, docker-compose만 실행하면 돼서 매우매우 편했다.
docker-compose짱. docker짱