이제 도커 컴포즈로 띄우는거 전 페이지에서 많이 했으니. 아래 코드보면 이해가 잘 갈 것이다.
services:
  my-db:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: pwd1234
    volumes:
      - ./mysql_data:/var/lib/mysql
    ports:
      - 3307:3306
그럼 한번에 두개는 어떻게 띄울까? 그냥 yml 문법에 따라 들여쓰기 잘 신경써서 compose 이름만 잘 지정해주면 된다~~
이렇게 compose를 쓰니 한번에 여러개의 컨테이너를 up하고 down 할 수 있다~!
services:
  my-db: // MYSQL 컨테이너
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: pwd1234
    volumes:
      - ./mysql_data:/var/lib/mysql
    ports:
      - 3307:3306
  my-cache-server: // Redis 컨테이너
    image: redis
    ports:
      - 6379:6379
여기 매우 중요한 깨달음과 새로 배운 것들 적겠다!! 주목!!
아래 코드를 보면 spring 컨테이너와 mysql 컨테이너를 동시에 띄움을 볼 수 있다!! 스프링은 잘 알듯이 db연결 안되면 실행이 꺼진다 → 컨테이너가 꺼진다 → 그렇다면? db 컨테이너를 먼저 띄우고 스프링 컨테이너를 띄워야 안죽는다!!
거기서 나온것이 healthcheck 개념과 depends_on !! 자세한건 주석으로 써놓겠다!
services:
  my-server:
    build: .
    ports:
      - 8080:8080
    depends_on: // 의존하겠다!
      my-db:    // my-db(SQL컨테이너)가 condtion에 부합할 때 실행 하겠다~
        condition: service_healthy  // condition이 healthy 한가!
  my-db:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: pwd1234
      MYSQL_DATABASE: mydb
    volumes:
      - ./mysql_data:/var/lib/mysql
    ports:
      - 3307:3306
    healthcheck:   // condition에 해당하는 healthcheck!!
      test: ["CMD", "mysqladmin", "ping"]  // MYSQL 문법임 ping 보내서 되면 pong 보내잖냐
      interval: 5s // 5초에 한번씩!! pong 오면 health 반환하고 끝냄. 안오면 계속!
      retries: 10 // 10번 시도!
위와 같이 스프링 컨테이너 안죽게끔 db healthcheck까지 신경써주고~ 흔히 우리가 하듯이 application.yml에 db 연결 설정 정보 작성해서 compose up으로 컨테이너 띄우고 이제 localhost:8080 시 제대로 작성되길 기대했지만…????
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: root
    password: pwd1234
    driver-class-name: com.mysql.cj.jdbc.Driver