【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;
    }
}


posted @ 2023-11-20 15:57  PythonNew_Mr.Wang  Views(74)  Comments(0)    收藏  举报