일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- bitmask
- java
- 백엔드 개발
- 카카오엔터프라이즈
- DP
- DFS
- 함수 종속성
- MESSAGEBROKER
- 자바
- 코드트리
- 소프티어
- 완전탐색
- CODETREE
- 정렬
- 카카오클라우드
- 인가인증
- jsonwebtoken
- dockercompose
- 동전 퍼즐
- sonarqube
- db
- s3
- objectstorage
- 구름
- softeer
- bfs
- 알고리즘
- es_java_home
- On-Premise
- BFS
- Today
- Total
wooing
VM에 각 서비스에 사용할 DB 설치하기 본문
쿠버네티스로 서비스를 관리할때 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 설치
- Mysql 이미지 다운로드 (mysql:버전 으로 입력하면 특정 버전 다운 가능)
docker pull mysql
- 설치 확인
docker images
- mysql volume 생성
mkdir mysql-docker
docker volume create article-mysql-volume
- 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
- docker compose 실행
docker-compose up -d
- 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 설치
- 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
- 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({}) 명령어로 제대로 데이터가 들어있는지 확인한다.
- 외부에서 확인 (데스크탑의 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
'Server' 카테고리의 다른 글
도메인간 높은 결합도로 인한 순환참조를 해결하는 방법 (0) | 2024.05.20 |
---|