도커 컨테이너에 MySQL 올리기

JungWooLee·2022년 9월 25일
0

도커

목록 보기
1/4
post-thumbnail

보통 프로젝트내에서는 인메모리인 H2 데이터베이스를 통하여 테스트나 검증을 마친 뒤에 실제 운영될 DBMS로 이전작업을 거치게 된다

스프링에서 사용되는 JPA 의 장점중 하나는 데이터베이스에 종속되지 않는다는 점이다.
즉, native query 를 통하여 특정 DBMS에만 있는 내장 함수를 쓰지 않는 이상 JPA 는 엔티티 객체를 중심으로 JPQL (객체지향언어 쿼리) 를 통하여 쿼리를 수행하게 된다. 이때에 특정 DBMS의 언어에 맞춘 것이 아닌 프로젝트내의 엔티티간의 관계를 통하여 JPQL 을 수행하게 되어 DBMS 에 종속되지 않는 것이다

만약 운영중인 DBMS 를 MySQL 에서 MS-SQL 로 이전하고 싶다면 도커 컨테이너를 통한 관리가 유지보수적이나 CPU, 메모리 적인 측면에서 훨씬 효율적으로 다가온다

1. 도커 설치하기

URL : https://docs.docker.com/engine/install/

각 운영체제 ( 맥, 리눅스, 윈도우 ) 에 따라 도커를 설치해준다
※ 윈도우 사용자라면 윈도우 10 이상부터 지원됩니다

도커를 사용하기 위한 가장 쉬운 방법은 도커 데스크톱을 설치하는것이다.
만약 깃허브 데스크톱을 사용해보았다면 이해가 쉬울텐데.. 가령 깃허브에서 파일을 올리고자 한다면?

//저장소 생성 및 연결
$ git init
$ git remote add origin [원격저장소 주소]
$ git branch -m master main

//파일 업로드
$ git pull origin main
$ git add .
$ git commit -m "commit message"
$ git push origin main

다음과 같은 명령어들을 수행하여야 하는데 데스크톱을 사용한다면 보기 편한 UI 와 쉬운 사용법으로 그저 파일을 Drag and Drop 해주면 해결된다

도커 또한 동일하다
물론 명령어를 숙지하고 있는것이 개발자로서의 소양이지만 보다 빠른 생산성을 추구하기 위해 도커 데스크톱을 사용하는 것에 더욱 이점이 있다 생각된다

윈도우 환경에서 도커 설치하기

https://docs.docker.com/desktop/install/windows-install/ 에 접근하여 윈도우용 도커 데스크톱을 설치한다

※ 윈도우의 경우 도커 데스크톱이 auto start up 되지 않음, 재부팅후 도커 데스크톱을 실행하는 것을 권장
※ 반드시 Admin 계정에서 모든 권한이 있는 상태에서 도커 데스크톱을 다운받아야 함

만약 에러시에 시도해볼만한 사항들

아무런 설정사항을 하지 않은 컴퓨터의 경우 가상화에 대한 설정이 안되어 있을 가능성이 크다


hardware assisted virtualization and data execution protection must be enabled in the bios. see https://docs.docker.com/desktop/windows/troubleshoot/#virtualization

가령 다음과 같은 가상화에 대한 설정 에러의 경우 해결법은 다음과 같다

1. Hyper-V 에 대한 설정 모두 설치

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All

2. Hyper-V 에 대한 설정 켜기

3. BIOS 에서 가상화 기능 켜기

윈도우 부팅시 F2 를 누르고 BIOS 설정 접근
Virtualization Tecnology 를 켜기
각 컴퓨터마다 BIOS 설정란이 다를 수 있지만 UEFI의 경우 Advanced - CPU CONFIGURATION - Intel Virtualization Technology 에서 Enabled 로 변경

확인해보기

또한가지 WSL 2 installation is incomplete 에 대한 에러가 뜬다면 해결법은 참고링크 를 통하여 참고하였다

설치가 마무리 되었다면 아래와 같이 버전확인이 가능


2. MySQL 도커에 연결하기

도커 명령어

docker run --detach --env MYSQL_ROOT_PASSWORD=dummypassword --env MYSQL_USER=social-media-user --env MYSQL_PASSWORD=dummypassword --env MYSQL_DATABASE=social-media-database --name mysql --publish 3306:3306 mysql:8-oracle

  • MySql 이미지를 찾을 수 없다고 뜨겠지만 곧 이미지를 다운받고 컨테이너를 생성하는 것을 볼 수 있다

그렇다면 명령어를 분석해보자
--env : 컨테이너의 환경변수
--name : 컨테이너의 이름
--publish : publishing 되는 포트
mysql:8-oracle : 이미지 이름
--env MYSQL_USER=social-media-user
--env MYSQL_PASSWORD=dummypassword --env → DB 접속 크리덴셜
--env MYSQL_DATABASE=social-media-database : social-media-database 이름의 데이터베이스 생성
--publish 3306:3306 : 어떤 운영체제에서든 실행시키고자 한다면 포트를 지정하여야 함. 이경우 3306 포트를 사용

✔ : 8-oracle 태그는 어떤 운영체제에서든 실행이 가능하다

만약 생성한 컨테이너를 도커가 실행하지 못한다면


해당 포트가 현재 listening 즉, 사용중이기 때문에 연결할 수 없다고 뜬다
나의 경우 Mysql이 시작프로그램으로 실행되고 있어 작업관리자에서 mysql을 제거하였지만
이외에는 cmd 에서 netstat -a -o 를 통하여 pid를 확인하고 taskkill /f /pid {pid번호} 로 kill 해주면 가능할 것이다

Spring boot 프로젝트와 연결하기

도커 컨테이너를 생성할때 쓰였던 환경변수를 참고하여 application.properties 를 수정해준다

주의

기존 H2 DB 에서는 엔티티를 참고하여 Auto Configuration 으로 DDL 명령문을 수행하여 자동으로 테이블을 생성해주었지만 다른 데이터베이스를 연동하여 사용할때에는 그렇지 않다

그렇기에 아래와 같은 설정을 application.properties 에 추가한다

또한 추가적으로 dialect 설정을 하여 데이터베이스 유형에 맞게 지정할 수 있게 합니다
✔ : 이런 Dialect 설정은 애플리케이션 실행 시, 연결되어있는 DB에 알맞게 자동으로 지정되게 되므로 굳이 설정하지는 않아도 되는 부분입니다 ( 오히려 다른 DBMS 의 dialect 를 설정했다면 에러가 날 수 있음 )

SQL database 모니터링하기

https://dev.mysql.com/doc/mysql-shell/8.0/en/mysqlsh.html 에서 Installing MySQL Shell 을 다운로드 해준다

설치후 명령 프롬프트를 통하여 mysqlsh 를 실행하고 데이터베이스에 연결시킨다
\connect {데이터베이스이름}@{서버}:{포트}

이후 스키마 등록후 \sql 을 입력한뒤 쿼리를 날리면 정상적으로 데이터베이스를 확인해볼 수 있다

만약 IntelliJ 를 쓰고 있다면 이렇게 mysqlsh 까지 설치할 필요는 없어보인다

다음과 같이 IntelliJ 내부 데이터베이스와 연동하여 연결해주면 된다


정리

휘발성이 없는 데이터베이스를 연동하여 지속적으로 데이터를 적립해나갈 수 있다

H2-DB 는 테스트용으로 적합하지만 유저의 정보가 애플리케이션이 재실행마다 초기화 되기때문에 지속적으로 모니터링하는데에는 한계가 분명히 존재한다

도커를 굳이 사용하지 않아도 SpringDBMS 를 연동하는데에는 지장이 없다.
다만 도커의 사용 장점을 보자면
1. 유동적인 DBMS 변경이 가능하다
2. 사용하지 않는 데이터의 경우 관리가 힘든데 도커 컨테이너를 통하여 유동적으로 컨테이너 자체를 삭제하거나 변경하기에 용이하다
3. 기타 VM 과는 달리 CPU 에 대한 자원의 낭비에 대한 걱정이 없다
4. 운영체제에 종속되지 않는다 ( 가령 MAC 의 경우 Oracle 을 지원하지 않는데 도커를 사용하여 컨테이너에서 실행시킴으로서 오라클 DBMS 를 프로젝트에서 사용할 수 있다 )

0개의 댓글