👣 방문자 기록 사이트 토이프로젝트 회고
😎 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"
😅 삽질 일기
Docker 도커 이미지 & 컨테이너 중지 및 삭제
Docker 이미지, 컨테이너 삭제 순서 1. Docker container 중지 2. Docker container 삭제 3. Docker image 삭제 1. Docker container 중지&삭제 # 개별 컨테이너 중지 $ docker container stop {컨테이너ID 앞 3자..
ninano1109.tistory.com
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
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
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