Data Navigator

Docker로 django, gunicorn, postgreSQL, Nginx 연동하기 본문

Python

Docker로 django, gunicorn, postgreSQL, Nginx 연동하기

코딩하고분석하는돌스 2024. 10. 25. 17:53

Docker로 django, gunicorn, postgreSQL, Nginx 연동하기

 

 

1. miniforge 설치하고 가상환경 만들기

  1) miniforge 설치는 아래의 링크 참조

https://datanavigator.tistory.com/65

 

mini-forge 설치하고 conda-forge를 기본 repository로 변경하기

mini-forge 설치하고 conda-forge를 기본 repository로 변경하기 아나콘다가 유료화 되었기 때문에 200인 이상의 기업에서 anaconda를 사용할 경우 사용료를 내야 한다.그러나 conda 자체는 오픈소스이기

datanavigator.tistory.com

 

2)  파이썬 3.11.6 버전으로 가상환경 만들고 가상환경 진입하기

conda create -n docker_web python==3.11.6
conda activate docker_web

 

2. django, gunicorn, psycopg2-binary 설치

pip install django
pip install gunicorn
pip install psycopg2-binary

 

3. 작업 디렉토리 만들고 장고 프로젝트 실행하기

1) 작업디릭토리 만들고 장고프로젝트 실행

mkdir work
cd work
django-admin startproject myapp/

 

2) settings.py 수정

ls
cd myapp/myapp
vim settings.py

 

3) settings.py에 ALLOWED_HOSTS = ['*']로 수정

# /myapp/myapp/settings.py

ALLOWED_HOSTS = ['*']

 

4) work/myapp 으로 나가서 마이그레이트 하기

cd ..
python manage.py migrate

 

5) 장고 서버 실행하기

python mamange.py runserver 0.0.0.0:8000 으로 장고 서버 실행

python manage.py runserver 0.0.0.0:8000

 

6) 웹브라우저를 실행시키고 localhost:8000 으로 접속하기

 

7) 접속 확인 후 ctrl + c 로 서버 종료

 

8) work 디렉토리로 이동

cd ..
ls

 

4. django 이미지 빌드하기

1) requirements.txt 만들기

pip freeze > requirements.txt
cat requirements.txt

 

2) Dockerfile 만들기

(1) vim Dockerfile

vim Dockerfile

 

(2) vim 편집기가 열리면 아래와 같이 작성한다.

FROM python:3.11.6

WORKDIR /usr/src/app

COPY . .

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

WORKDIR ./myapp

CMD python manage.py runserver 0.0.0.0:8000
EXPOSE 8000

(3)  :wq로 저장후 나가기

(4) ls 로 Dockerfile, myapp 디렉토리, requirements.txt 가 있는지 확인한다.

 

3) docker image 빌드하기

docker image build . -t myweb01

docker image build . -t myweb01

 

 

이미지 생성 확인  docker image ls

docker image ls

 

4) django 컨테이너 실행하기

docker container run -d -p 8000:8000 myweb01

docker container run -d -p 8000:8000 myweb01

 

5) 웹브라우저에서 localohost:8000으로 접속해 페이지 로딩이 되는지 확인

 

5. Nginx container 만들기

1) Nginx 용 디렉토리 만들기

# /work  에서 작업
mkdir nginx
cd nginx

 

 

2) Nginx용 Dockerfile 만들기

vim Dockerfile

vim Dockerfile

 

아래의 내용을 작성한다.

FROM nginx:1.25.3
CMD ["nginx", "-g", "daemon off;"]

 

:wq로 저장후 나감

 

3) Nginx 이미지 build

docker image build . -t mynginx01

 

docker container ls로 mynginx01 이미지 생성 확인

docker container ls

 

Nginx 컨테이너 실행

docker container run -p 80:80 -d mynginx01

 

웹브라우저에 localhost로 접속 :80은 생략 가능

 

6. django에 gunicorn 추가하고 재빌드 후 Nginx와 연동하기

1) work 디렉토리로 이동

cd ..
ls

 

2) mydjango01 디렉토리를 만들고 Dockerfile, myapp 디렉토리, requirements.txt 옮기기

mkdir mydjango01
mv ./Dockerfile myapp requirements.txt ./mydjango01
ls

 

3)  mydjango01로 들어가 Dockerfile 수정

cd mydjango01
vim Dockerfile

 

아래와 같이 수정한다. CMD 부분만 변경한다.

FROM python:3.11.6

WORKDIR /usr/src/app

COPY . .

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

WORKDIR ./myapp

CMD gunicorn --bind 0.0.0.0:8000 myapp.wsgi:application
EXPOSE 8000

 

4) django 이미지를 재빌드한다.

docker image build . -t myweb02

 

docker image ls

 

 

5) Nginx 에 default.conf 추가 및 Dockerfile 수정

 nginx 디렉토리로 이동

cd ..
cd nginx

 

 

default.conf 파일 생성

vim default.conf

 

아래의 내용을 작성한다.

upstream myweb{
	server djangotest:8000;
}

server{
	listen 80;
    server_name localhost;
    location /{
    	proxy_pass http://myweb;
    }
}

 

ls 로 파일 생성 확인

ls

 

vim 편집기로 Dockerfile 내용 수정

vim Dockerfile

 

아래의 내용을 입력한다

FROM nginx:1.25.3
RUN rm /etc/nginx/conf.d/default.conf
COPY default.conf /etc/nginx/conf.d/
CMD ["nginx", "-g", "daemon off;"]

 

6) 수정한 내용으로 Nginx 이미지 재빌드

docker image build . -t mynginx02

docker image ls

 

 

 

7) 새로운 네트워크 생성

docker network create mynetwork02
docker network ls

 

8) django 컨테이너 실행

docker container run -d --name djangotest --network mynetwork02 myweb02

 

 

 

9) Nginx 컨테이너 실행

docker container run -d --name nginxtest --network mynetwork02 -p 80:80 mynginx02
docker container ls

 

10) 웹브라우저에서 localhost로 접속 후 장고 페이지 로딩 확인

djangotest 컨테이너와 nginxtest 컨테이너가 정상적으로 동작하고 있으면 웹브라우저에서 localhost로 접속하면 django 페이지가 정상적으로 로딩된다.

 

 

7. PostgreSQL image 생성 및 container 실행

1) work 디렉토리 아래에 mypostgre 디렉토리를 만들고 디렉토리 안에 Dockerfile 생성

# /work 에서 실행
mkdir mypostgre
cd mypostgre
vim Dockerfile

Dockerfile에 아래와 같이 작성한다

FROM postgres:15.4

 

2)  mypostgres03 이름으로 이미지를 빌드한다.

docker image build . -t mypostgres03
docker image ls

 

docker image ls로 mypostgres03 이 만들어져있는지 확인한다.

 

3) postgreSQL 데이터 저장을 위해 myvolume03 생성하기

docker volume create myvolume03

 

4) postgres03 컨테이너 실행하기

docker container run -e POSTGRES_PASSWORD=mysecretpassword --mount type=volume,source=myvolume03,target=/var/lib/postgresql/data -d mypostgres03

 

5) docker container ls로 컨테이너 동작 확인

docker container ls

 

6) 모든 container 정지

docker stop $(docker ps -q)

 

7) 모든 continer 삭제

docker rm $(docker ps -aq)

 

 

8. Django, Nginx, PostgresSQL 모두 연동

1) PostgreSQL 연동을 위한 Django settings.py 수정

# work 에서 시작
vim mydjango01/myapp/myapp/settings.py

 

settings.py 내용 중 DATABASES = 부분을 찾아 아래와 같이 수정

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'postgres',
        'USER': 'postgres',
        'PASSWORD': 'mysecretpassword',
        'HOST': 'postgrestest',
        'PORT': 5432,
    }
}

 

 

 

2) 수정된 Django 를 myweb03 으로 이미지 빌드

cd mydjango01
docker image build . -t myweb03
docker image ls

 

 

 

 

3) Nginx를 mynginx03으로 재빌드

# work에서 작업
cd nginx
docker image build . -t mynginx03
docker image ls

 

 

4) Django, Nginx, PostgresSQL 연동을 위한 mynetwork03 생성

docker network create mynetwork03
docker network ls

 

5) PostgreSQL container 실행

docker container run --name postfrestest \
--network mynetwork03 \
-e POSTGRES_PASSWORD=mysecretpassword \
--mount type=volume,source=myvolume03,target=/var/lib/postgreswl/data \
-d mypostgres03

 

6) Django contaier 실행

docker container run -d --name djangotest --network mynetwork03 myweb03

 

 

7) Nginx 컨테이너 실행

docker container run -d --name nginxtest --network mynetwork03 -p 80:80 mynginx03

 

8) docker container ls로 모든 컨테이너 작동 확인

docker container ls

 

9) 웹브라우저에서 localhost 로 접속후 장고 페이지가 보이면 성공