-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathdocker-compose.prod.yml
149 lines (141 loc) · 3.87 KB
/
docker-compose.prod.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
# 배포용 docker compose 파일
# 실행 방법: sudo docker-compose -f docker-compose.prod.yml up -d --build
# 실행 방법(빌드 없이): sudo docker-compose -f docker-compose.prod.yml up -d
# 오류 발생 시 컨테이너 초기화: sudo docker-compose -f docker-compose.prod.yml down -v
# 이미지까지 전부 삭제: sudo docker rmi -f $(sudo docker images -q)
# NGINX 이미지 삭제: sudo docker rmi -f nginx
# Docker 강제종료: sudo docker stop $(sudo docker ps -a -q)
version: "3.8"
services:
nginx:
image: nginx:latest
container_name: nginx
build:
context: ./nginx
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
- ./nginx/log:/var/log/nginx
- ./backend:/backend
- ./backend/static:/backend/static
- build_folder:/var/www/frontend
- ./certbot/conf:/etc/letsencrypt
- ./certbot/www:/var/www/certbot
depends_on:
- frontend
- backend
- db
networks:
- django-network
command: "/bin/sh -c 'while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g \"daemon off;\"'"
certbot:
image: certbot/certbot
restart: unless-stopped
container_name: certbot
volumes:
- ./certbot/conf:/etc/letsencrypt
- ./certbot/www:/var/www/certbot
depends_on:
- nginx
entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"
db:
container_name: mysql
image: mysql:8.0
env_file:
- .env
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} # .env 파일에서 가져옴
MYSQL_DATABASE: ${MYSQL_DATABASE} # .env 파일에서 가져옴
MYSQL_USER: ${MYSQL_USER} # .env 파일에서 가져옴
MYSQL_PASSWORD: ${MYSQL_PASSWORD} # .env 파일에서 가져옴
ports:
- "3307:3306"
volumes:
- mysql_data:/var/lib/mysql
networks:
- django-network
healthcheck:
test:
[
'CMD-SHELL',
'mysqladmin ping -h 127.0.0.1 -u root --password=$$MYSQL_ROOT_PASSWORD'
]
interval: 5s
timeout: 2s
retries: 100
backend:
container_name: backend
build:
context: ./backend
dockerfile: Dockerfile
environment:
DJANGO_DEBUG: "True"
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
ports:
- "8000:8000"
expose:
- 8000
depends_on:
db:
condition: service_healthy
volumes:
- ./backend:/backend
networks:
- django-network
command:
[
"/wait-for-it.sh",
"db:3306",
"--",
"sh",
"-c",
"python manage.py makemigrations && python manage.py migrate && gunicorn config.wsgi:application --bind 0.0.0.0:8000"
]
healthcheck:
test:
[
"CMD-SHELL",
"curl --fail http://backend:8000/ || exit 1"
]
interval: 5s
timeout: 2s
retries: 10
cadvisor:
container_name: cadvisor
image: gcr.io/cadvisor/cadvisor:v0.47.1
ports:
- "8080:8080"
volumes:
- /:/rootfs:ro
- /var/run:/var/run:ro
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
networks:
- django-network
depends_on:
- backend
frontend:
container_name: frontend
build:
context: ./frontend
dockerfile: Dockerfile.prod
ports:
- "5173:5173"
volumes:
# :을 기준으로 왼쪽은 빌드 이전의 로컬 폴더 오른쪽은 컨테이너 내부의 폴더
- ./frontend:/app
- ./frontend/node_modules:/app/node_modules
- build_folder:/app/dist # 빌드 디렉토리를 볼륨으로 마운트
tty: true
volumes:
mysql_data:
build_folder:
name: build_folder
driver: local
networks:
django-network: