使用Docker部署django+nginx+uwsgi+redis+celery+mysql+vue项目

一、项目需求

技术要求:了解docker常用命令以及会使用下面使用到的技术
部署环境:腾讯云ubuntu18.04
本地开发系统:MacOS
远程工具:FinalShell(推荐,超级好用)
后端技术栈:python、django、nginx、uwsgi、redis、celery、mysql
前端技术栈:vue一个前台移动端项目、一个后台管理项目(这是django的一个库simpleui搭建的后台管理,就是把django的admin后台给换了个ui,使用的是django的模版语法)
使用docker进行部署

  • 优点:方便部署(方便后期进行自动化部署)、能够保持代码运行环境的一致、各个容器独立运行(如果每个服务都开启多个容器,则某个服务只要还有一个容器在运行,用户还是能够正常访问网站),其他还有很多优点(毕竟用的人这么多)
  • 缺点:上手有一点难度(其实也还好,照着配置一边基本就会了,但是会碰到各种各样的问题,不一一列举,找度娘就完事了)

二、项目结构

在这里插入图片描述

三、具体配置

  1. docker-compose.yml
# 打印版本的信息,没啥大用
version: "3"

services:
  mysql:  # 这个地方的mysql就对应django配置文件settings.py中的数据库设置的HOST
    image: mysql:8.0.21  # mysql镜像
    container_name: mysql # 创建出来的容器名
    ports: # 端口映射(主机:容器)
      - "3306:3306"
    # 预设置数据库
    environment:
      - MYSQL_ROOT_HOST=localhost # root只能使用localhost链接,无法使用远程链接
      - MYSQL_DATABASE=wypt    # 数据库名
      - MYSQL_ROOT_PASSWORD=1061750360 # root用户密码
    volumes: # 目录挂载(主机目录:容器目录)
      - /home/mysql/db:/var/lib/mysql
      - ./config/mysql/conf/my.cnf:/etc/my.cnf
      - ./config/mysql/init:/docker-entrypoint-initdb.d/
      - ./home/mysql/sql_backup:/back
    networks: # 使用的网络(需要在下面定义)
      - wypt_network
    healthcheck: # 心跳检测
      test: ["CMD", "curl", "-f", "http://localhost"]
      interval: 1m30s
      timeout: 10s
      retries: 3
    restart: always  # 若容器运行出现问题,会自动重启容器

  # 这个地方的web就对应nginx配置文件中的proxy_pass http://web:8000
  web: # django代码服务
    build: . # 在当前目录下构建web服务(也就是Dockfile在的目录)
    container_name: web
    privileged: true # 是否拥有root用户权限,mysql服务不要设置,会有问题
    ports:
      - "8888:8888"
    volumes:
      - .:/wypt_server
    working_dir: /wypt_server/config/uwsgi # 容器启动后自动进入改目录
    command: uwsgi --ini uwsgi.ini # 容器启动后执行的命令:此时在/wypt_server/config/uwsgi目录下,启动uwsgi
    networks:
      - wypt_network
    # 定义容器间的依赖关系,比较直观一点就是启动顺序会严格按照depend_on顺序启动
    depends_on:
      - mysql
      - redis
    links: # 网络连接关系
      - mysql
      - redis
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost"]
      interval: 1m30s
      timeout: 10s
      retries: 3
    restart: always
  celery: # 跑celery的服务
    build: .
    container_name: celery
    privileged: true
    ports:
      - "8888"
    volumes:
      - .:/wypt_server
    command: celery -A celery_task.main  worker --loglevel=info # 启动celery
    networks:
      - wypt_network
    # 定义容器间的依赖关系,比较直观一点就是启动顺序会严格按照depend_on顺序启动
    depends_on:
      - mysql
      - redis
    links:
      - mysql
      - redis
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost"]
      interval: 1m30s
      timeout: 10s
      retries: 3
    restart: always
  nginx:
    image: nginx
    container_name: nginx
    privileged: true
    ports:
      - "80:80"
      - "8080:8080"
    volumes:
      - ./config/nginx/logs/:/var/log/nginx/
      - ./dist:/usr/share/nginx/html
      - ./uploads:/usr/share/nginx/html/uploads
      - ./config/nginx/nginx.conf:/etc/nginx/nginx.conf:ro
      - ./config/nginx/conf.d:/etc/nginx/conf.d
    networks:
      - wypt_network
    depends_on:
      - web
    links:
      - web
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost"]
      interval: 1m30s
      timeout: 10s
      retries: 3
    restart: always
  redis:
    image: redis
    container_name: redis
    privileged: true
    ports:
      - "6379:6379"
    networks:
      - wypt_network
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost"]
      interval: 1m30s
      timeout: 10s
      retries: 3
    restart: always

networks:
  wypt_network:

  1. Dockerfile
# 选择基础镜像,如果没有事先下载的话会先执行下载操作,也可以直接下载centos镜像,但是在下面就需要额外配置python环境
FROM python:3.8.2
MAINTAINER xmzd  # 该镜像的作者

# 创建目录
RUN mkdir /wypt_server

# 将上面的目录设置为工作目录(这个工作目录是镜像内的)
WORKDIR /wypt_server

# 将当前目录复制到工作目录中,可以使用ADD(注意这个".",表示当前我们的项目目录,.后面有个空格别漏了)
COPY . /wypt_server

# 这里使用豆瓣源安装python第三方库
RUN pip install -i https://pypi.douban.com/simple --upgrade pip \
    && pip install -i https://pypi.douban.com/simple -r requirements.txt

# 百度ENTRYPOINT和CMD的区别,和docker-compose.yml下command和    entrypoint的区别
# ENTRYPOINT python manage.py makemigrations \
#    && python manage.py migrate \
#    && uwsgi --ini ./config/uwsgi/uwsgi.ini
  1. my.cnf
[mysqld]
user=mysql
default-storage-engine=INNODB
character-set-server=utf8mb4
# 导入文件限制
max_allowed_packet=1024M
# 8.0版本自适应参数【很重要的配置】
innodb_dedicated_server=on
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
  1. init.sql
-- 中间遇到一些问题所有都注释了,嫌麻烦建议使用数据库的root账号
-- 创建数据库:mydb
-- use mysql;
create database wypt;
-- 创建用户: mydb
-- CREATE USER 'admin'@'%' IDENTIFIED BY '1061750360';
-- 授予用户通过外网IP对数据库“wypt”的全部权限
-- all 可以替换为 select,delete,update,create,drop
-- grant all on admin.* to 'wypt'@'%';
-- 刷新权限
-- flush privileges;
  1. default.conf
    因为这里nginx挂载了两个vue项目,所以只能通过监听不同的端口号来区分,有域名的可以通过域名进行区分,80是移动端服务,8080是后台管理服务
upstream django{
   server web:8888; # 注意:这里的web代表的是docker-compose.yml中的服务名
}
server {
    listen       80; # 监听80端口
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm index.jsp;
        try_files $uri $uri/ /index.html;
    }
    location /api {
        uwsgi_pass    django;  # 请求发送至上面定义的django服务器
        include  /etc/nginx/uwsgi_params;
    }
    location /static { # 设置静态资源目录
        alias  /usr/share/nginx/html/static;
    }
    location /uploads { # 设置上传目录资料的目录,根据实际来是否设置
        alias  /usr/share/nginx/html/uploads;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    #error_page   500 502 503 504  /50x.html;
    #location = /50x.html {
    #    root   /usr/share/nginx/html;
    #}
}
server {
    listen       8080;
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        uwsgi_pass    django;
        include  /etc/nginx/uwsgi_params;
    }
    location /static {
        alias  /usr/share/nginx/html/static;
    }
    #location /uploads {
    #    alias  /home/ubuntu/wypt_server/uploads;
    #}

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    #error_page   500 502 503 504  /50x.html;
    #location = /50x.html {
    #    root   /usr/share/nginx/html;
    #}
}
  1. nginx.conf
user  root;  # 这里修改为服务器的root用户,或者是有权限读写文件的用户
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    client_max_body_size 10m;

    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;
}
  1. uwsgi.ini
[uwsgi]
chdir           = /wypt_server
module          = wypt_server.wsgi
master          = true
processes       = 10
socket          = :8888 # 这里写端口号就行
chmod-socket    = 666
vacuum          = true
stats           = %(chdir)/config/uwsgi/uwsgi.status
pidfile         = %(chdir)/config/uwsgi/uwsgi.pid
;daemonize       = /wypt_server/config/uwsgi/logs/wypt_server.log
  1. settings.py 改文件仅供参考
DEBUG = False # 方便看错误可以改为True
ALLOWED_HOSTS = ['*']
# 数据库配置
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'HOST': 'mysql',   # 这里填docker-compose.yml中的mysql服务名
        'PORT': 3306,
        'USER': '',
        'PASSWORD': '',
        'NAME': ""
    }
}
# 	中国时区
from django.utils.translation import gettext_lazy as _

LANGUAGES = [
    ('zh-Hans', _('Chinese')),
]

LANGUAGE_CODE = 'zh-Hans'

TIME_ZONE = 'Asia/Shanghai'

# 静态资源配置
STATIC_URL = '/static/'
# STATICFILES_DIRS = [
#     os.path.join(BASE_DIR, 'static')
# ]
STATIC_ROOT= os.path.join(BASE_DIR, "dist/static")

# 配置资源访问时的前缀 www.123.com/uploads/1.jpg
MEDIA_URL = '/uploads/'
# 配置上传文件上传路径
MEDIA_ROOT = os.path.join(BASE_DIR, 'uploads')
  1. django多环境配置
    由于是uwgsi启动项目,所以修改wsgi.py中的settings为生产的配置
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "wypt_server.settings_prod")

在这里插入图片描述

四、常用命令(嫌敲命令烦的可以看第五步)

列举镜像:docker images
删除镜像:docker rmi -f 镜像ID
列举容器:docker ps
列举所有容器:docker ps -a
列举所有容器的ID:docker ps -aq
删除容器:docker rm 容器ID
删除所有容器:docker rm $(docker ps -aq)
构建项目:docker-compose up (如果已有镜像,则不会构建)
重新构建:docker-compose up --build

五、docker可视化工具portainer(可装可不装)

可以通过这个进行镜像、容器、网络等等的一些管理
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_16687863/article/details/115068376
今日推荐