배포 진행 순서
1. docker swarm init 초기화
2. django에서 보안 사항들을 docker secrets에 저장
3. docker secrets에 저장한 보안 사항들을 배포할때 django project로 불러오기
4. docker image를 만들기위한 Dockerfile 생성
4-1. portainer에서 docker image 생성
5. docker stack를 위한 docker-compose.yml 생성
6. docker stack 생성 및 실행
1. docker swarm init 초기화
https://docs.docker.com/engine/reference/commandline/swarm_init/
docker swarm init
2. django에서 보안 사항들을 docker secrets에 저장
portainer -> secrets -> add secrets
아래와 같이 django secret key 등 생성
3. docker secrets에 저장한 보안 사항들을 배포할때 django project로 불러오기
django secrets 에 저장한 내용은 /run/secrets/ 위치에 저장됨
settings.py 나 deploy.py 등 배포에 사용할 환경파일에서 파일을 읽어 사용
# docker secrets의 파일 읽어오기
def read_secret(secret_name):
file = open("/run/secrets/" + secret_name)
secret = file.read()
secret = secret.rstrip().lstrip()
file.close()
return secret
# 실제 사용
SECRET_KEY = read_secret("DJANGO_SECRET_KEY")
4. docker image를 만들기위한 Dockerfile 생성
- 파이썬 3.9 버전 위에서
FROM python:3.9.0
- /home 폴더 위치로 이동하여 (없으면 생성)
WORKDIR /home/
- github에서 프로젝트 소스코드를 가져와서 다운
RUN git clone [https://github.com/{user}/{project}.git](https://github.com/mugon-dev/django-pinterest.git)
- 다운받은 폴더로 이동하여
WORKDIR /home/[project](https://github.com/mugon-dev/django-pinterest.git)/
- 라이브러리를 설치하고
RUN pip install -r requirements.txt
- container에 8000번 포트를 열어주고
EXPOSE 8000
- 배포 환경으로 실행하는데 static파일들을 한 곳에 모으고, migrate하고 8000번 포트에 bind해서 실행
CMD ["bash", "-c", "python manage.py collectstatic --noinput --settings=config.settings.deploy && python manage.py migrate --settings=config.settings.deploy && gunicorn --env DJANGO_SETTINGS_MODULE=config.settings.deploy config.wsgi --bind 0.0.0.0:8000"]
4-1. portainer 에서 docker image 만들기
portainer -> images -> build a new image
upload 탭에서 위에서 만든 Dockerfile 불러와 생성
5. docker stack를 위한 docker-compose.yml 생성
# docer compose 버전
version: "3.7"
# docker service 생성
services:
# nginx container 생성
nginx:
# nginx image 불러오기
image: nginx:1.19.5
# nginx가 속할 network
networks:
- network
# voluems 정의
volumes:
# 내가 올린 nginx.conf를 nginx폴더의 nginx.conf와 연결
- /home/django_course/nginx.conf:/etc/nginx/nginx.conf
# volumes에 저장할 파일들의 경로
- static-volume:/data/static
- media-volume:/data/media
# nginx가 사용할 ports
ports:
- 80:80
# django container 생성
# container name은 nginx.conf에서 hostname과 동일하게 작성
django_container_gunicorn:
# 위에서 만든 image 불러오기
image: django_test_image:5
# 장고가 속할 네트워크
networks:
- network
# volumes에 저장할 파일들의 경로
volumes:
- static-volume:/home/django-pinterest/staticfiles
- media-volume:/home/django-pinterest/media
# 위에서 저장한 django secrets에서 가져올 파일
secrets:
- MYSQL_PASSWORD
- DJANGO_SECRET_KEY
# mariadb container 생성
# container name은 djago settings의 host명과 동일하게 작성
mariadb:
# 사용할 이미지
image: mariadb:10.5
# 사용할 네트워크
networks:
- network
# volumes에 저장할 db 데이터
volumes:
- maria-database:/var/lib/mysql
# 위에서 저장한 django secrets에서 가져올 파일
secrets:
- MYSQL_PASSWORD
- MYSQL_ROOT_PASSWORD
# maria db의 환경변수
# docker secrets에서 패스워드 가져오기
environment:
MYSQL_DATABASE: django
MYSQL_USER: django
MYSQL_PASSWORD_FILE: /run/secrets/MYSQL_PASSWORD
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/MYSQL_ROOT_PASSWORD
# 사용할 네트워크
networks:
network:
# 사용할 volume
volumes:
static-volume:
media-volume:
maria-database:
# 사용할 secrets
secrets:
DJANGO_SECRET_KEY:
external: true
MYSQL_PASSWORD:
external: true
MYSQL_ROOT_PASSWORD:
external: true
6. docker stack 생성 및 실행
portainer -> stack -> add stack
upload 탭에서 위에서 만든 docker-compose.yml 불러와서 생성
7. 확인
portainer -> swarm -> go to cluster visulizer
'Study > Django' 카테고리의 다른 글
[Django] gunicorn (0) | 2021.05.28 |
---|---|
[Django] 배포를 위한 환경파일 분리 (0) | 2021.05.28 |
[Django] field lookup (0) | 2021.05.25 |
[Django] decorator (0) | 2021.05.25 |
[Django] code formatting black 설치 및 적용 (0) | 2021.05.20 |