# [Docker] Docker Compose 를 활용해 2개 이상의 컨테이너 관리 하기

2024. 12. 13. 13:11개발/Docker

🌞 2024.12.12 Thu

1. SpringBoot 와 MySQL 동시 생성

<<gradle version >>
• start.spring.io 홈페이지에서 sb 생성 -> spring web, spring boot dev tools, spring data jpa, mysql driver 의존성 추가. -> 스프링 프로젝트가 생성(이클립스에서 실행)

2. build.gradle dependencies 변경

📝📝📝 << build.gradle file >> 📝📝📝

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    runtimeOnly 'com.mysql:mysql-connector-j'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
  }

3. Eclipse 로 프로젝트 열어서 변경 할 것

3.1 Projeect refresh

  • □ 프로젝트 오른쪽 클릭 -> gradle-> refresh gradle 을 실행 (refresh 안하면 안됨)
  • 📌 프로젝트 파일 옆에 [boot], [devtools] 글씨가 나옴.
  • maven 은 refresh 필요 없음.

3.2 JDBC 의존성 추가 Spring DB connecting (on application.yml)

  • resource 폴더에서 properties 파일 삭제

  • resource 클릭-> new -> file -> application.yml 생성

    #  📝📝📝<application.yml> 📝📝📝
    spring:
      datasource:
        url: jdbc:mysql://localhost:3306/mydb
        username: root
        password: pwd1234
        driver-class-name: com.mysql.cj.jdbc.Driver
      # 📝📝📝<application.properties> 📝📝📝
      spring.mvc.view.prefix=/WEB-INF/views/
      spring.mvc.view.suffix =.jsp
      spring.mvc.static-path-pattern=/resources/**
      spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
      spring.datasource.url=jdbc:mysql://localhost:3306/apple_store?serverTimezone=Asia/Seoul&autoReconnect=true&useSSL=false
      spring.datasource.username=root
      spring.datasource.password=qwer1234
      productimage.upload.directory=src/main/resources/static/image

    3.3 test/java/com/example/demo 폴더에서 java 파일 삭제

    3.4 Dockerfile , compose.yml 파일 생성 및 실행

    # 📝📝📝 gradle use case <Dockerfile>
    FROM openjdk:17-jdk
    COPY build/libs/*SNAPSHOT.jar /app.jar
    ENTRYPOINT ["java", "-jar", "/app.jar"]
      # 📝📝📝 maven use case <Dockerfile>
      FROM maven:3.8.3-openjdk-17 as maven_builder
      WORKDIR /app
      COPY pom.xml .
      COPY /src ./src
      RUN mvn clean install
      RUN mv target/*.jar target/application.jar  # <-- add
      RUN ls -l /app/target
    
      FROM openjdk:17-jdk as builder
      COPY --from=maven_builder /app/target/*.jar /target
      ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher"]
    # < compose.yml>
    services:
    my-server:
      build: .
      ports:
        - 8080:8080
      depends_on:
        my-db:
          condition: service_healthy
    my-db:
      image: mysql
      environment:
        MYSQL_ROOT_PASSWORD: pwd1234
        MYSQL_DATABASE: mydb 
      volumes:
        - ./mysql_data:/var/lib/mysql
      ports:
        - 3306:3306
      healthcheck:
        test: [ "CMD", "mysqladmin", "ping" ] 
        interval: 5s 
        retries: 10
  • dependency on: mysql 을 먼저 실행후 스프링을 실행

  • service healthy 가 있으면 일단 정지 하고 mysql 을 실행하고 나중에 spring 실행.

  • 5초 에 한번씩 check 10번 실행하고 그 다음에 함.

  • spring 이 먼저 켜지면 그다음에 db 를 붙일 수가 없음.

  • cd Docker/demo 로 들어가서 build 시작.

    3.5 Project clean build, Compose 실행

      ./gradlew clean build 
      # mvn clean install -DskipTest
      # /Library/apache-maven-3.9.9/bin/mvn clean install -DskipTest
      # /Library/apache-maven-3.9.9/bin/mvn clean package
      docker compose up -d --build
      docker compose ps
      docker ps
      docker logs [container ID]