wooing

VM에 각 서비스에 사용할 DB 설치하기 본문

Server

VM에 각 서비스에 사용할 DB 설치하기

우잉_ 2024. 5. 20. 11:15

쿠버네티스로 서비스를 관리할때 DB는 쿠버네티스로 관리되지 않고, 서버에 설치하여 따로 관리한다. 우리는 서비스별로 VM을 분할하여 각 VM에 DB를 설치하려한다. 현재는 온프레미스 환경에 설치하지만 학기 말 카카오 클라우드를 받게되면 빠르게 이관해야하기 때문에 DB 설치를 도커로 하려고 한다.

0. Docker, docker-compose 설치

ssh로 vm에 접속해서 https://haengsin.tistory.com/128 여기 나온 절차를 따라함

Docker 설치 후 permission denied while trying to connect to the Docker daemon socket at unix:~~~오류 발생시 아래 방법으로 해결 가능

https://stackoverflow.com/questions/48957195/how-to-fix-docker-got-permission-denied-issue

Docker-compose 설치

sudo apt-get update
sudo apt-get install docker-compose-plugin

1. 각 DB 설치

MySQL 설치

  1. Mysql 이미지 다운로드 (mysql:버전 으로 입력하면 특정 버전 다운 가능)
docker pull mysql
  1. 설치 확인
docker images
  1. mysql volume 생성
mkdir mysql-docker
docker volume create article-mysql-volume
  1. docker-compose.yml 파일 작성

4-1. docker-compose.yml파일 생성

nano docker-compose.yml

4-2. 작성

volume을 article-volume에 지정했기 때문에 container가 삭제되어도 데이터는 유실되지 않는다.

# 파일 규격 버전
version: "3"
# 이 항목 밑에 실행하려는 컨테이너 들을 정의
services: 
  # 서비스 명
  db:
    # 사용할 이미지
    image: mysql:latest
    # 컨테이너 이름 설정
    container_name: article-mysql
    # 접근 포트 설정 (컨테이너 외부:컨테이너 내부)
    ports:
      - "3306:3306"
    # -e 옵션 
    environment: 
      # MYSQL 패스워드 설정 옵션
      MYSQL_ROOT_PASSWORD: "password"
    # 명령어 실행 (한글 인코딩 관련)
    command:
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
    volumes:
      - article-mysql-volume:/var/lib/mysql  # 볼륨 마운트

volumes:
  article-mysql-volume:  # 볼륨 선언
    name: article-mysql-volume
  1. docker compose 실행
docker-compose up -d
  1. DB 접속

6-1. VM에서 확인

docker exec -it [container_name] bash
mysql -u root -p
[비밀번호 입력]

6-2. 외부에서 확인

내부망에 접속해있는 상태에서 (학교 와이파이 또는 VPN)

Host: DB설치된 VM의 IP

Port: 3306 (Docker compose파일에 외부 port를 3306으로 지정했음)

MongoDB 설치

  1. docker-compose.yml 작성

volumes에 보면 config관련한 volume도 만드는걸 볼 수 있다. mongoDB가 자체적으로 docker-compose run -d 할때 config에 관한 volume을 생성하는데, 이를 지정해주기 위함이다. 처음 실행했을때는 자꾸만 새로운 volume이 생겨나 지정한 volume(article-mongo-volume)을 사용하지 않고 새로 생성하는 줄 알고 오랜 시간 삽질한 결과 연결은 잘 되고 있었으나 config에 관한 문제였음을 알아내었다.

version: '3.7'  # Docker Compose 파일 버전을 명시합니다.

services:
  mongo:
    image: mongo:latest  # MongoDB의 최신 버전을 사용합니다.
    container_name: article-mongo  # 컨테이너에 고유한 이름을 부여합니다.
    environment:
      MONGO_INITDB_ROOT_USERNAME: {ID}  # MongoDB 관리자 계정 이름을 설정합니다.
      MONGO_INITDB_ROOT_PASSWORD: {PWD}  # MongoDB 관리자 비밀번호를 설정합니다.
    ports:
      - "27017:27017"  # 호스트의 27017 포트와 컨테이너의 27017 포트를 연결합니다.
    volumes:
      - article-mongo-volume:/data/db  # article-mongo 볼륨을 MongoDB 데이터 저장소에 마운트합니다.
      - article-mongo-config-volume:/data/configdb
volumes:
  article-mongo-volume:  # article-mongo 볼륨을 명시적으로 선언합니다.
    name: article-mongo-volume
  article-mongo-config-volume:
    name: article-mongo-config-volume
  1. Docker-compose 실행 및 확인

2-1. Docker-compose 실행 및 mongoDB 접속

docker-compose up -d
docker exec -it article-mongo mongosh -u admin -p [password] --authenticationDatabase admin

2-2. 데이터 저장하기

use testDB
db.testCollection.insert({name: "docker-compose test"})
db.testCollection.find({})

2-3. mongoDB 컨테이너 삭제 및 재실행

docker-compose down
docker-compose up -d

2-4. 데이터 유지 확인

2-1의 절차로 mongoDB에 접속 후에 db.testCollection.find({}) 명령어로 제대로 데이터가 들어있는지 확인한다.

  1. 외부에서 확인 (데스크탑의 MongoDB Compass으로 확인)

URI: mongodb://{IP주소}:27017/

username : ID

password : PWD

Authentication Database : admin

2. 서비스 프로젝트 DB 연결

applications.yml파일에 datasource/url을 변경해주면 된다.

[MySQL]

spring:
  datasource:
    # JPA 데이터 소스 설정
    url: jdbc:mysql://[VM IP]:3306/newcord_article_db
    username: {id}
    password: {pwd}
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    hibernate:
      ddl-auto: create # 엔티티 변경을 데이터베이스 스키마에 자동 반영
    show-sql: true # 콘솔에 SQL 로그를 표시
    generate-ddl: true # DDL을 자동 생성
    properties:
      hibernate:
        format_sql: true # SQL 로그를 보기 좋게 포맷
        default_batch_fetch_size: 100 # IN 쿼리의 최대 개수
        dialect: org.hibernate.dialect.MySQL8Dialect

[MongoDB]

  # MongoDB 설정
  data:
    mongodb:
      uri: mongodb://[VM의 IP]:27017
      database: newcord_article_db
      authentication-database: admin # 인증에 사용할 MongoDB의 데이터베이스
      username: {id}
      password: {pwd}

EX) 게시글 서비스 application.yml

spring:
  datasource:
    # JPA 데이터 소스 설정
    url: jdbc:mysql://{IP주소}:3306/newcord_article_db
    username: {ID}
    password: {PWD}
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    hibernate:
      ddl-auto: create # 엔티티 변경을 데이터베이스 스키마에 자동 반영
    show-sql: true # 콘솔에 SQL 로그를 표시
    generate-ddl: true # DDL을 자동 생성
    properties:
      hibernate:
        format_sql: true # SQL 로그를 보기 좋게 포맷
        default_batch_fetch_size: 100 # IN 쿼리의 최대 개수
        dialect: org.hibernate.dialect.MySQL8Dialect

  # MongoDB 설정
  data:
    mongodb:
      uri: mongodb://{IP주소}:27017
      database: newcord_article_db
      authentication-database: admin # 인증에 사용할 MongoDB의 데이터베이스
      username: {ID}
      password: {PWD}

References

https://haengsin.tistory.com/128

https://github.com/occidere/TIL/issues/116

https://poiemaweb.com/docker-mysql

https://docs.docker.com/compose/install/linux/