3. Wantedlab - Docker로 배포하기 (회사 정보를 관리하는 API)

문승준·2021년 11월 17일
0
post-thumbnail

이번에는 기능 구현이 아니라 Docker를 활용해 배포환경을 만드는 역할을 맡았다. Docker-compose를 활용해 RDS를 사용하지 않고 MySQL 서버 컨테이너와 API 서버 컨테이너를 같이 run 해보기로 했다.

과제 프로젝트 소개

제출 과제 레포지토리 링크

API 문서 링크


개발 과정

1일차 - Docker와 MySQL

  • 기능구현팀이 개발을 하는 동안 FastAPI 튜토리얼로 간단한 API를 만들어보고 로컬환경에서 Docker를 이용해 서버를 띄워보기로 했다. mysql을 연결해 Sqlalchemy orm을 이용했다.

  • 환경변수를 관리하기위해 .env 파일을 local과 deploy로 나누었다. compose 폴더를 만들어 로컬개발과 배포환경을 나누어 Dockerfile을 각각 작성했다. docker-compose 를 위한 yml 파일도 환경에 따라 나누어 작성했는데, 이런 과정을 통해 환경에 따라 다른 설정을 어떻게 관리하는지 알 수 있었다.

  • FastAPI를 공부하는 것 보다 어플리케이션과 DB 서버를 동시에 배포하는 것을 목표로 했다. 문제는 MySQL이었는데 계속해서 DB 권한문제 에러가 났고 app과 제대로 연결이 되지 않았다. docker-compose 파일의 DB관련 설정에서 해당 프로젝트를 위한 유저와 패스워드를 설정했는데 적용이 되지 않는 것 같았다. 수많은 검색 끝에 컨테이너 실행 후 MySQL 서버로 가서 app과 연결할 유저와 패스워드를 생성했다. 컨테이너를 실행했다고 저절로 db 유저가 생성되는 건 아니었던 것이다.
    MySQL 권한 문제는 아래와 같이 해결했다.

    • docker exec 명령을 사용하여 docker 컨테이너에 접근한 다음 MySQL에 로그인한다.
     docker exec -it <컨테이너 이름> bash
  • 컨테이너 실행할 때 지정한 root password를 입력한다.
      mysql -u root -p
  • (컨테이너 내에서) 데이터베이스와 사용자를 생성하고 MySQL에서 권한을 부여한다.
      mysql> CREATE USER '유저이름'@'%' IDENTIFIED BY '패스워드';
      Query OK, 0 rows affected (0.00 sec)
      
      mysql> GRANT ALL PRIVILEGES ON *.* TO '유저이름'@'%';
      Query OK, 0 rows affected (0.00 sec)
      
      mysql> flush privileges;
      Query OK, 0 rows affected (0.00 sec)

2일차 - Django 프로젝트 Docker Compose로 배포하기

  • FastAPI와 MySQL로 배포를 해보았기에 크게 다른 부분없이 수월하게 할 수 있었다. 위에서 확인한 Operation not permitted Error도 유저 생성과 권한 부여를 통해 바로 해결했다.

  • 배포할때 가장 신경쓰였던 것은 시크릿키나 DB 패스워드 등 민감한 정보를 어떻게 관리할지였다. env파일에 따로 작성하고 docker-compose 파일에서 env_file: 옵션으로 불러오는 방법을 택했다. 배포는 프로젝트를 github에 공개하고 EC2에서 clone 받는 방식으로 진행했는데, 공개 저장소에 env 파일을 올려둘 수 없어서 EC2에서 직접 작성해서 사용하도록 README를 작성했다.

    어찌보면 다른 사람이 프로젝트를 시연할때 번거로울 수 있겠지만, 이렇게 비밀정보를 분리해 관리하는 것이 필요하다고 생각했다.


느낀점과 개선점

Docker와 Network에 대한 이해

  • Docker의 개념과 역할에 대해선 이해했고 배포를 해볼 수 있었다. 하지만, 컨테이너의 작동원리나 각종 파일 경로에 대해서는 공부가 더 필요하다. Docker file의 WORKDIR와 docker-compose file의 volumes 관련 항목은 정확히 이해하지 못하고 참고자료를 보며 그대로 따라한 부분이 크다.

  • 지금까진 로컬에선 8000 포트를 사용하고 db 종류에 따라 mysql은 3306 포트를 사용했다. host ip는 컴퓨터의 주소이고, port는 해당 컴퓨터에서 접속하고자 하는 프로그램의 주소라고 이해하고 있다.
    처음 docker-compose 파일에 8000:8000으로 포트를 설정하지 않고 :8000으로만했더니 docker에서 임의로 포트를 설정해버렸고 서버는 실행중이지만 브라우저에서 접속할 수 없었다. 어찌보면 간단한 문제였는데, 네트워크에 대한 이해가 부족해서 생긴 실수였다.

EC2 서버에서 Docker 컨테이너는 어떻게 작동되는걸까? 컨테이너의 폴더 구조는 어떻게되고 db 볼륨의 경로는 어떤 기준으로 지정해야할까? 배포된 서버와 컨테이너는 어떻게 통신하는가?
-> 도커를 잘 활용하기 위해선 이런 질문에 먼저 답을 할 수 있어야겠다.

DB서버 배포하기 - RDS vs Docker?

  • Docker를 사용하지 않을때 기존의 배포 방식은 AWS에서 EC2 와 RDS를 생성하고, 해당 RDS를 어플리케이션 DB설정에 추가해 연동하는 방식이었다. RDS는 로컬에서도 접속이 가능해서 DB를 dump하기도 수월했다.

  • 이번에 RDS를 사용하지 않고 DB서버를 컨테이너로 실행하며 느꼈던 것은

    • DB에 따라 매번 RDS를 만들지 않아도 된다. RDS가 지원하지 않는 종류의 DB도 컨테이너화 할 수 있다.

    • 컨테이너로 실행된 DB서버에는 data를 어떻게 관리할 것인가? dump가 가능한가?

      -> dump 파일을 같이 서버에 올려두고 docker-compose 파일에서 db의 volumes: 부분에 dump 설정을 해둔다. 그러면 컨테이너 실행과 동시에 db에 데이터가 dump된다.

  • DB를 운영하는 3가지 방법

    1. EC2에 DB를 설치, 2. RDS로 연결, 3. EC2 위 컨테이너로 DB를 실행

    • 위 세가지 방법에 대한 장단점을 찾아보았다.

    Use RDS or a container (ECS) for database? Advantages and disadvantages

데이터를 dump하는 과정에서 고민이 많았는데 확실히 RDS를 이용할때보다 DB 접근이 익숙하지 않았다. 실행되고 있는 DB 컨테이너와 EC2 서버 사이에서 데이터 통신을 어떻게 하는지가 궁금했다. 찾아본 바로는 공유폴더를 통해 연결되는 통로가 있다고 하는데 시간관계상 제대로 알아보진 못했다. 배포된 DB서버의 데이터를 관리할 일이 분명 있을테니 이부분을 추가적으로 알아볼 예정이다.

profile
개발자가 될 팔자

0개의 댓글