Docker 部署 Django

docker 部署 django web

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
demosite
├── db.sqlite3
├── demosite
│   ├── htmlstudy.py
│   ├── __init__.py
│   ├── search.py
│   ├── settings.py
│   ├── testdb.py
│   ├── urls.py
│   ├── views.py
│   └── wsgi.py
├── manage.py
├── media
├── readme
├── test.py
├── uwsgi.ini
└── uwsgi_params

mysql 安装 与设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
$ apt install mysql-server  # 安装数据库
$ apt-get install libmysqlclient-dev # 必须安装
$ pip3 install mysqlclient # 不安装上面module,此处安装会失败
$ sql
### 常用命令
mysql> create database database_name # 创建数据库
mysql> show databases; # 查看数据库列表
mysql> use database_name; # 使用某一个数据库,进入该数据库下
mysql> create table table_name (id int,age int) # 在该数据库下创建表格,括号内是列名和对应的类型,一列即可
mysql> drop database database_name # 删除某个数据库
mysql> show tables; # 查看所有表
#####
mysql> create database demosite; # 创建名为demosite的数据库
mysql> use demosite; # 进入该数据库下
mysql> create table demosite # 创建名为demosite的表,可与数据库名重复
mysql> create user 'demosite'@'localhost' identified by 'setting-user-password';
## grant使用说明
Grant <权限> on 表名[(列名)] to 用户 With grant option
或 GRANT <权限> ON <数据对象> FROM <数据库用户>

mysql> grant usage on *.* to 'demosite'@'localhost'; # demoste无权访问所有文件
mysql> grant all privileges on demosite.* to 'demosite'@'localhost';# 赋予demosite用户访问demosite数据库下所有表的权限,注意demosite区分
###### demosite django程序的setting.py文件修改
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'demosite', # 数据库名
'USER': 'demosite', # 用户名
'PASSWORD': '1234', # 用户密码
'HOST': 'localhost',
'PORT':3306, # mysql默认端口
}
}

docker 安装

操作系统ubuntu18,该系统有大量的软件库,因此安装docker极为方便,通常命令行输入docker,若未安装该软件,会提示如何快捷安装。

1
sudo apt install docker.io
1
$ docker search ubuntu
1
2
3
4
5
6
7
8
9
10
NAME                                                      DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
ubuntu Ubuntu is a Debian-based Linux operating sys… 9843 [OK]
dorowu/ubuntu-desktop-lxde-vnc Docker image to provide HTML5 VNC interface … 334 [OK]
rastasheep/ubuntu-sshd Dockerized SSH service, built on top of offi… 228 [OK]
consol/ubuntu-xfce-vnc Ubuntu container with "headless" VNC session… 186 [OK]
ubuntu-upstart Upstart is an event-based replacement for th… 99 [OK]
ansible/ubuntu14.04-ansible Ubuntu 14.04 LTS with ansible 97 [OK]
neurodebian NeuroDebian provides neuroscience research s… 58 [OK]
1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5 ubuntu-16-nginx-php-phpmyadmin-mysql-5 50 [OK]
ubuntu-debootstrap debootstrap --variant=minbase --components=m… 40 [OK]
1
2
$ docker pull ubuntu
$ docker images

uwsgi 安装 设置

1
2
3
4
5
6
7
pip3 install uwsgi
# demosite下创建test.py,测试uwsgi
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"] # python3
#return ["Hello World"] # python2
uwsgi --http :8000 --wsgi-file test.py # 若服务器IP:8000访问成功,即没有问题,一般情况都是正常的

运行

1
2
3
4
5
6
7
8
9
10
11
12
### 前三行命令参考菜鸟教程,后边为正常操作
$ python manage.py migrate # 创建表结构, 此处我也不是很明白
$ python manage.py makemigrations TestModel # 让 Django 知道我们在我们的模型有一些变更
$ python manage.py migrate TestModel # 创建表结构
python3 manage.py makemigrations # 执行该命令,djangoweb就知道发生了哪些变化,日常操作
python3 manage.py runserver 0.0.0.0:8000 # 服务器首先需要打开端口8000,浏览器打开 服务器IP:8000 即可访问
uwsgi --http :8000 --module demosite.wsgi # 或者采用这种方式
### 关闭服务器远程桌面,django web 后台保护模式运行,不停止
nohup uwsgi --http :8000 --module demosite.wsgi &
ps -aux | grep uwsgi |awk '{print $2}' |xargs kill -9 #终止后台托管

uwsgi --http-socket :6816 --plugin python --wsgi-file demosite/wsgi.py

静态文件部署

docker 部署

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
FROM ubuntu/python:3.6.8
MAINTAINER gsz "gan_shizhong@163.com"
ENV mypath /demosite
WORKDIR $mypath
COPY ./demosite/* $mypath
RUN apt update \
&& apt install -y python3-pip \
mysql-server\
&& pip3 install uwsgi \
django
EXPOSE 8001
CMD python3 manage.py makemigrations
ENTRYPOINT [ "uwsgi" ]
CMD ["--http :8001 --module demosite.wsgi"]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
FROM ubuntu/python:3.6.8
MAINTAINER gsz "gan_shizhong@163.com"
ENV mypath /demosite
WORKDIR $mypath
COPY ./sendcloud_django2/* $mypath
RUN apt update \
&& apt install -y python3-pip
&& pip3 install uwsgi \
django==2.2.8
EXPOSE 8002
CMD python3 manage.py makemigrations
CMD python3 manage.py migrate
ENTRYPOINT [ "uwsgi" ]
CMD ["--http :8002 --module demosite.wsgi"]

nginx uwsgi 部署

1. 参考文献

Django 部署(Nginx)

添加镜像源

  1. 编辑源配置文件 /etc/apt/sources.list

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24

    echo '#aliyun
    deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse
    echo '# tsinghua
    deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main restricted
    deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates main restricted
    deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial universe
    deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates universe
    deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial multiverse
    deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates multiverse
    deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
    deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security main restricted
    deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security universe
    deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security multiverse' > /etc/apt/sources.list

  2. 执行 apt-get update

  3. pip添加镜像源

  • 临时使用
    1
    pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple some-package
  • 设置默认(存在问题pip3 不行)
    1
    2
    pip3 install pip3 -U
    pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

PYTHONIOENCODING=utf-8 python your_script.py

2. 具体流程

  • 启动docker
    1
    docker run -it -p 8321:8001 -v /home/ec2-user/sinnetflow/:/home/ --name sinnetflow centos:centos7 bash
  • 安装
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    ## nginx 安装
    yum install epel-release
    yum install nginx
    ## mariadb 安装
    vi /etc/yum.repos.d/MariaDB.repo
    [mariadb]
    name = MariaDB
    baseurl = https://mirrors.tuna.tsinghua.edu.cn/mariadb/yum/10.5/centos7-amd64/
    gpgkey = https://mirrors.tuna.tsinghua.edu.cn/mariadb/yum/RPM-GPG-KEY-MariaDB
    gpgcheck = 1

    ## 清楚并创建缓存
    yum clean all
    yum makecache

    yum install MariaDB-server MariaDB-client -y



    systemctl start mariadb
    systemctl enable mariadb
    systemctl status mariadb

    yum install python3-pip

    yum install gcc mysql-devel python3-devel
    pip install mysqlclient


    traceroute
    ICMP



    1
    2
    3
    4

    pip3 install uwsgi --upgrade
    pip3 install django==2.2
    pip3 install requests
  • nginx
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    ## 配置文件 
    cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak
    vim /etc/nginx/sites-available/default
    ## 内容如下:
    server {
    listen 8000;
    location / {
    uwsgi_pass django;
    include /etc/nginx/uwsgi_params;
    }
    location /media {
    alias /home/media;
    }
    location /static {
    alias /static;
    }

    }


    upstream django{
    server unix:///etc/workflow/workflow.sock;
    # server 127.0.0.1:8001;
    }
    ## 项目根目录下新建uwsgi.ini , 内容如下:
    # mysite_uwsgi.ini file
    [uwsgi]

    # Django-related settings
    # the base directory (full path)
    chdir = /home
    # Django's wsgi file
    module = sinnet.wsgi
    # the virtualenv (full path)

    # process-related settings
    # master
    master = true
    # maximum number of worker processes
    processes = 4
    # the socket (use the full path to be safe
    socket = /etc/mailweb/mysite.sock

    # ... with appropriate permissions - may be needed
    # chmod-socket = 664
    # clear environment on exit
    vacuum = true
    socket-timeout = 20000
    daemonize = /etc/mailweb/mailweb.log
    log-maxsize = 50000000
    disable-logging = true
    max-requests = 5000
    pidfile = /etc/mailweb/mailweb.pid

    部署操作

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # setting.py 设置 static_root = "path",服务器环境的绝对路径
    # Debug改成False
    # 时区修改
    python3 manage.py collectstatic # 首先将静态文件集中到一个文件夹下

    # 启动 nginx
    service nginx restart
    # 启动 uwsgi
    uwsgi -d --ini uwsgi.ini #后台
    uwsgi --stop mailweb.pid # 终止进程

    使用supervisor管理进程

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    pip3 install supervisor # 安装
    echo_supervisord_conf > /etc/supervisord.conf # 生成默认配置文件
    ## 修改配置文件,再supervisord.conf末尾添加,同事修改其他log文件路径,避免放在temp文件下。
    [program:celerytask]
    command=celery worker -A celerytask.main -l info
    directory=/home/
    startsecs=0
    stopwaitsecs=0
    autostart=true
    autorestart=true
    stdout_logfile=/var/log/sinnetMail/sinnetmail_celery.log
    stdout_logfile_maxbytes=10MB ; max # logfile bytes b4 rotation (default 50MB)
    stderr_logfile=/var/log/sinnetMail/sinnetmail_celery_err.log
    stderr_logfile_maxbytes=10MB ; max # logfile bytes b4 rotation (default 50MB)

    # 启动
    supervisord -c /etc/supervisord.conf
    # 通用命令
    supervisorctl -c /etc/supervisord.conf [start|stop|restart] [program-name|all]

git .gitigonre 失效解决办法

1
2
3
git rm -r --cached
git add .
git commit -m "update .gitignore"