docker with [ Nginx + uWSGI + django ]
in Docker
๐ก project์ dockerfile
dockerfile
#1
FROM python:3.9.7
#2
ENV PYTHONUNBUFFERED 1
#3
RUN apt-get -y update
RUN apt-get -y install vim
#4
RUN mkdir /srv/docker-server
ADD . /srv/docker-server
#5
WORKDIR /srv/docker-server
#6
RUN pip install --upgrade pip
RUN pip install -r requirements.txt
โ python 3.9.7 ๋ฒ์ ๋ค์ด
โ PYTHONBUFFERDED =1
์ด๋ค ์ค์ ์ธ์ง ๋ชฐ๋ผ stackoverflow๋ฅผ ๊ฒ์ํ๋ค. log ๋ฉ์ธ์ง๋ฅผ ๋ฐ๋ก ๋ณด์ฌ์ค๋ค๊ณ ํ๋ค.
โ update, vim ์ค์น
โ /srv/docker-server
๊ฒฝ๋ก ์์ฑ ํ ํ์ฌ ๊ฒฝ๋ก(.)์ ๋ชจ๋ ํ์ผ์
๋์ปค ๋ด๋ถ ๊ฒฝ๋ก(/srv/docker-server)๋ก ์ถ๊ฐ.
โ /srv/docker-server๋ก ์ปจํ ์ด๋ ๋ด๋ถ ๊ฒฝ๋ก ๋ณ๊ฒฝ
โ ๋ช ๋ น์ด ์คํ.
uwsgi.ini
๋ช ๊ฐ์ง ์ค์ ์ ๋ฐ๊ฟ์ค์ผ ํ๋ค. chdir ๊ฒฝ๋ก ์ค์ ์ผ๋ก ์๊ฐ์ ๋ง์ด ํ๋นํจ.
์ฒ์์๋ chdir = /srv/docker-server/drf_todo
๋ผ๊ณ ์ค์ ํ๋๋ฐ,
drf_todo๋ผ๋ ๋ชจ๋์ ๋ชป์ฐพ์์ด๋ผ๋ ์๋ฌ๊ฐ ๋ฐ์ํ์๋ค.
[uwsgi]
socket = /srv/docker-server/drf_todo.sock
chdir = /srv/docker-server
module = drf_todo.wsgi
env=DJANGO_SETTINGS_MODULE=drf_todo.settings
master = True
enable-threads = True
max-requests=5000
buffer-size=32768
chmod-socket = 666
logger = file:/tmp/uwsgi.log
vacuum = true
๐ก nginx
nginx/dockerfile
#1
FROM nginx:latest
#2
COPY nginx.conf /etc/nginx/nginx.conf
COPY drf_todo.conf /etc/nginx/sites-available/
#3
RUN mkdir -p /etc/nginx/sites-enabled/\
&& ln -s /etc/nginx/sites-available/drf_todo.conf /etc/nginx/sites-enabled/\
&& mkdir -p /var/log/drf_todo
#4
CMD ["nginx", "-g", "daemon off;"]
โ nginx ์ค์น
โ ํ์ฌ ๊ฒฝ๋ก์ ์๋ nginx.conf ํ์ผ์ /etc/nginx/nginx.conf ํ์ผ์ ๋ฎ์ด์์ฐ๊ณ ,
drf_todo.confํ์ผ์ /etc/nginx/sites-available/ ๊ฒฝ๋ก์ ๋ณต์ฌํ๊ธฐ
โ /etc/nginx/sites-enabled/ ๊ฒฝ๋ก ์์ฑํ๊ณ , ์ฌ๋ณผ๋งํฌ ์ค์ .
โ ์ปค๋งจ๋ ์คํ.
nginx/nginx.conf
user root;
worker_processes 1;
pid /run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
*** ์๋ฒ ์ถ๊ฐ ***
include /etc/nginx/sites-enabled/*;
}
nginx/drf_todo.conf
# upstream(proxy) ์ค์
upstream django {
server unix:///srv/docker-server/drf_todo.sock;
}
# configuration of the server
server {
# client๊ฐ ๋ค์ด์ค๋ port
listen 80;
# client๊ฐ ์คํํ๋ ์๋ฒ์ IP์ฃผ์ or Domain
server_name localhost;
charset utf-8;
# log settings.
access_log /var/log/drf_todo/access.log;
error_log /var/log/drf_todo/error.log;
# max upload size
client_max_body_size 75M;
# Django media ๋๋ ํ ๋ฆฌ ๊ฒฝ๋ก (alias๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ง์ง๋ง์ / ๋ฃ๊ธฐ.)
location media/ {
alias /svr/docker-server/drf_todo/media/;
}
# Django static ๋๋ ํ ๋ฆฌ ๊ฒฝ๋ก
location static/ {
alias /svr/docker-server/drf_todo/static/;
}
# media์ static์ ์ ์ธํ ๋ชจ๋ ์์ฒญ์ upstream์ผ๋ก ๋ณด๋
๋๋ค.
location / {
# uwsgi_pass [upstream name] (์์ upstream์ผ๋ก ์ค์ ํ block์ ์ด๋ฆ)
uwsgi_pass django;
# uwsgi_params์ ๊ฒฝ๋ก
include uwsgi_params;
}
}
๐ก docker-compose
version: "3"
services:
db:
platform: linux/x86_64
container_name: main.mysql
image: mysql
restart: always
command: mysqld --character-set-server=utf8 --collation-server=utf8_general_ci --default-authentication-plugin=mysql_native_password
environment:
MYSQL_ROOT_PASSWORD: "wjdrlfwns1!"
MYSQL_DATABASE: "drf_todo"
MYSQL_USER: "gilbert"
MYSQL_PASSWORD: "wjdrlfwns1!"
ports:
- "7001:3306"
web:
build: ./drf_todo
image: docker-server/drf_todo
container_name: main.django
command: uwsgi --ini uwsgi.ini
volumes:
- ./drf_todo:/srv/docker-server
- ./log:/var/log/uwsgi
depends_on:
- db
nginx:
build: ./nginx
container_name: nginx
image: docker-server/nginx
restart: always
volumes:
- ./drf_todo:/srv/docker-server
ports:
- '80:80'
depends_on:
- web
ports
์ฌ๊ธฐ์ 80:80์ด๋ผ๊ณ ์ค์ ํด ์ค ๊ฒ์ port forwarding
์ด๋ผ๊ณ ํ๋ค๊ณ ํ๋ค.
๋์ปค ์ปจํ ์ด๋๋ 80๋ฒ ํฌํธ๋ก listening์ ํ๋ค. (nginx ์๋ฒ์ ํฌํธ๋ฅผ 80๋ฒ์ผ๋ก ์ค์ ํ๊ธฐ ๋๋ฌธ.)
client์ ์์ฒญ์ โ๋์ปค์ 80๋ฒโํฌํธ๋ก ๋ค์ด๊ฐ๊ณ , nginx์์ ์ค์ ํด์ค socket ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ
uWSGI์ ์์ฒญ์ ์ ๋ฌํ๋ค.
volumes
๋ด ํ๋๋๋ผ์ด๋ธ์ ๊ฒฝ๋ก์ ์ปจํ ์ด๋ ๋ด๋ถ์ ๊ฒฝ๋ก๋ฅผ ๋งคํํด์ฃผ๋๊ฒ.
ํด๋น ์ค์ ์ ํ ๊ฒฝ์ฐ, vscode์์ ์ฝ๋ ํธ์ง์ ํ๋ฉด, ์ปจํ ์ด๋ ๋ด๋ถ์ ์ฝ๋๋ ๋ณ๋๋๋ค.
- ๋ด์ฉ์ถ๊ฐ(22.01.13)
dockerfile์ ์์ฑํด ์ค๋, requirements.txt๋ง1 COPYํด์ฃผ๊ณ ๋๋จธ์ง๋ docker-compose.yml์์
volumes์์ ๊ฒฝ๋ก๋ฅผ ๋งตํํด์ฃผ๋ฉด ๋๋ค. (๊ตณ์ด ์ด๋ฏธ์ง ๋น๋์์ ๋ชจ๋ ํ์ผ์ COPYํ ํ์ ์๋ค.)