centos7+docker+nginx+django+uwsgi

  • 前言
  • 一、构建Django的镜像
  • 1.参考文档
  • 2.原理
  • 3.操作过程
  • 二、构建Nginx容器
  • 1.安装nginx
  • 2.修改配置
  • 三、知识点
  • 1.容器IP
  • 2.服务端口


前言

在centos7上,使用Docker部署Django,使用uwsgi+nginx来代理


一、构建Django的镜像

1.参考文档

参考文档 主要按照这个文档来就可以了。

2.原理

  1. django本质还是一个基于python的框架,所以基于自己使用的python版本,做一个镜像就可以了。

3.操作过程

  1. 准备工作
  • 服务器创建目录,存放自己的项目,我的目录是【/root/Django/TeamPlayAdmin】
  • 导出requirements.txt文件【pip freeze > requirements.txt】
  1. 创建docker容器
docker run -di --name=TeamPlayAdmin -p 8025:8025 -v /root/Django/TeamPlayAdmin:/home python:3.8.5
  • /root/Django/TeamPlayAdmin是本地路径,django项目的项目路径。
  • python3.8.5是自己的python环境
  1. requirements.txt是之前从django导出的安装包。创建容器之前先从本地生成这个文件。
pip install -r requirements.txt  -i https://pypi.tuna.tsinghua.edu.cn/simple
  1. 安装vim
    apt-get update
    apt-get install vim
  2. 修改settings.py中ALLOWED_HOSTS = [’*’]
  3. 使用python manage.py runserver 127.0.0.1:8025测试程序是否正常
  4. 换uwsgi跑,先安装pip install uwsgi -i https://pypi.tuna.tsinghua.edu.cn/simple
  5. uwsgi配置文件。
    如果使用curl命令测试uwsgi之后的程序是否正常,一定要注释socket,改为http
    uwsgi.ini配置文件截图:

    [uwsgi]
    #配置和nginx连接的socket连接
    #socket=0.0.0.0:8025
    #也可以使用http
    http=0.0.0.0:8025
    #配置项目路径,项目的所在目录
    chdir=/home
    #配置wsgi接口模块文件路径
    #wsgi-file=django_test/wsgi.py
    module=TeamPlayAdmin.wsgi
    #配置启动的进程数
    processes=4
    #配置每个进程的线程数
    threads=2
    #配置启动管理主进程
    master=True
    #配置存放主进程的进程号文件
    pidfile=uwsgi.pid
    #配置dump日志记录
    daemnotallow=uwsgi.log
  6. uwsgi命令
    uwsgi --ini uwsgi.ini #启动
    ps aux | grep uwsgi   #按照程序名查询
    uwsgi --stop uwsgi.pid #通过uwsg停止uwsgi
  7. curl测试方法
    curl 127.0.0.1:8025
    如果执行上述命令出现curl: (52) Empty reply from server,检查uwsgi.ini文件中开启的是socker还是http
  8. uwsgi命令-添加样式
    uwsgi --ini uwsgi.ini –static-map /static=/home/static

二、构建Nginx容器

1.安装nginx

  1. 拉取nginx镜像 docker pull nginx
  2. 创建nginx容器 sudo docker run --name nginx-teamplay -p 80:80 -p 8026:8026 -v /root/Django/TeamPlayAdmin/static:/home/TeamPlayAdmin -d nginx
  3. 8026端口是用于代理另外容器的端口号。/root/Django/TeamPlayAdmin/static本地Django项目静态文件的路径。/home/TeamPlayAdmin是容器内路径,不存在的话会创建。

2.修改配置

  1. 配置文件目录:/etc/nginx 容器中的目录和普通的有点不同
  2. 修改配置,添加server及静态文件引用
server {
	listen 8026;
	server_name localhost;
	location / {
		proxy_pass http://172.17.0.2:8025;
	location /static {
		alias /home/TeamPlayAdmin;
	}
}

完整如下(其实大部分是默认的,只加了上面的server):

docker 构建django应用 docker部署django项目_docker 构建django应用

  1. 检查配置 nginx -t 容器中不用在指定目录执行
  2. 重启服务 nginx -s reload 容器中不用在指定目录执行
  3. 静态文件引用,alias /home/TeamPlayAdmin; Django的静态文件会指向这个路径

三、知识点

1.容器IP

  1. 在用Nginx反向代理时,需要获取容器的IP,容器的IP可以通过docker inspect 容器名称来查看。也可以通过Weave Scope来查看

2.服务端口

  1. 在上面的文章中,我们django程序的端口,是在nginx创建时,就已经映射好。所以我们在程序可以直接通过Nginx来代理。如果nginx已经创建好,且在创建时没有指定新的程序的端口(基本都这样),那这个时候怎么办?
  2. 修改配置改容器配置(新增端口映射)。
  3. 配置文件在 /var/lib/docker/containers/[hash_of_the_container]/hostconfig.json 还有 config.v2.json
  4. 新增端口映射参考文档