Cloud Engineering/Docker ๐Ÿณ

[Docker] Django ์•ฑ Docker ์ด๋ฏธ์ง€๋กœ ๋ฐฐํฌํ•˜๊ธฐ

minjiwoo 2024. 1. 4. 22:05
728x90

Intro

์ง€์ธ๋“ค๊ณผ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ๋กœ ๊ฐœ๋ฐœํ•œ Django ์•ฑ์„ deploy ํ•ด๋ณด๋Š” ์˜ˆ์ œ๋กœ Docker Image๋ฅผ ๋ฐฐํฌํ•˜๋Š” ๊ฐ„๋‹จํ•œ hands on ์„ ์†Œ๊ฐœํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. Docker Image๋กœ ๊ด€๋ฆฌํ•˜๋Š”๊ฒŒ ๋ฐฐํฌํ•  ๋•Œ ๋ฒ„์ „๊ด€๋ฆฌ๋‚˜ ํ™˜๊ฒฝ ๊ตฌ์ถ• ์‹œ์— ํŽธ๋ฆฌํ•  ๊ฒƒ ๊ฐ™์•„์„œ Imageํ™”ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์˜ Git Repository ๊ฐ€ ๊ฐœ๋ฐœํ•œ Django ์•ฑ ์ž…๋‹ˆ๋‹ค. 

https://github.com/FoodieZone/Backend 

 

GitHub - FoodieZone/Backend

Contribute to FoodieZone/Backend development by creating an account on GitHub.

github.com

์ž‘์—… ๋ฐ ๋ฐฐํฌ ํ™˜๊ฒฝ 

  • Host Server : ubuntu 22.04
  • Cloud Service : AWS EC2 ์ธ์Šคํ„ด์Šค
  • Docker Engine ์˜ ๊ฒฝ์šฐ, Host Server ์— ๋งž์ถ”์–ด ์„ค์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค. 

 

Django ์•ฑ์„ Docker Image๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” Dockerfile์„ ์ž‘์„ฑํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 

FROM python:3.9.16
LABEL maintainer="freemjstudio <mjwoo001@gmail.com>"
RUN apt-get -y update

RUN python3 -m venv venv && . venv/bin/activate
RUN mkdir /srv/dev-server
ADD src /srv/dev-server
COPY requirements.txt /srv/dev-server/requirements.txt

WORKDIR /srv/dev-server

RUN pip install --upgrade pip
RUN pip install -r requirements.txt

CMD ["python3", "manage.py", "runserver", "0.0.0.0:8080"]
EXPOSE 8080

 

FROM

Python Base Image๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. Dockerfile์—์„œ ๋ฐ˜๋“œ์‹œ ์ง€์ •ํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 

LABEL maintainer 

๊ธฐ์กด์˜ MAINTAINER ํ‚ค์›Œ๋“œ๋กœ, ํ•ด๋‹น docker Image์˜ ์ž‘์—…์ž๊ฐ€ ๋ˆ„๊ตฌ์ธ์ง€ ์ •๋ณด๋ฅผ ๋‚จ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

RUN

shell ๋ช…๋ น์–ด ๋˜๋Š” list ์— ๋‹ด๋Š” exec ํ˜•์‹์œผ๋กœ ์‹คํ–‰์‹œํ‚ฌ ๋ช…๋ น์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

ADD vs COPY 

ADD์™€ COPY ๋ชจ๋‘ ํŒŒ์ผ์„ ํ˜„์žฌ ํŒŒ์ผ ์‹œ์Šคํ…œ (local) ์—์„œ ๋„์ปค ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ ํŒŒ์ผ ์‹œ์Šคํ…œ์œผ๋กœ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ฐจ์ด์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. 

  • COPY : ์†Œ์Šค ํŒŒ์ผ์ด๋‚˜ ํŠน์ • ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ ์ง€์ •๋œ ๊ฒฝ๋กœ๋กœ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. 
  • ADD : COPY ์™€ ๋‹ค๋ฅธ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์œผ๋กœ URL ์„ ๋ณต์‚ฌํ•  ๋Œ€์ƒ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

WORKDIR 

ํ•ด๋‹น ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™ํ•˜์—ฌ ์ž‘์—…์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. 

EXPOSE

Docker ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋ฆฌ์Šค๋‹ํ•  ํฌํŠธ๋ฅผ ์ง€์ •ํ•œ๋‹ค. ๊ทธ๋ ‡์ง€๋งŒ EXPOSE ์ž์ฒด๋กœ๋Š” ์‹ค์ œ๋กœ port ๋ฅผ ์—ฌ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์–ด๋–ค ํŠน์ • ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ์ง€ ์•Œ๋ ค์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. 

 

Dockerfile์„ ์ž‘์„ฑํ•œ ๊ฒฝ๋กœ์— ๋‹ค์Œ์˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. Docker Image ์ƒ์„ฑ์„ ์œ„ํ•œ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋”ฐ๋กœ ํ•˜๋‚˜ ์ƒ์„ฑํ•œ ํ›„ ๊ทธ ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ๋ถ„๋ฆฌํ•˜์—ฌ ์ž‘์—…ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค. 

$ docker build -t NEW_IMAGE_NAME .

 

์‹คํ–‰ ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. Dockerfile์€ ๋ช…๋ น ํ•œ์ค„๋งˆ๋‹ค ์ด๋ฏธ์ง€๋ฅผ ํ•˜๋‚˜์”ฉ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. docker history ๋ช…๋ น์–ด๋กœ ์‹คํ–‰๋œ ์ž‘์—… ๋‚ด์šฉ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์กฐํšŒํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

๋„์ปค ์ด๋ฏธ์ง€๊ฐ€ ์ œ๋Œ€๋กœ ์ƒ์„ฑ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. docker images ๋ช…๋ น์–ด๋Š” ํ˜„์žฌ host server์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” image๋ฅผ list up ํ•ฉ๋‹ˆ๋‹ค. 

$ docker images

 

repository ์— ์˜ฌ๋ฆฌ๊ธฐ ์œ„ํ•ด์„œ tag ๋ฅผ ๋ณ€๊ฒฝํ•ด์ค๋‹ˆ๋‹ค. '๋ณธ์ธ์˜ Docker Hub ID/'๋ฅผ ์ ‘๋‘์–ด๋กœ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. 

$ docker image tag DOCKER_IMAGE_ID YOUR_DOCKER_HUB_ID/DOCKER_IMAGE_NAME

 

docker Hub ID/PW๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜„์žฌ์˜ docker hostํ™˜๊ฒฝ์—์„œ hub ๋กœ ์ธ์ฆ์„ ํ•œ ํ›„, ์ƒ์„ฑํ•œ ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ Hub์— ์˜ฌ๋ฆฝ๋‹ˆ๋‹ค. 

$ docker push freemjstudio/foodie-django

 

์ƒ์„ฑํ•œ Docker Image ๊ธฐ๋ฐ˜์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰์‹œํ‚ต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋™์‹œ์— ๋„์šฐ๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ Docker Compose ๋ฅผ ํ™œ์šฉํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -p ๋˜๋Š” --publish ํ”Œ๋ž˜๊ทธ๋Š” ๋„์ปค ํ˜ธ์ŠคํŠธ์™€ ๋„์ปค ์ปจํ…Œ์ด๋„ˆ ๊ฐ„์˜ ํฌํŠธ ๋งคํ•‘์„ ์„ค์ •ํ•ด์ฃผ๋Š” ๋ช…๋ น์–ด ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ 8080 ํฌํŠธ๋กœ ํฌํŠธํฌ์›Œ๋”ฉํ•ด์ฃผ์—ˆ๋Š”๋ฐ, ๋„์ปค ํŒŒ์ผ์„ ์ž‘์„ฑ์‹œ์— 'EXPOSE 8080' ์œผ๋กœ Django App์„ 8080 ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋ผ๊ณ  ๋ช…์‹œํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. 

$ docker run -d -p 8080:8080 DOCKER_IMAGE_NAME

๋ฐฐํฌ ํ›„, YOUR_HOST_ADDRESS:8080 ์œผ๋กœ ์ •์ƒ์ ์œผ๋กœ ์ ‘์†์ด ๋˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

์ด๋กœ์จ, Django ์•ฑ์„ Dockerfile ์ž‘์„ฑ์„ ํ†ตํ•ด ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๋„์ปค ์ด๋ฏธ์ง€ ๊ธฐ๋ฐ˜์˜ ์ปจํ…Œ์ด๋„ˆ๋กœ ์•ฑ์„ ๋ฐฐํฌํ•˜๋Š” ๊ณผ์ •์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค. Django ์•ฑ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ์–ด๋– ํ•œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋“  Dockerfile ์ž‘์„ฑ ํ›„ ๋น„์Šทํ•œ ๊ณผ์ •์œผ๋กœ ๋ฐฐํฌํ•ด๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. 

  • Docker Hub์— ์˜ฌ๋ผ๊ฐ„ ์žฅ๊ณ  ์•ฑ ๋ฐฐํฌ ๋„์ปค ์ด๋ฏธ์ง€์ž…๋‹ˆ๋‹ค. 

https://hub.docker.com/r/freemjstudio/foodie-django

 

Docker

 

hub.docker.com

 

728x90