이제 도커 컴포즈로 띄우는거 전 페이지에서 많이 했으니. 아래 코드보면 이해가 잘 갈 것이다.
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