1. spring-boot 프로젝트 생성
- 패키지, 파일 임시 생성
2. application.properties 파일
# MySQL 데이터베이스 연결 설정
spring.application.name= 애플리케이션 이름
spring.datasource.url= jdbc:mysql://localhost:3306/{mydatabase}
spring.datasource.username= 사용자 이름
spring.datasource.password= 데이터베이스 접근 비밀번호
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# Hibernate JPA 설정
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
- 코드 설명
더보기
- spring.application.name
- 애플리케이션의 이름
- jdbc:mysql://localhost:3306/mydatabase
- jdbc:mysql://는 MySQL 데이터베이스
- localhost는 데이터베이스가 위치한 호스트
- 3306은 MySQL의 기본 포트
- mydatabase는 데이터베이스 이름
- spring.datasource.usernam
- 데이터베이스에 접근하기 위한 사용자 이름을 지정
- spring.datasource.password
- 데이터베이스에 접근하기 위한 비밀번호
- spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
- JDBC 드라이버 클래스 이름
- MySQL의 경우 com.mysql.cj.jdbc.Driver를 사용
3. Dockerfile 작성
# Java 21이 포함된 기본 이미지를 사용
FROM openjdk:21-jdk
# 작업 디렉토리를 설정
WORKDIR /app
# JAR 파일을 복사
COPY build/libs/{프로젝트}-0.0.1-SNAPSHOT.jar app.jar
# 애플리케이션이 실행되는 포트를 외부에 노출
EXPOSE 8080
# JAR 파일을 실행
ENTRYPOINT ["java", "-jar", "app/app.jar"]
- 처음에 작성한 문제점
더보기
# Java 21이 포함된 기본 이미지를 사용합니다
FROM openjdk:21-jdk-alpine
# 작업 디렉토리를 설정합니다
WORKDIR /app
# JAR 파일을 복사합니다
COPY target/my-spring-boot-app-0.0.1-SNAPSHOT.jar app.jar
# 애플리케이션이 실행되는 포트를 외부에 노출합니다
EXPOSE 8080
# JAR 파일을 실행합니다
ENTRYPOINT ["java", "-jar", "app.jar"]
- 첫 줄에 jdk 뒤 -alpine 삭제
- 빌드한 .jar 파일 경로로 수정해야 함
- ENTRYPOINT 에서 app.jar 앞에 경로 app/ 필요
4. docker-compose.yml
version: '3.8' #최신 버전에서는 이 부분 없어도 됨
services:
app:
build: .
ports:
- "8080:8080"
depends_on:
- db
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/데이터베이스 이름
SPRING_DATASOURCE_USERNAME: 사용자 이름
SPRING_DATASOURCE_PASSWORD: 데이터베이스 접근 비밀번호
db:
image: mysql:8
environment:
MYSQL_DATABASE: 생성할 데이터베이스 이름
MYSQL_ROOT_PASSWORD: MySQL 루트 사용자 비밀번호
MYSQL_USER: 생성할 사용자 이름
MYSQL_PASSWORD: 생성할 사용자 비밀번호
ports:
- "3306:3306"
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:
- services
더보기
- 여러 개의 Docker 컨테이너를 정의하는 섹션
- app과 db 두 개의 서비스를 정의
- app
더보기
- Spring Boot 애플리케이션을 위한 서비스 정의
- build: .
- 현재 디렉토리(.)를 빌드 컨텍스트로 사용
- 즉, 이 디렉토리에 있는 Dockerfile을 사용하여 이미지를 빌드
- ports
- 호스트의 포트와 컨테이너의 포트를 매핑
- "8080:8080"은 호스트의 포트 8080을 컨테이너의 포트 8080에 매핑
- depends_on
- db 서비스가 먼저 시작된 후에 app 서비스가 시작되도록 설정
- db 서비스가 실행되기 전까지 app 서비스가 시작되지 않도록 보장
- environment
- 환경 변수 설정
- Spring Boot 애플리케이션이 MySQL 데이터베이스에 연결하는 데 필요한 설정
- SPRING_DATASOURCE_URL: MySQL 데이터베이스의 JDBC URL
- mysql : db 서비스의 이름
- 자동으로 Docker 네트워크 내에서 해석
- SPRING_DATASOURCE_USERNAME: MySQL 데이터베이스에 접근할 사용자 이름
- SPRING_DATASOURCE_PASSWORD: MySQL 데이터베이스에 접근할 비밀번호
- SPRING_DATASOURCE_URL: MySQL 데이터베이스의 JDBC URL
- db
더보기
- MySQL 데이터베이스를 위한 서비스 정의
- image
- MySQL 8 이미지를 사용
- Docker Hub에서 mysql:8 이미지를 가져와서 사용
- environment
- MySQL 컨테이너의 환경 변수 설정
- MYSQL_DATABASE: 초기화할 때 생성할 데이터베이스 이름
- MYSQL_ROOT_PASSWORD: MySQL 루트 사용자의 비밀번호
- MYSQL_USER: 새로 생성할 MySQL 사용자의 이름
- MYSQL_PASSWORD: 새로 생성할 MySQL 사용자의 비밀번호
- MySQL 컨테이너의 환경 변수 설정
- ports
- 호스트의 포트와 컨테이너의 포트를 매핑
- "3306:3306"은 호스트의 포트 3306을 컨테이너의 포트 3306에 매핑
- volumes
- db_data 볼륨을 /var/lib/mysql 경로에 마운트
- 이를 통해 데이터가 컨테이너를 재시작해도 유지
volumes
- Docker 볼륨을 정의
- 이 예제에서는 db_data라는 볼륨을 정의하여 MySQL 데이터베이스의 데이터를 저장
5. MySQL
IntelliJ에서 Terminal 사용
1. root 접속
mysql -u root -p
Enter password: ****
2. 데이터 베이스 생성
create database 데이터베이스 이름;
3. 데이터 베이스 확인
show databases;
4. 사용자 계정 생성
CREATE USER '사용자 이름'@'localhost' IDENTIFIED BY '비밀번호';
- localhost는 사용자가 MySQL 서버가 실행 중인 동일한 호스트에서만 접속할 수 있음
5. 사용자 계정에 필요한 권한을 부여
GRANT ALL PRIVILEGES ON mydatabase .* TO '사용자이름'@'localhost';
- GRANT ALL PRIVILEGES : 사용자가 지정된 데이터베이스(mydatabase )에 대해 모든 권한을 갖도록 설정
- ON 데이터베이스이름.* : mydatabase 데이터베이스와 그 안의 모든 테이블을 지정
- TO '사용자이름'@'localhost' : 권한을 부여할 사용자를 지정
- FLUSH PRIVILEGES : 변경 사항을 적용
6. 권한 확인
SHOW GRANTS FOR '사용자이름'@'localhost';
6. IntelliJ Database
1. DataBase 만들기
- 이미지
2. build 해서 .jar 파일 생성
3. .jar 파일 위치 경로 확인
- "E:\00\00\00\프로젝트\build\libs\프로젝트-0.0.1-SNAPSHOT.jar”
4. 위 3. Dockerfile 작성했던 코드에서 jar 파일 경로를 위 생성된 경로로 수정
# JAR 파일을 복사
COPY target/my-spring-boot-app-0.0.1-SNAPSHOT.jar app.jar
# 아래로 수정
COPY build/libs/프로젝트-0.0.1-SNAPSHOT.jar app.jar
7. 도커 이미지 빌드 명령어
docker build -t 태그명 .
현재 디렉토리(.)에 있는 Dockerfile을 사용하여 Docker 이미지를 생성하고, 그 이미지를 태그명이라는 이름(tag)으로 태그
- docker build: Docker 이미지를 빌드하기 위한 기본 명령어
- -t 프로젝트명-app : 생성된 이미지를 태그
- t 옵션은 태그를 지정하는 데 사용
- 태그명 : 생성된 이미지의 이름
.
: Docker 빌드 컨텍스트를 지정- . 는 현재 디렉토리를 의미
- Docker는 이 디렉토리에서 Dockerfile을 찾아 이미지를 빌드
8. 도커 컴포즈 빌드
docker-compose up
- Docker Compose를 사용하여 여러 개의 Docker 컨테이너를 정의하고, 이 컨테이너들을 함께 시작할 때 사용하는 명령어
- docker-compose.yml 파일에 정의된 모든 서비스를 빌드하고 시작
9. 도커 데스크탑 확인
- 이미지 확인
- 컨테이너 확인
- running 잘 돌아가는 지 확인
- 아이콘이 초록불 인지 확인
- 작동 중이 아니면 아이콘이 ‘주황색’