이 글은 최주호님의 Youtube 도커 강의를 통해 학습한 내용을 정리하여 작성합니다.
Docker Compose - Spring & MySQL
전체 구조
docker-test-server
Dockerfile
FROM openjdk:11-jdk-slim
WORKDIR /app
# COPY만 docker-compose 파일의 위치를 기반으로 작동한다.
COPY . .
# RUN은 현재 파일을 위치를 기반으로 작동한다.
RUN chmod +x ./gradlew
RUN ./gradlew clean build
ENV JAR_PATH=/app/build/libs
RUN mv ${JAR_PATH}/*.jar /app/app.jar
ENTRYPOINT [ "java", "-jar", "-Dspring.profiles.active=prod", "app.jar" ]
- FROM openjdk:11-jdk-slim
: 이 줄은 베이스 이미지로 openjdk:11-jdk-slim 이미지를 사용한다는 것을 나타낸다.- 이 이미지는 OpenJDK 11과 필요한 최소한의 운영 체제 요소만을 포함하고 있다.
- WORKDIR /app
: 이 줄은 컨테이너 내에서 작업 디렉토리를 /app로 설정한다.- 이 디렉토리는 컨테이너 내에서 애플리케이션 파일 및 작업에 사용될 위치이다.
- COPY . .
: 현재 Dockerfile이 위치한 디렉토리의 모든 파일 및 폴더를 컨테이너의 작업 디렉토리(/app)로 복사한다.- 이는 소스 코드, 설정 파일 등을 컨테이너로 복사하는 데 사용된다.
- RUN chmod +x ./gradlew
: 컨테이너 내에서 gradlew 파일에 실행 권한을 부여한다.- 이는 Gradle 빌드 도구를 사용하여 프로젝트를 빌드하기 위해 필요하다.
- RUN ./gradlew clean build
: gradlew를 실행하여 프로젝트를 클린(clean)하고 빌드(build)한다.- 이 단계에서는 애플리케이션의 의존성을 설치하고 소스 코드를 컴파일하여 실행 가능한 JAR 파일을 생성한다.
- ENV JAR_PATH=/app/build/libs
: JAR_PATH라는 환경 변수를 설정한다.- 이 변수는 생성된 JAR 파일의 경로를 나타낸다.
- RUN mv ${JAR_PATH}/*.jar /app/app.jar
: 이 단계에서는 빌드된 JAR 파일을 /app 디렉토리의 app.jar로 이동시킨다.- 이후 컨테이너에서 실행할 애플리케이션의 엔트리 포인트로 사용된다.
- ENTRYPOINT [ "java", "-jar", "-Dspring.profiles.active=prod", "app.jar" ]
: 컨테이너가 시작될 때 실행되는 명령어를 정의한다.
- 여기서는 Java 가상 머신에서 app.jar 파일을 실행하는데 필요한 인자들을 지정한다.
- -Dspring.profiles.active=prod는 prod 프로파일로 애플리케이션을 실행하도록 지정한다.
- 이 부분은 스프링 프레임워크에서 활성화할 프로파일을 설정하는 데 사용된다.
docker-test-db
init.sql
CREATE TABLE user_tb (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT INTO user_tb (name) VALUES ('John');
INSERT INTO user_tb (name) VALUES ('Jane');
Dockerfile
FROM mysql:8.0
COPY init.sql /docker-entrypoint-initdb.d
ENV MYSQL_ROOT_PASSWORD=root1234
ENV MYSQL_DATABASE=metadb
ENV MYSQL_HOST=%
CMD ["--character-set-server=utf8mb4", "--collation-server=utf8mb4_unicode_ci"]
docker-compose.yml
version: '3'
services:
db:
build:
context: ./docker-test-db
dockerfile: Dockerfile
ports:
- 3306:3306
volumes:
- ./docker-test-db/store:/var/lib/mysql
networks:
- network
server:
build:
context: ./docker-test-server
dockerfile: Dockerfile
restart: always
ports:
- 8080:8080
depends_on:
- db
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/metadb?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false&allowPublicKeyRetrieval=true
SPRING_DATASOURCE_DRIVER: com.mysql.cj.jdbc.Driver
SPRING_DATASOURCE_USERNAME: root
SPRING_DATASOURCE_PASSWORD: root1234
networks:
- network
networks:
network:
environment
여기서 작성된 server의 environment는 application-prod.yml 파일에 존재하는 변수를 작성해준다.
application-prod.yml
server:
servlet:
encoding:
charset: utf-8
force: true
port: 8080
spring:
datasource:
url: ${SPRING_DATASOURCE_URL}
username: ${SPRING_DATASOURCE_USERNAME}
password: ${SPRING_DATASOURCE_PASSWORD}
driver-class-name: ${SPRING_DATASOURCE_DRIVER}
jpa:
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL8Dialect
hibernate:
ddl-auto: none
show-sql: true
open-in-view: true
logging:
level:
'[com.example.server]': INFO
'[org.hibernate.type]': TRACE
주의!
만약 context를 제대로 지정해주지 않는다면 Dockerfile에 작성한 COPY가 제대로 수행되지 않을 수 있다.
실행
'Docker' 카테고리의 다른 글
도커컴포즈 Nginx로 html 실행 (0) | 2023.08.30 |
---|---|
Docker Compose - React & Spring & MySQL (0) | 2023.08.14 |
Docker-Compose 기본 (0) | 2023.06.25 |
docker file - MySQL 환경변수와 볼륨연결 (0) | 2023.06.25 |
docker file - nginx 게이트웨이 사용하기 (0) | 2023.06.25 |