관리 메뉴

보리차

docker에 mysql 설치하기 본문

프로젝트/자연어처리 팀프로젝트

docker에 mysql 설치하기

보리콩 2021. 12. 3. 20:56

마지막으로 내가 가장 고생했던 mysql설치하는 법이다..

이상하게 시행착오가 많았다.

 

우선 docker mysql 컨테이너를 생성하고 실행해야 하는데 여러 방법이 있지만 나는 docker-compose.yml 파일을 이용해 생성을 했다.

version: '3'  # 파일 규격 버전

services:  
        db:  # 서비스 명
                image: mysql:latest  # 사용할 이미지
                container_name: mysql  # 컨테이너 이름 설정
                environment:
                        - MYSQL_DATABASE=emotionDiary  # db 이름
                        - MYSQL_ROOT_PASSWORD=password
                        - TZ=Asia/Seoul
                command:
                        - --lower_cate_table_names=1  # 대소문자 구분
                        - --character-set-server=utf8mb4
                        - --collation-server=utf8mb4_unicode_ci
                volumes:
                        - ./db:/var/lib/mysql  # db 볼륨 처리
                ports:
                        - 3306:3306  # 접근 포트 설정 (외부:내부)

 

 

다음과 같이 작성한 후 docker-compose 파일을 실행한다.

docker-compose up -d

여기서 docker-compose 명령어가 없으니 설치하라는 메세지가 뜬다. 당황하지 말고 하란대로 설치해주면 된다.

 

 

 

이미지와 컨테이너가 잘 생성됐음을 확인한 후 컨테이너에 접속한다.

docker exec -it mysql /bin/bash

 

 

mysql 접속

mysql>mysql -u root -p 비밀번호

 

 

사용자 확인

mysql>select user, host from mysql.user;

 

mysql 유저 생성

mysql>CREATE USER '계정명'@'%' IDENTIFIED BY '비밀번호';

 # 이때 % 는 모든 외부접속을 허용하는 옵션이다.

 

 

사용자 권한 부여

mysql> grant all privileges on <DB이름>.<테이블이름> to '사용자id'@호스트;
mysql> flush privileges;  // 변경된 권한 적용

위의 명령어에서 all 대신 insert, select, update 등으로 바꾸면 특정 권한만 부여할 수 있다.

DB이름.테이블이름 대신 DB이름.*로 하면 해당 DB의 모든 테이블에 대한 권한을 부여할 수 있다 (*.*은 모든 접근 가능)

 

 

이렇게 해주면 외부에서 db에 접근을 할 수 있다.

 

 

여기서 끝내면 안되고 다시 backend 컨테이너에 접속해준다.

현재 flask 와 mysql을 연동하는 코드는 config.py에 작성되어 있는데 다음과 같다.

SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://'+username+':'+db_pw+'@localhost:3306/diary?charset=utf8mb4'

여기서 localhost 를 127.17.0.1 로 수정해줘야 한다. 이 부분은 정확히 이해하지 못했는데 나름 이해한 바로 설명을 해보자면 localhost는 같은 vm 내부에 있는 mysql에 접근할 경우를 말하지만 우리는 mysql과 flask가 다른 container에 각각 배포했기 때문에 host 에 open해놓은 3306 port를 통해 접속해야한다. 그래서 mysql의 ip주소를 입력해주는 것 같다. (틀린 내용이라면 댓글로 남겨주세요..)

 

 

아무튼 flask 설정까지 수정했다면 이제 app.py가 있는 폴더로 가서 db를 초기화해준다. 

flask db init
flask db migrate
flask db upgrade

flask가 mysql에 잘 접속했다면 에러가 뜨지않고 무사히 마이그레이션을 완료할 수 있다. 

 

 

끝!!

 

정말이지 험난한 여정이었다. 여기에 미처 적지 못한 수많은 오류들이 더 있었는데 같은 글에 적으면 너무 헷갈릴거 같아서 언젠가 시간이 남을 때 따로 작성해보겠다. 아무튼 코치님께서 도와주시지 않았다면 해결하지 못했을 것 같다 ㅜㅜ 특히 mysql같은 경우 항상 로컬에서 접속하도록 작업해왔는데 이번에 처음으로 외부접속 설정을 해보면서 이해가 잘 가지 않아 삽질을 했던 것 같다. 사실 아직도 다 이해되진 않지만 일단 서버가 무사히 잘 돌아가는 것에 의의를 두며.. 마무리 하겠다.

 

진짜 끝!!

'프로젝트 > 자연어처리 팀프로젝트' 카테고리의 다른 글

docker에 Flask 배포하기  (0) 2021.12.03
docker 환경 설정하기  (0) 2021.12.03