프로젝트 과제를 하면서 개발환경에서 MySQL을 쓰게 되고 컴퓨터를 시작하면서 계속해서 MySQL서버가 필요하지 않을때도 프로세스가 점유되는 것이 불편하여 이번에는 Docker라는 것을 이용해서 원하는 때에만 MySQL을 사용할 수 있게 만들도록 만들려고 한다.
기본적으로 Docker를 사용하여 컨테이너를 띄워 사용하기위해 기본적인 지식이 필요로한다.
Docker란 무엇인가?
Docker는 애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있는 소프트웨어 플랫폼입니다. Docker는 소프트웨어를 컨테이너 라는 표준화된 유닛으로 패키징하며, 이 컨테이너에는 라이브러리, 시스템 도구, 코드, 런타임 등 소프트웨어를 실행하는 데 필요한 모든 것이 포함되어 있습니다. Docker를 사용하면 환경에 구애받지 않고 애플리케이션을 신속하게 배포 및 확장할 수 있으며 코드가 문제없이 실행될 것임을 확신할 수 있습니다.
Docker 작동방식코드를 실행하는 표준방식으로 제공한다. Docker는 컨테이너를 위한 운영체제로 , 가상머신이 서버 하드웨어를 가상화 하는 방식과 비슷하게 컨터에너는 서버 운영 체제를 가상화한다. Docker는 각 서버에 설치되면 컨테이너를 구축, 시작 또는 중단 하는 간단한 명령어를 제공.
https://captcha.tistory.com/49
먼저 도커를 사용하기위해 도커 데스크톱을 설치를 해주었다.
https://www.docker.com/products/docker-desktop/
설치 를 해준 뒤 윈도우는 cmd를 통하여 환경변수를 설정하면 바로 도커에 관한 명령어를 사용하여 이미지를 다운로드 그리고 컨테이너를 올릴 수 가 있다.
docker pull mysql
을 명령어로 적어 mysql의 최신버전의 이미지를 dockerHub에서 받아와
docker run --name mysql-container -e MYSQL_ROOT_PASSWORD=(root 비밀번호) -d -p 3306:3306
명령어를 통하여 컨테이너를 올려준다. 나는 3번 시도를 했지만 처음 시도 했을 때는 이미 MySQL서버가 설치되어서 외부포트를 3306을 가지고 있어서 오류가 걸려 외부포트를 3305로 변경후 시도를 하였지만 이미 첫 명령어로 컨테이너가 생성되어 있었다. 그래서 생성된 컨테이너를 삭제후 3번째 시도를 한 뒤에 정상적으로 컨테이너를 올리게 되었다.
docker ps -a
라는 명령어를 통하여 모든 컨테이너의 상태를 알 수 가 있다 생성된mysqlcontainer 외에 강의를 들으면 생성한 postgres 컨테이너가 있고 이것은 작동을 중지 시켜놓은 상태라 exited라고 되어 있다.
docker exec -it mysql-container(컨테이너 이름) bash 를통하여
컨테이너에 접속할 수있고 그뒤로는 mysql에 접속하는 것과 다름이 없었다.
db에 TodoList라는 db를 생성시켜주고
유저를 생성 해 준뒤에
권한 설정을 해주고
권한 설정을 해주면된다.
spring:
profiles:
active: dev
datasource:
url: jdbc:mysql://localhost:3305/TodoList
username: user
password: 사용자 비밀번호
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
hibernate:
ddl-auto: update
properties:
hibernate:
show_sql: true
format_sql: true
use_sql_comments: true
jwt:
secret:
key:
하지만 application.yml을 설정한뒤 application을 실행 시켰을때는
java.sql.SQLException: Access denied for user 'user'@'172.17.0.1' (using password: YES)
이러한 오류가 떠서
해결할 방법을 물색해 봤을때 해결 법은 도커는 기본적으로 172.17.0.1이라는 ip를 가지고 있어서 유저라는 사용자는 localhost로 설정해 둬서 컨테이너안의 localhost임으로 유저를 생성 해 주었을때 localhost가 아닌
'%'을 이용하여 접속을 바꾸어 주어야 했었다.
CREATE USER 'user'@'%' IDENTIFIED BY 'your_password';
GRANT ALL PRIVILEGES ON TodoList.* TO 'root'@'%';
FLUSH PRIVILEGES;
다시 유저를 생성해주고 application을 실행 시켰을때 정상적으로 동작하는 것을 확인 했다.
기본적으로 만들어진 회원가입 api를 이용하여 도커 컨테이너의 데이터베이스에 정상적으로 데이터가 저장되는지 확인해 보았다.
그 결과 정상적으로 컨테이너 db에 데이터가 정상적으로 작동하는 것을확인 하였다.
이 시도를 토대로 나중에는 redis를 사용하여 휘발성 데이터를 저장하는 용도로 mysql과 같이 이중으로 db를 사용하는 것과 컨테이너에 springboot 빌드 파일과 mysql redis를 같이 도커에 올려서 사용해 보는 것을 해보려고 한다.
참고 글
https://aws.amazon.com/ko/docker/
https://hipopatamus.tistory.com/109
'내일배움캠프' 카테고리의 다른 글
내일 배움 캠프 최종 프로젝트 - CI/CD 설계 전 서버 구축(GCP Computing engine) (0) | 2024.04.09 |
---|---|
내일배움캠프 최종프로젝트 - 캐싱 적용-1 (0) | 2024.04.04 |
내일 배움 캠프 TIL -QueryDSL을 사용해서 수정일 순으로 정렬해서 가져오자 (0) | 2024.03.11 |
내일배움캠프TIL - @RestControllerAdvice (0) | 2024.02.14 |
내일배움캠프TIL - ResponseEntity (0) | 2024.02.06 |