第三节:jenkins+docker-compose+django+uwsgi

610 阅读6分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情

系列介绍

接下来将记录小白怎样搭建一个完整的前后端分离项目,会有一个系列文章。 其中技术栈包括:

  • 服务器:ubuntu
  • 前端:vue3 nginx
  • 后端:django uwsgi mysql8.0
  • 其他: github docker

文章中若出现问题欢迎大家批评。
第一节:服务器ubuntu搭建jenkins部署项目
第二节:jenkins+docker+nginx+vue

1.本节简要介绍

本节会讲述怎么将django项目自动化部署到服务器上,使用uwsgi进程管理,docker-compose进行服务编排,使用mysql关系型数据库,将整个流程走通之后就可以满足公司中部署服务端项目的基本需求了。如果大家没有任何相关经验的话,可以先看之前写的两篇文章来进行前期准备:django+mysql小demo服务器安装使用jenkins

2.相关技术

  • django
    python编写的web框架,自带强大的后台功能和数据库功能,包含许多功能强大的第三方插件,非常活跃的社区,如果你刚学习python的话,建议从它入手。
  • uWSIGI
    是一个web服务器,实现了WSGI协议、uwsgi、http等协议,具备超快的性能、低内存占用、多app管理,详尽的日志功能,部署django项目很好用。
  • mysql
    关系型数据库
  • docker-compose Dockerfile
    docker服务编排,轻松管理
  • jenkins
    开源CICD软件,简单好用。

3.部署

服务器环境配置 docker docker-compose python3

docker安装

# 更新apt-get 并且可以使用https sudo apt-get update sudo apt-get install \ ca-certificates \ curl \ gnupg \ lsb-release # 添加官方密钥 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg # 安装最新版本的Docker Engine和containerd sudo apt-get install docker-ce docker-ce-cli containerd.io # 启动docker sudo service docker start # 查看docker版本 docker -v

docker-compose安装

# 通过国内地址进行安装
sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# 赋予权限
sudo chmod +x /usr/local/bin/docker-compose
# 查看版本
docker-compose --version

python3安装 官网下载

sudo apt install python3
python3 # 进入python环境
sudo apt install python3-pip
pip3 --version

项目目录与文件编辑

直接贴出来项目目录结构本示例只代表比较基础的演示结构,如果项目有特殊需求需要自行进行研究,后面会给出比较好的文章,大家可以进行深度阅读

image.png 首先讲述mysql的配置文件 mysql直接使用8.0版本的镜像不需要写Dockerfile

  # mysql/conf/my.cnf
 [mysqld]
 # 默认存储引擎
 default-storage-engine=INNODB
 # 字符集
 character-set-server=utf8
 # 端口与docker-compose里映射端口保持一致
 port            = 3306
 # 容器内运行不需要写监听ip地址
 #bind-address= localhost
 #Mysql程序路径
 basedir         = /usr
 #数据目录
 datadir         = /var/lib/mysql
 #临时表存放路径
 tmpdir          = /tmp
 # pid
 pid-file        = /var/run/mysqld/mysqld.pid
 socket          = /var/run/mysqld/mysqld.sock
 skip-name-resolve  # 这个参数是禁止域名解析的,远程访问推荐开启skip_name_resolve。
 
 [client]
 port = 3306
 default-character-set=utf8
 
 [mysql]
 # 自动补全功能
 no-auto-rehash
 # 字符集
 default-character-set=utf8

mysql 的启动配置文件 mysql.init

# mysql允许任何ip使用root用户远程连接
create user root@'%' identified by '123456';
grant all privileges on *.* to root@'%' with grant option;
# 刷新权限
FLUSH PRIVILEGES;

接下来是django的Dockerfile内容

# 建立python3.9 环境
FROM python:3.9
#作者
MAINTAINER LSG

# 安装netcat
RUN apt-get update && apt-get install -y netcat

# 设置pip源为国内源
COPY pip.conf /root/.pip/pip.conf

# 容器内创建文件夹
RUN mkdir -p /var/www/html/testrd

# 设置容器内工作目录
WORKDIR /var/www/html/testrd

# 将当前目录文件加入到容器工作目录中(. 表示当前宿主机目录)
ADD . /var/www/html/testrd

# 更新pip版本pip3
RUN /usr/local/bin/python -m pip install --upgrade pip

# 利用 pip3 安装依赖
RUN pip3 install -r requirements.txt

# 设置start.sh文件可执行权限
RUN chmod +x ./start.sh

# 配置容器启动时运行的命令,执行shell文件
ENTRYPOINT /bin/bash ./start.sh

uwsgi配置文件


[uwsgi]
# Ubuntu系统下默认用户名
uid=root

# Ubuntu系统下默认用户组
gid=root

# 项目名
project=testrd

# 项目根目录
base = /var/www/html

# 设置工作目录
chdir=%(base)/%(project)

# wsgi文件位置
module=%(project).wsgi:application

# 主进程
master=True

# 同时进行的进程数
processes=2

# 选项1, 使用unix socket与nginx通信,仅限于uwsgi和nginx在同一主机上情形
# Nginx配置中uwsgi_pass应指向同一socket文件
# socket=/run/uwsgi/%(project).sock
 
 
# 选项2,使用TCP socket与nginx通信
# Nginx配置中uwsgi_pass应指向uWSGI服务器IP和端口
# socket=0.0.0.0:8000 或则 socket=:8000
 
 
# 选项3,使用http协议与nginx通信
# Nginx配置中proxy_pass应指向uWSGI服务器一IP和端口
# http=0.0.0.0:8000

http=0.0.0.0:8000

# socket权限设置
# chown-socket=%(uid):www-data
# chmod-socket=664

# uWsgi默认的buffersize为4096,如果请求数据超过这个量会报错。这里设置为64k
buffer-size=65536

# 进程文件
pidfile=/tmp/%(project)-master.pid

# 以守护进程运行,并将log生成与temp文件夹。
daemonize=/tmp/%(project)-uwsgi.log

# 服务停止时,自动移除unix socket和pid文件
vacuum=True

# 为每个工作进程设置请求数的上限。当处理的请求总数超过这个量,进程回收重启。
max-requests=5000

#设置一个请求的超时时间(秒),如果一个请求超过了这个时间,则请求被丢弃
harakiri=60
post buffering=8678

#当一个请求被harakiri杀掉会,会输出一条日志
harakiri-verbose=true

#开启内存使用情况报告
memory-report=true

#设置平滑的重启(直到处理完接收到的请求)的长等待时间(秒)
reload-mercy=10

#设置工作进程使用虚拟内存超过1MB就回收重启
reload-on-as= 1024

shell文件内命令

# django与数据库连接初始化
# uwsgi启动
# tail -f /dev/null 防止容器启动后退出
# 执行所有脚本参数的内容
python3 manage.py makemigrations&&
python3 manage.py migrate&&
uwsgi --ini ./uwsgi.ini&&
tail -f /dev/null

exec "$@"

接下来是最重要的docker-compose,

version: '3.3'

networks: # 自定义网络(默认桥接), 不使用links通信
  db_network:
    driver: bridge

services:
  db:
    image: mysql
    restart: always
    container_name: rddb
    environment:
      MYSQL_ROOT_PASSWORD: "123456"
      MYSQL_DATABASE: "test"
    command:
      --default-authentication-plugin=mysql_native_password
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --explicit_defaults_for_timestamp=true
      --lower_case_table_names=1
    ports:
      - 3306:3306
    volumes:
      - /home/ubuntu/db:/var/lib/mysql
      - ./conf:/etc/mysql/conf.d
      - /home/ubuntu/logs:/logs
  web:
    # 使用目录下的Dockerfile
    build: .
    container_name: rdweb
    restart: always
    ports:
      - 8010:8000
    volumes:
      # 挂载项目代码
      - .:/var/www/html/testrd
    networks:
      - db_network 
    # 依赖关系 
    depends_on:
      - db
    environment:
      - DEBUG=False
    tty: true
    stdin_open: true

django项目中settings里 databases配置

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'test',
        'HOST': '42.192.53.215',
        'PORT': '3306',
        'USER': 'root',
        'PASSWORD': '123456'
    }
}

到此所有的配置文件基础版就可以了,我们在后续的开发过程中,可以根据自己的项目需求进行修改。

jenkins设置

jenkins设置只会贴上构建时和构建后的代码,如果你对jenkins的部署和项目基本设置还不了解的话,推荐你看一下第一节文章ubuntu搭建jenkins

tar -zcvf dist.tar.gz *

image.png

cd /home/ubuntu/project/testrd
sudo tar -zxvf  dist.tar.gz
sudo rm -f dist.tar.gz
docker-compose up -d

image.png 构建区域

4.课外知识