-
👣 방문자 기록 사이트 토이프로젝트 회고프로젝트 회고록 2021. 4. 27. 22:30728x90
😎 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
'프로젝트 회고록' 카테고리의 다른 글
Airflow on ECS 파이프라인 구축기 (0) 2023.07.10 MS Teams에서 Airflow DAG 자동 실행 파이프라인 구축(Feat. Teams, Lambda, Airflow 연동) (0) 2022.04.22 AWS CodePipeline으로 추천 API 모델 배포하기 (0) 2021.08.16 Docker 컨테이너 배포 파이프라인 구축 스프린트 회고 (0) 2021.06.18 - Docker란?