YS's develop story

Spring, Docker에서 MySQL 데이터베이스 컨테이너 설정하기 본문

Spring

Spring, Docker에서 MySQL 데이터베이스 컨테이너 설정하기

Yusang 2023. 11. 19. 23:07

 

 

docker-compose.yml 설정 파일

version: '3'
services:
  travel-db:
    container_name: test
    build:
      context: ./database
      dockerfile: Dockerfile
    ports:
      - "3307:3306"
    restart: always
    healthcheck:
      test: [ "CMD", "mysqladmin" ,"ping", "-h", "localhost" ]
      timeout: 30s
      retries: 3
    networks:
      - network

networks:
  network:

container_name -> 컨테이너의 이름을 test로 설정합니다.

build 섹션: 도커 이미지를 빌드하는 데 필요한 설정입니다.

  • context: ./database: Dockerfile 및 다른 빌드 컨텍스트 파일이 있는 디렉터리를 지정합니다.
  • dockerfile: Dockerfile: 사용할 Dockerfile의 이름을 지정합니다.

ports: - "3307:3306": 호스트의 포트 3307을 컨테이너의 포트 3306으로 매핑합니다.

restart: always: 컨테이너가 종료되면 항상 다시 시작되도록 설정합니다.

healthcheck: 컨테이너의 상태를 확인하는 데 사용됩니다.

   - test: [ "CMD", "mysqladmin" ,"ping", "-h", "localhost" ]: MySQL 서버에 ping을 보내는 테스트 명령을 정의합니다.

networks: - network: networks 섹션에서 정의한 network에 컨테이너를 연결합니다.

 

이렇게 docker-compose.yml 파일을 사용하면 docker-compose up 명령을 통해 MySQL 데이터베이스 컨테이너를 시작하고 설정할 수 있습니다.

컨테이너는 호스트의 3307 포트를 통해 액세스 할 수 있고, Docker Compose는 정의된 네트워크를 통해 컨테이너 간 통신을 관리합니다.

 

 

 

최상단에 database폴더를 만들고 Dockerfile 생성

 

 

Dockerfile

FROM mysql:latest

MAINTAINER liyusang799@gmail.com

COPY init.sql /docker-entrypoint-initdb.d

ENV MYSQL_ROOT_PASSWORD=root

VOLUME /var/lib/mysql

EXPOSE 3307

 

FROM mysql:latest

이 부분은 기본 이미지로서 공식 MySQL Docker 이미지를 사용한다는 것을 나타냅니다.

latest 태그를 사용하여 가장 최근 버전의 MySQL 이미지를 기반으로 컨테이너를 생성합니다.

 

MAINTAINER liyusang799@gmail.com

MAINTAINER는 이미지의 작성자를 나타냅니다.

 

COPY init.sql /docker-entrypoint-initdb.d 

COPY 명령어는 로컬 파일 시스템의 init.sql 파일을 컨테이너 내부의 /docker-entrypoint-initdb.d디렉터리로 복사합니다. 이 디렉터리는 MySQL 컨테이너가 초기화 SQL 스크립트를 실행하는 데 사용되는 특별한 디렉터리입니다.

 

ENV MYSQL_ROOT_PASSWORD=root

이 부분은 MySQL 루트 사용자의 비밀번호를 설정합니다. 

 

VOLUME /var/lib/mysql 

이 명령어는 MySQL이 데이터를 저장하는 디렉터리를 볼륨으로 지정합니다.

데이터베이스 파일과 같은 영속적인 데이터를 저장하기 위해 볼륨을 사용하는 것이 좋습니다.

 

EXPOSE 3307 

이 명령어는 Docker 컨테이너가 호스트 머신에 노출할 포트를 지정합니다. 여기에서는 MySQL이 사용하는 기본 포트인 3306을 3307로 매핑하고 있습니다. 호스트와 컨테이너 간의 포트 매핑을 통해 호스트에서 MySQL 서버에 접근할 수 있습니다.

 

 

init.sql

alter user 'root'@'localhost' identified with caching_sha2_password by 'root';
flush privileges;

create database if not exists travel;

use travel;

 

 

application.yml

spring:
  profiles:
    include:
      core
    active: dev
  config:
    import: optional:file:.env[.properties]

 

 

application-core.yml

server:
  port: 8080
  error:
    include-message: always

 

 

application-dev.yml

spring:
  config:
    activate:
      on-profile: dev

  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3307/travel?characterEncoding=UTF-8
    username: root
    password: root

  jpa:
    show-sql: true
    hibernate:
      ddl-auto: update
    properties:
      hibernate:
        format_sql: true
        dialect: org.hibernate.dialect.MySQLDialect

logging:
  level:
    "[org.springframework.security]": DEBUG
    org.hibernate.SQL: DEBUG

 

 

 

이제 docker-compose.yml 파일 실행 후 spring 실행해서 생성해 두었던 Entity가 생성되는지 확인해 볼 것입니다.

 

docker-compose.ym 실행 -> 컨테이너가 잘 생성된 모습

 

 

아까 설정했었던 값으로 연결 및 Test Connection 성공

 

 

Spring 실행 시 생성해 두었던 Entity들을  jpa가 테이블로 생성해 주는 것을 확인

 

Comments