| Category | version || option |
|---|---|
| Project | Gradle-Grrovy |
| Language | Java |
| Spring Boot | 3.3.4 |
| Packagin | Jar |
| MYSQL | 8.0.39 |
| Docker-compose | v2.29.2-desktop.2 |
├── build
│ └── libs
│ └── *SNAPSHOT.jar
├── build
│ └── resources
│ └── main
│ └── application.yml
├── .
│ └── Dockerfile
├── .
│ └── docker-compose.yml
Docker Compose와 Dockerfile의 차이점
Dockerfile
사용자가 이미지를 조립하기 위해 호출할 수 있는 명령을 담은 간단한 텍스트 파일
Docker Compose
- docker-compose.yml에서 앱을 구성하는 서비스를 정의하여 격리된 환경에서 함께 실행할 수 있도록 함
- docker-compose up을 실행하기만 하며 하나의 명령으로 앱을 실행
- 프로젝트의 docker-compose.yml에 build명령을 추가하면 Docker compose가 Dockerfile을 사용
Docker 워크플로▶ 각 이미지에 적합한Dockerfile을 빌드 ▶compose를 사용하여build명령을 사용하여 이미지를 조립
FROM openjdk:17-oracle
ARG JAR_FILE=build/libs/*SNAPSHOT.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
FROM : base-imageARG : 변수 설정 (빌드파일의 경로)COPY : 빌드파일을 컨테이너로 복사ENTRYPOINT : jar 파일 실행spring:
main:
debug: true
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://[database container name]:3306/[database table name]?createDatabaseIfNotExist=true
username: [username]
password: [password]
jpa:
hibernate:
ddl-auto: update
properties:
hibernate:
format_sql: true
show_sql: true
logging:
level:
org:
hibernate:
type:
descriptor:
sql: trace
db-mysql : 도커환경에서 mysql이 구동되는 컨테이너의 이름(호스트)
3306 : Port
mydb : 데이터베이스 이름
ddl-auto : hibernate가 데이터베이스 스키마를 자동으로 업데이트
format_sql : hibernate가 생성한 SQL 쿼리를 포맷팅하여 출력
show_sql : 콘솔에 SQL 쿼리를 출력
logging:
level:
org:
hibernate:
type:
descriptor:
sql: trace
logger를 이용해 쿼리를 보여줌
version: "3.7"
services:
db:
image: [docker hub id]/[repository]:[tag]
restart: always
container_name: db-mysql
environment:
MYSQL_DATABASE: [database table name]
MYSQL_ROOT_PASSWORD: [root password]
ports:
- "3306:3306"
networks:
- [docker networks name]
volumes:
- ./db:/var/lib/mysql
spring-boot-app:
image: [docker hub id]/spring-boot-demo:springboot1.0
container_name: springboot
ports:
- "8080:8080"
depends_on:
- db
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://[database container name]:3306/[database table name]?createDatabaseIfNotExist=true
SPRING_DATASOURCE_USERNAME: [database username]
SPRING_DATASOURCE_PASSWORD: [database password]
networks:
- springboot-mysql-net
networks:
[docker network name]:
driver: bridge
@Entity : 데이터의 집합을 의미하며 저장되고 관리되어야 하는 데이터, 실질적으로 DB의 테이블과 매칭@Id : 데이터베이스 테이블의 기본 키(PK)와 객체의 필드를 매핑시켜주는 어노테이션GeneratedValue : 기본 키를 자동 생성해주는 어노테이션 @GeneratedValue( strategy = GenerationType.IDENTITY )@Generated : 사람이 만든 소스가 아닌, 다른 소스 자동 생성기가 생성한 코드를 지칭할 때 사용하는 어노테이션name: Deploy To EC2
on:
push:
branches:
- main
jobs:
Deploy:
runs-on: ubuntu-latest
steps:
- name: docker hub 로그인
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_ID }}
password: ${{ secrets.DOCKER_PW }}
- name: SSH(원격접속)로 EC2에 접속하기
uses: appleboy/ssh-action@v1.0.3
env:
APPLICATION_PROPERTIES: ${{ secrets.APPLICATION_PROPERTIES }}
DOCKER_COMPOSE_YML: ${{ secrets.DOCKER_COMPOSE_YML }}
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_PRIVATE_KEY }}
envs:
APPLICATION_PROPERTIES, DOCKER_COMPOSE_YML
scripts_step: true
script: |
# 환경 설정
cd /home/ubuntu/spring-boot
rm -rf src/main/resources/application.yml
rm -rf docker-compose.yml
git pull origin main
echo "$APPLICATION_PROPERTIES" > src/main/resources/application.yml
echo "$DOCKER_COMPOSE_YML" > docker-compose.yml
sudo ./gradlew clean build -x test
# port kill
sudo fuser -k -n tcp 8080 || true
sudo fuser -k -n tcp 3306 || true
# 실행 중인 컨테이너 삭제
sudo docker rm -f springboot
sudo docker rm -f db-mysql
# container pull
sudo docker pull ${{ secrets.DOCKER_ID }}/spring-boot-demo:mysql1.0
sudo docker pull ${{ secrets.DOCKER_ID }}/spring-boot-demo:springboot1.0
# container 구동
sudo docker-compose up -d
# log
sudo docker ps -a
nohup java -jar build/libs/*SNAPSHOT.jar > ./output.log 2 >& 1 &
도움받은 블로그
구축 환경
https://jnsodevelop.tistory.com/90
Dockerfile 및 docker-compose.yml 차이
ttps://velog.io/@s2moon98/dockerFile%EA%B3%BC-docker-compose.yml-%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90
JPA 기본키
https://ttl-blog.tistory.com/123