프로젝트 회고록

👣 방문자 기록 사이트 토이프로젝트 회고

쫄보삽질러 2021. 4. 27. 22:30
728x90

😎 Before We Start:

  • Docker란?
    • 개발 결과물(환경)에 대해 사진을 찍듯 Docker image를 빌드하고, 해당 이미지를 바탕으로 container를 실행하면 다른 어떤 컴퓨터에서도 동일한 환경을 세팅해주어 서비스를 정상적으로 실행시킬 수 있습니다. 
    • 1) 팀 협업을 하는 경우, 2) AWS에 올리는 경우, 3) 다른 컴퓨터에서 작업을 이어갈 경우 등 현재 작업 중인 컴퓨터 외 다른 환경에서도 필요한 설정(프로그램 설치, 서비스 실행 명령어 등)을 복제하여 환경 설정을 위한 반복 작업을 자동화시킬 수 있는 편리함이 장점입니다.

 

  • 이번 프로젝트에서 Docker를 사용한 이유:
    • [완벽한 IT 인프라 구축을 위한 Docker] 책 학습 중 dockerfile을 실제 작성해보고, docker compose로 dockerfile들을 통합하여 컨테이너를 실행해보기 위해 docker를 활용한 방문자 기록 사이트를 개발해 보았습니다. 해당 프로젝트는 [유튜브 얄팍한 코딩사전 - 가장 쉽게 배우는 도커]의 실습 영상을 보고 따라 해 본 것으로 Flask-MySQL-React로 개발된 코드를 참고하여 Django-MySQL-Vue.js를 사용하여 개발했습니다.
    • 해당 프로젝트는 backend, DB, frontend 3가지 기능이 통합적으로 이루어져야 하므로, 3가지 각각의 dockerfile을 작성해야 했습니다. 또한 프로젝트 전체 dockerc-compose.yml 파일을 작성하여 dockerfile 3개 전체의 이미지 빌드 후 컨테이너를 실행시키는 것을 목표로 했습니다.
    • 먼저 로컬 내 컴퓨터에서 웹 작동을 확인하고, 가상환경에서 dockerfile로 빌드한 결과물을 확인한 이후, AWS에 올리는 것을 목표로 했습니다.

 

  • 프로젝트를 통해 배운 점:
    • Docker 이미지, 컨테이너의 개념 + Dockerfile, docker-compose.yml 작성 및 실행에 대해 배울 수 있었습니다. 또한 MySQL을 백엔드와 연결해서 처음 사용해 봤습니다. MySQL의 계정 생성과 관리 및 docker로 MySQL을 사용할 때는 로컬 컴퓨터 MySQL 계정 및 DB와 독립적으로 docker container 내부에 새로 생성되는 것을 배웠습니다. 또한 백엔드 django와 DB 컨테이너를 docker-compose로 통합 구성할 때 실행 순서를 별도로 설정해주어야 하는 부분도 새롭게 알게 됐습니다.
    • 개발 작업 중인 local 컴퓨터에 컨테이너를 생성하고 그 안에 DB가 만들어지는 것은 하나의 독립된 공간이 생기는 것을 의미하고, AWS에 올려서 다시 컨테이너를 생성하면 그 안에 DB가 새로 만들어져 또 다른 독립 공간이 생성된다는 것을 배웠습니다.
    • 마지막으로 AWS ec2에 올려서 서비스를 정상적으로 실행하는 것 까지 해보며 처음 목표했던 과제를 잘 수행했고, 그 과정에서 포트 연결을 위해 포트(8000, 3306, 8080)를 열어줘야 하는 것과 private(bastion 통해서만 가능)이 아닌 public IP로 접속해야 하는 것, 그리고 같은 WIFI망을 쓰기 때문에, 해당 ip url 주소로 접속하면 모두가 볼 수 있는 것에 대해 새롭게 배웠습니다.
    • 결론적으로.. 네트워크를 공부하쟈!

 

Dockerfile 작성

  • Backend(Django) dockerfile
FROM python:3.8.2

ENV DOCKERIZE_VERSION v0.6.1
RUN wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
    && tar -C /usr/local/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
    && rm dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz

ENTRYPOINT ["dockerize", "-wait", "tcp://db:3306", "-timeout", "20s"]

# docker 내 code라는 폴더 생성
RUN mkdir /django_code

# docker 내에서 코드 실행할 위치 설정
WORKDIR /django_code

# docker 코드 실행 위치에 requirements.txt 추가하기
ADD requirements.txt /django_code/

# 이미지 생성 과정 중 명령어 실행(필요 라이브러리 설치) 
RUN pip install -r requirements.txt

# 모든 코드들 docker 실행 폴더 위치에 복사하기
COPY . /django_code/

# container 실행 시 Django 실행 명령어
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

# 이미지 생성 명령어 (현 파일과 같은 디렉토리에서)
# docker build -t {이미지명} .

# 컨테이너 생성 & 실행 명령어
# docker run --name {컨테이너명} -p 8000:8000 {이미지명}

 

  • DB(MySQL) dockerfile
# linux/arm64/v8 문제 해결(Macbook M1)
FROM --platform=linux/x86_64 mysql:5.7

# docker 컨테이너 내부 DB에 새로운 계정 생성
ENV MYSQL_USER newuser
ENV MYSQL_PASSWORD 1234

# docker 컨테이너 내부 DB에 모든 host에서 사용가능한 계정 설정 및 password 생성
ENV MYSQL_ROOT_HOST %
ENV MYSQL_ROOT_PASSWORD rootpw

# docker 컨테이너 내부 DB에 database 이름 생성
ENV MYSQL_DATABASE visitlog

# DB 최초 실행 시 docker 내 해당 경로(default)에서 자동으로 DB 스크립트 실행
COPY ./scripts/ /docker-entrypoint-initdb.d/

# docker build -t {이미지명} .

# docker run --name {컨테이너명} -it -p 3306:3306 {이미지명}

# docker exec -it {컨테이너명} /bin/bash  docker 내부에서 user 확인하기
# mysql 서버 실행
$ mysql.server start 

# root계정으로 로그인
$ mysql -u root -p  

# 특정 DB 사용
$ use {database이름};  

# DB 테이블 조회
$ show tables;

 

  • Frontend(Vue.js) dockerfile
FROM node:14.16.1

# docker 내에서 코드 실행할 위치 설정
WORKDIR /app

# docker 내부에 npm 패키지 복사하기
COPY package*.json ./

# vue.js 코드에서 쓰인 npm 패키지 전체 설치하기(package.json 기반)
RUN npm install

# vue.js 전체 코드 docker에 복사
COPY . .

# frontend docker 컨테이너에서 실행하는 명령어
CMD ["npm", "run", "serve"]

 

docker-compose 작성

# 3버전은 자동으로 3.0 버전으로 적용. 3점대 최신 버전 사용 X
# 특정 버전 명시 없으면 자동으로 '1.0'으로 작동
# https://docs.docker.com/compose/compose-file/compose-versioning/

version: '3.9'

# services 아래에 실행하려는 컨테이너들 정의
# compose에서는 container 대신 service 라는 개념을 사용 
services:
  # 새로 생성할 docker image 이름 => 소문자로 쓸 것!
  db:
    container_name: db
    build: ./Database
    ports:
      - "3306:3306"

  backend:
    container_name: back
    build: ./Backend
    ports:
      - "8000:8000"
    # depends_on:
    #   - db
    # links:
    #   - db
    restart: always

  frontend:
    container_name: front
    build: ./Frontend/dockerpjt
    ports:
      - "8080:8080"

 

😅 삽질 일기

 

ninano1109.tistory.com/130

 

Docker 도커 이미지 & 컨테이너 중지 및 삭제

Docker 이미지, 컨테이너 삭제 순서 1. Docker container 중지 2. Docker container 삭제 3. Docker image 삭제 1. Docker container 중지&삭제 # 개별 컨테이너 중지 $ docker container stop {컨테이너ID 앞 3자..

ninano1109.tistory.com

 

ninano1109.tistory.com/131

 

Django-MySQL DB dockerfile 계정 연동하기

Django settings.py DATABASES = { 'default' : { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'visitlog', 'USER': 'newuser', 'PASSWORD': '1234', 'HOST': 'db', 'PORT': '3306', } } DB dockerfile ENV MY..

ninano1109.tistory.com

 

ninano1109.tistory.com/132

 

Docker 도커 MySQL 버전 호환 문제(feat.Mac M1)

# DB dockerfile FROM mysql:5.7 ENV MYSQL_USER=root ENV MYSQL_PASSWORD=rkdbs123 ENV MYSQL_ROOT_PASSWORD=rkdbs123 ENV MYSQL_DATABASE=visitors COPY ./scripts/ /docker-entrypoint-initdb.d/ 위와 같이 MyS..

ninano1109.tistory.com

 

ninano1109.tistory.com/133

 

Docker 도커 Django-MySQL docker-compse 에러(feat. dockerize)

docker-compose로 dockerfile을 실행했을 때, DB 컨테이너가 먼저 실행되고 Web(Django)이 실행되어야 하는데 DB 컨테이너가 돌면서 MySQL 서버가 실행되기까지 Django가 기다리지 못해서 에러가 발생합니다.

ninano1109.tistory.com

https://ninano1109.tistory.com/127

 

Django-MySQL DB 연결하기(feat. mysqlclient )

Django에는 기본 내장 DB인 Sqlite가 있지만, 이는 간단한 DB(?)로 활용하기 위한 것으로 좀 더 큰 규모의 프로젝트를 진행하기 위해서 MySQL을 연동해서 사용할 수 있습니다. 먼저, Django에서 MySQL을 사

ninano1109.tistory.com

 

https://ninano1109.tistory.com/134

 

방문자 기록 사이트 Toy Project(feat. Django-MySQL-Vue.js)

DB(MySQL) Django의 기본 내장 DB인 Sqlite 대신 MySQL을 DB로 사용하기 위한 설정 해주기 # my_settings.py DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'mytable', 'USER': 'roo..

ninano1109.tistory.com

 


여기저기 삽질도 해보고

날려도 먹으면서

배우는 게

결국 남는거다

- Z.Sabziller