일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 이분 매칭
- 서비스 디스커버리
- 게이트웨이
- Logback
- 다익스트라
- 이분 탐색
- Zuul
- 달팽이
- Java
- ZuulFilter
- 스택
- spring boot
- docker-compose
- 플로이드 와샬
- 유레카
- dp
- 비트마스킹
- 스프링 시큐리티
- 구간 트리
- 메모이제이션
- 구현
- Spring Cloud Config
- spring cloud
- BFS
- 백트래킹
- Gradle
- 완전 탐색
- 도커
- 트리
- 주울
- Today
- Total
Hello, Freakin world!
[docker-compose] 스프링 부트 + MySQL 환경 구성하기 본문
간단하게 service-a 라는 MySQL 기반의 스프링부트 프로젝트를 만들어 보자.
우선 스프링 이니셜라이저를 이용해 프로젝트를 생성한다.
build.gradle
plugins {
id 'org.springframework.boot' version '2.4.3'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
}
group = 'springboot.web'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
annotationProcessor "org.springframework.boot:spring-boot-configuration-processor"
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'mysql:mysql-connector-java'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
test {
useJUnitPlatform()
}
application.yml
spring:
datasource:
url: jdbc:mysql://${DB_HOST:db}:3306/testdb
username: sa
password: sa
jpa:
hibernate:
ddl-auto: create
show-sql: true
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL5Dialect
ddl-auto 옵션을 create로 주고 엔티티 클래스들이 DB 내에서 자동으로 테이블을 생성하도록 하자.
DB와 제대로 연결됐는지 확인하기 위해 도커 내에서 실행중인 mysql 서버에 접근해 테이블 생성 여부를 확인할 것이다.
간단한 엔티티 클래스를 하나 생성하자.
import lombok.Getter;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Getter
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
protected Member() {}
}
이제 프로젝트를 빌드한 다음 mysql-docker 라는 폴더 내에 빌드한 jar 파일을 복사한다.
그리고 같은 위치에 Dockerfile, docker-compose.yml 파일을 생성한다.
Dockerfile
FROM openjdk:11
RUN mkdir /app
ADD servicea-0.0.1-SNAPSHOT.jar /app
CMD [ "java", "-jar", "/app/servicea-0.0.1-SNAPSHOT.jar" ]
docker-compose.yml
version: "3.0"
services:
db:
image: mysql:8
environment:
MYSQL_ROOT_PASSWORD: root_password
MYSQL_USER: sa
MYSQL_PASSWORD: sa
MYSQL_DATABASE: testdb
ports:
- 3306:3306
service-a:
build: .
restart: on-failure
links:
- db
depends_on:
- db
mysql 이미지의 자세한 사용법은 도커 허브의 mysql 공식 리포지토리의 내용을 읽어보면 알 수 있다.
주의해야 할 점은 service-a의 restart 옵션을 반드시 사용해야 된다는 점이다.
service-a 는 DB 커넥션이 없으면 예외를 던지면서 애플리케이션이 종료되고 컨테이너도 종료되버린다.
이를 방지하기 위해 depend-on 이라는 옵션을 이용해 service-a 컨테이너가 db 컨테이너에 의존하고 있다는걸 사실 명시했지만 이것만으로는 대처가 안된다. 이유는 db 컨테이너가 생성되고 다른 접속을 받을 수 있도록 소켓 대기 상태를 만든 뒤에 service-a 컨테이너가 만들어져야 되는데, 소켓 대기 이전에 service-a 컨테이너를 실행해버리기 때문.
그렇기 때문에 service-a가 실패하더라도 다시 db 컨테이너에 연결을 시도하도록 restart 옵션을 줘야 된다.
이제 docker-compose up 명령어를 통해 컨테이너를 띄우고 실행중인 db 컨테이너에 접속해 테이블이 생성됐는지 확인해보자.
docker container ls 명령어로 컨테이너 리스트를 볼 수 있다.
mysql-docker-db_1 이라는 이름의 mysql 컨테이너가 실행중이다.
실행 중인 컨테이너에 접근하기 위해 다음의 명령어를 이용한다.
docker exec -it mysql-docker_db_1 /bin/bash
db 컨테이너의 쉘에 접속했다면 mysql username, password 를 이용해 mysql에 연결한다.
'도커' 카테고리의 다른 글
[docker-compose] zookeeper/kafka 클러스터 구성 (0) | 2021.03.22 |
---|---|
[docker-compose] 주키퍼 클러스터 만들기 (0) | 2021.02.17 |