TIL (23.11.30)
- Mysql DB 정보 옮기기
- NGINX 이미지를 기반으로 Vue.js 배포
Mysql DB 정보 옮기기¶
AWS Lightsail에 올라가 있는 노노그래머스 DB..
생성된 데이터&테이블 그대로 도커 이미지로 구축해서 팀원들께 공유해야했다
version: "3.9"
services:
db:
image: mysql:8.0
restart: always
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: nonogrammers
MYSQL_USER: nonog
MYSQL_PASSWORD: nonogpassword
volumes:
- ./db/mysql/data:/var/lib/mysql
- ./db/mysql/config:/etc/mysql/conf.d
- ./db/mysql/init:/docker-entrypoint-initdb.d
bind-mount로 구축되어 있어서 이걸 어떻게 옮기지.. 하다가
아래 블로그를 참고해서 MySQLWorkbench - Server - Data Export
를 통해 sql 파일을 추출했다
Dockerfile
FROM mysql:8.0
ENV MYSQL_ROOT_PASSWORD rootpassword
ENV MYSQL_DATABASE nonogrammers
ENV MYSQL_USER nonog
ENV MYSQL_PASSWORD nonogpassword
COPY Dump20231130.sql /docker-entrypoint-initdb.d/
빌드해서 돌려보면 테이블이랑 데이터가 온전히 살아있음을 볼 수 있다
KOSA 수업 - Volume¶
Volume을 통해 테이블 데이터가 온전한 채로 유지되는 것을 보고, nonogrammers 데이터로 시도해봤다
docker run --name nonodb -p 3306:3306 -d -v nono-data:/var/lib/mysql nonogram
docker stop nonodb
docker rm nonodb
docker run --name nonotest -p 3306:3306 -v nono-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=1234 mysql
경험한 것은
- 두 개의 mysql 컨테이너가 동시에 사용할 수는 없다 ? ..
nonodb 컨테이너를 3307 포트에 띄운채로 nonotest를 3308에 띄워보려구 했는데 다음과 같은 오류가 발생했다.
한 시스템에서 두 개 이상의 MySQL 인스턴스가 동일한 데이터 파일을 사용하려고 할 때 이런 문제가 발생한다 하여 아 동시에 사용할 수 없구나.. 했다
- 루트 비밀번호 변경이 안되네
Volume을 생성할때의 이미지인 nonogram에서 루트 비밀번호를 rootpassword
로 지정해 놓았기 때문인지 nonotest 컨테이너도 루트 비밀번호를 rootpassword
로 해야만 했다
스프링 부트 프로젝트(springedu2)와 뷰 프로젝트(vue-project) 연동¶
- vue 프로젝트 빌드 시 생성되는 파일들을 스프링 부트 프로젝트의 static 폴더에 저장하도록 빌드 환경 설정
vite.config.js
import { fileURLToPath, URL } from 'node:url' import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' // https://vitejs.dev/config/ export default defineConfig({ plugins: [ vue(), ], resolve: { alias: { '@': fileURLToPath(new URL('./src', import.meta.url)) } }, build: { outDir: '../../springedu2/src/main/resources/static' // 빌드 결과물 저장 경로 }, server: { proxy: { // 스프링 부트와 뷰의 경로가 충돌되지 않도록 스프링 부트 경로 앞에는 /api 붙임 // 포트는 8088 '/api': "http//localhost:8088", } } })
- vue.js 빌드
- 스프링 부트 jar 설정
- application.properties 변경
- jar 생성
- 스프링 부트 프로젝트의 도커 이미지 구축
- MySQL, Spring Boot 컨테이너에서 사용할 네트워크 생성
- mysql run
version: "3.9" services: mysqledu: container_name: mysqledu image: mysql:8.0 restart: always ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: passwordroot MYSQL_DATABASE: mysql MYSQL_USER: user MYSQL_PASSWORD: password volumes: - ./db/mysql/data:/var/lib/mysql - ./db/mysql/config:/etc/mysql/conf.d - ./db/mysql/init:/docker-entrypoint-initdb.d networks: - springboot-mysql-net networks: springboot-mysql-net: external: true
- RUN
if. docker compose를 사용한다면
docker-compose.yml
version: "1"
services:
mysqledu:
container_name: mysqledu
image: mysql:8.0
restart: always
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: passwordroot
MYSQL_DATABASE: mysql
MYSQL_USER: user
MYSQL_PASSWORD: password
volumes:
- ./../../test/db/mysql/data:/var/lib/mysql
- ./../../test/db/mysql/config:/etc/mysql/conf.d
- ./../../test/db/mysql/init:/docker-entrypoint-initdb.d
networks:
- edunet
springedu2:
depends_on:
- mysqledu
container_name: springedu2
build:
context: ./
dockerfile: Dockerfile
networks:
- edunet
ports:
- 8088:8088
restart: on-failure
springedu:
depends_on:
- mysqledu
container_name: springedu
build:
context: ./../springedu
dockerfile: Dockerfile
networks:
- edunet
ports:
- 8089:8089
restart: on-failure
networks:
edunet:
#volumes:
# mysqleduvol:
ngnix 에 Vue.js 의 빌드 파일을 배포하여 컨테이너로 실행¶
# 첫 번째 단계: 빌드 환경
# Node.js 이미지를 기반으로 설정합니다.
FROM node:14 AS build-stage
WORKDIR /app
# 패키지 파일과 잠금 파일을 복사합니다.
COPY package*.json ./
COPY .env ./
# 의존성을 설치합니다.
RUN npm install
# 애플리케이션 소스 코드를 복사합니다.
COPY . .
# 애플리케이션을 빌드합니다.
RUN npm run build
# 두 번째 단계: 프로덕션 환경
FROM nginx:stable as production-stage
# 빌드된 애플리케이션을 Nginx 서버에 복사합니다.
COPY --from=build-stage /app/dist /usr/share/nginx/html
# Nginx 설정 파일을 복사합니다.
COPY default.conf /etc/nginx/conf.d/default.conf
# Nginx의 포트 80을 노출시킵니다.
EXPOSE 80
# Nginx 서버를 실행합니다.
CMD ["nginx", "-g", "daemon off;"]