【Docker-compose】django + mysql + nginx
Django部署
Django Dockerfile
FROM python:3.9
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
WORKDIR /app
COPY . /app/XXXXX/
WORKDIR /app/XXXXX/
RUN python -m pip install --upgrade pip \
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r /app/XXXXX/requirements.txt
RUN chmod +x /app/XXXXX/init_sql.sh
CMD /app/XXXXX/init_sql.sh
init_sql.sh
#!/bin/bash
echo "==============> 测试数据库连接"
echo " "
echo " "
sleep 5
echo "数据库已准备就绪,执行迁移命令"
echo " "
echo " "
function execute_migrations {
local attempts=0
while [ $attempts -lt 12 ]; do
python manage.py makemigrations
python manage.py migrate
if [ $? -eq 0 ]; then
break
else
echo "迁移失败,等待5秒后重试"
sleep 5
((attempts++))
fi
done
}
execute_migrations
echo "迁移完成,启动应用"
echo " "
echo " "
exec gunicorn -c gunicorn_config.py XXXXX.wsgi:application
echo " "
echo " "
echo "==============> 完成"
docker-compose部署
sDjango settings.py
# 获取变量环境的值 (或者直接写在settings.py里面)
mysql_name = os.environ.get('MYSQL_NAME', '')
mysql_user = os.environ.get('MYSQL_USER', '')
mysql_password = os.environ.get('MYSQL_PASSWORD', '')
mysql_port = os.environ.get('MYSQL_PORT', '')
mysql_host = os.environ.get('MYSQL_HOST', '')
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': mysql_name,
'USER': mysql_user,
'PASSWORD': mysql_password,
'HOST': mysql_host,
'PORT': mysql_port,
},
}
docker-compose.yml
version: "3.4"
services:
nginx:
image: nginx
restart: always
container_name: 自定义名称
volumes:
- /usr/自定义名称/nginx/www/:/usr/share/nginx/html/ # 默认index页面
- /usr/自定义名称/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
ports:
- 80:80
mysql:
image: mysql:8
hostname: mysql
container_name: '容器名字'
environment:
- MYSQL_ROOT_PASSWORD="上线 数据库密码"
- MYSQL_DATABASE="上线 数据库名字"
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
volumes:
- /usr/project/data:/var/lib/mysql
ports:
- "上线 宿主机映射端口":3306
django:
image: '镜像名'
build:
context: .
container_name: '容器名字'
environment:
- MYSQL_NAME="数据库名"
- MYSQL_USER=root
- MYSQL_PASSWORD="上线 数据库密码"
- MYSQL_PORT="上线 数据库密码"
- MYSQL_HOST="上线 服务器IP地址"
ports:
- "上线 宿主机映射端口":8000
docker-compose.debug.yml
version: "3.4"
services:
nginx:
image: nginx
restart: always
container_name: project_name
volumes:
- /d/usr/project_name/nginx/www/:/usr/share/nginx/html/ # 默认index页面
- /d/usr/project_name/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
ports:
- 80:80
mysql:
image: mysql:8
restart: always
environment:
- MYSQL_ROOT_PASSWORD=123456
- MYSQL_DATABASE="测试 数据库名"
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
volumes:
- /usr/project/data:/var/lib/mysql
ports:
- 3306:3306
django:
image: 'test-django'
build:
context: .
ports:
- "8000:8000"
environment:
- MYSQL_NAME="测试 数据库名"
- MYSQL_USER=root
- MYSQL_PASSWORD=123456
- MYSQL_PORT=3306
- MYSQL_HOST="测试 服务器IP"
depends_on:
- mysql
nginx 指定访问端口(vue history方式编译)
### docker-compose 指定映射端口
services:
nginx:
image: nginx
restart: always
container_name: project_name
volumes:
- /d/usr/project_name/nginx/www/:/usr/share/nginx/html/ # 默认index页面
- /d/usr/project_name/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
ports:
- 8080:8080
...其他不变
### nginx.conf修改监听端口与配置
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
server {
listen 8080;
server_name you_ip;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ /index.html;
absolute_redirect on; # 该指令允许 NGINX 在响应头中发送绝对重定向
server_name_in_redirect off; # 该指令禁止在重定向中包含服务器名称
port_in_redirect on; # 该指令允许在重定向中包含端口号
}
error_page 400 404 404.html;
}
}
Python全栈(后端、数据分析、脚本、爬虫、EXE客户端) / 前端(WEB,移动,H5) / Linux / SpringBoot / 机器学习

浙公网安备 33010602011771号