docker-compose 란?
docker compose는 여러 개의 docker container를 모아서 관리하기 위한 툴이다.
docker compose를 이용해 프론트엔드 서버, 벡엔드 서버, 데이터베이스 서버를 연결하여 동작시키고 해당 컨테이너들을 관리할 수 있다.
docker-compose 설정 (MariaDB)
docekr compose는 docker-compose.yml 이라는 파일을 통해 설정할 수 있다.
version: "3"
services:
mariadb:
image: mariadb
container_name: "database"
ports:
- '13306:3306'
volumes:
- ./mariadb-init.d:/docker-entrypoint-initdb.d
command:
- '--character-set-server=utf8mb4'
- '--collation-server=utf8mb4_unicode_ci'
environment:
TZ: "Asia/Seoul"
MYSQL_DATABASE: ${MARIADB_DATABASE}
MYSQL_PASSWORD: ${MARIADB_PASSWORD}
MYSQL_ROOT_HOST: '%'
MYSQL_ROOT_PASSWORD: ${MARIADB_PASSWORD}
restart: always
version
docker compose의 파일 포맷 버전을 지정한다.
services
docker compose로 관리할 docker container를 적어준다. (당연히 여러개도 가능하다)
image
사용할 이미지와 버전을 설정해준다. Docker Hub에 있는 이미지를 사용할 수도 있고, 직접 커스텀 할 수도 있다.
ports
'호스트에서 접속할 외부 포트:도커 내부의 실제 포트' 로 작성해주면 된다.
(소소한 트러블 슈팅) 포트번호를 입력할 때에는 따옴표 안에 작성해야 한다. YAML 문법에서 숫자:숫자 는 시간으로 해석하기 때문이다.
volumes
호스트의 파일과 도커의 사이의 마운트할 볼륨을 지정해준다.
mariadb-init.d 폴더의 파일이 컨테이너의 docker-entrypoint-initdb.d 폴더에 마운트 되어, 도커가 처음 시작되었을 때 해당 폴더의 sql 파일들이 실행된다.
CREATE USER 'admin'@'localhost' IDENTIFIED BY '12192152';
CREATE USER 'admin'@'%' IDENTIFIED BY '12192152';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%';
위와 같이 도커 실행 시 환경 변수로 설정해둔 사용자를 생성하고 권한을 주도록 하였다. 또한 추후에 table을 만드는 sql문을 추가할 예정이다.
env_file
.env 파일의 위치로 지정해준다. (docker-compose.yml이 있는 위치에 .env를 만든다면 따로 설정을 하지 않아도 된다)
.env 파일을 사용하는 이유는 데이터베이스 암호 등과 같은 보안 사항이 외부로 유출되는 것을 방지하기 위함이다.
나와 같은 경우에는 아래와 같이 .env 파일에 데이터베이스 암호와 데이터베이스 이름을 설정해두었다.
.env
MARIADB_DATABASE=diary_db
MARIADB_PASSWORD=12192152
꼭 빈칸 없이 작성해야한다.
아래와 같이 cat 명령어로 알맞은 위치로 설정했는지 확인해볼 수 있다 :ㅇ
command
컨테이너가 실행될 때 함께 수행될 명령어를 정의한다.
environment
이미지가 사용할 환경 변수를 적어준다.
나는 env_file 옵션으로 환경변수가 들어있는 파일을 따로 설정해주었다.
restart
docker container가 다운되었을 경우, 항상 재시작하라는 설정이다.
Docker 이미지 생성
spring boot를 도커로 실행하기 위해서 이미지를 만들어야한다.
Dockerfile로 이미지를 생성하여 docker-compose에서 사용해보자.
또한 개발용/배포용으로 나누어 사용할 것 이기 때문에 따로 profile을 이용해 환경을 설정할 것이다.
dockerfile
FROM openjdk:11-jdk
RUN apt-get update && apt-get -y install sudo
ARG JAR_FILE="build/libs/simple-*.jar"
COPY ${JAR_FILE} app.jar
ENV PROFILE local
ENTRYPOINT ["java", "-Dspring.profiles.active=${PROFILE}", "-jar","/app.jar"]
위와 같이 profile을 local로 설정하면 스프링 부트가 실행될 때 application-local.yml 파일에 정의된 설정대로 어플리케이션이 실행된다.
application-local.yml (개발용)
spring:
datasource:
driver-class-name: org.mariadb.jdbc.Driver
url: jdbc:mariadb://localhost:13306/diary_db?characterEncoding=UTF-8&serverTimeZone=Asia/Seoul
username: admin
password: 12192152
나는 해당 파일을 gitignore에 추가해두었기 때문에 username과 password를 그대로 작성했다. 각자의 상황에 따라 환경변수로 설정을 고려하자.
Spring boot 실행
1️⃣ docker를 실행한다.
2️⃣ docker-compose.yml이 있는 위치에서 docker-compose up -d 명령어로 docker compose를 실행한다.
3️⃣ 스프링부트를 실행한다.
그럼 실행 성공 🥹
+ 나의 프로젝트 구조는 다음과 같다 !
참고
https://unpasoadelante.tistory.com/197
'Server > Spring boot' 카테고리의 다른 글
[Spring boot] security + Oauth2로 구글 로그인 구현하기 (1) | 2023.05.01 |
---|---|
[Spring boot] security + Oauth2로 구글 로그인 구현하기 - OAuth 서비스 등록 (0) | 2023.04.29 |
[Querydsl Expressions] Querydsl에서 date format 하기 (0) | 2023.02.07 |
Spring Boot + AWS S3를 이용해 파일 업로드/삭제하기 (0) | 2023.01.26 |
[Swagger 3] Swagger2에서 달라진 것들 (0) | 2022.11.11 |