docker部署django网站

docker部署django网站

以下均在centos7下进行。

1. 安装docker

相关指令

  • 启动docker服务 systemctl start docker

在安装前,需要确认是否已经安装docker,直接执行docker指令。如果已经安装,则直接跳到下一步。

  • 没有安装

    docker部署django网站

  • 已经安装

    docker部署django网站

安装并启动docker

  1. 安装方法,执行下列语句(参考):

    curl -sSL https://get.daocloud.io/docker | sh
    
  2. 安装后,启动docker服务:

    systemctl start docker
    

2. 下载并启动centos镜像

相关指令

  • 下载镜像 docker pull [iamge]
  • 启动镜像 docker run -di --name [container] [image]
  • 进入镜像 docker exec -it [container] /bin/bash
  • 退出镜像 ctrl + D

在部署网站时,使用的python等软件的版本是不一样的,这里就直接使用纯净的centos镜像,然后再上面安装需要的软件。

  1. 注册dockerhub账号

    dockerhub类似于github,是docker的远程仓库,在https://hub.docker.com/注册一个账号,并记住账户名,之后会使用到。这里我的账户名是xdcat,之后也会被多次用到。

  2. 下载centos镜像,这里的centos是一个官方镜像的名称。

    docker pull centos
    

    docker部署django网站

    • 查看是否下载完成

      docker部署django网站

  3. 创建并启动容器

    • --name sample_django_project 容器的别名,方便之后使用
    • centos 来源的镜像,就是之前下载的
    • -p 8090:80 将容器的80端口映射到电脑的8090端口
    docker run -tid --privileged=true --name sample_django_project -p 8090:80 centos /usr/sbin/init
    

    docker部署django网站

  4. 进入容器,这里直接使用刚刚创建的别名进入。

    docker exec -it sample_django_project /bin/bash
    

    在进入容器后,我们可以发现前面的标识符不一样了。

    docker部署django网站

3. 在容器中准备网站环境

容器就相当于一个linux系统,直接在容器中安装对应的软件并运行网站。这里我们以PON-Sol2的网站为例,使用uwsgi部署网站。

  1. 进入家目录

    cd
    

    docker部署django网站

  2. 下载代码

    代码我放在的github上,默认是没有git的,所以需要先安装git后,再下载代码。

    1. 安装 git

      yum install -y git
      

      docker部署django网站

    2. clone 代码

      git clone https://github.com/XDcat/PonSol2_Web
      

      docker部署django网站

  3. 安装python

    项目中对于python版本和各个软件版本有明确要求,这里使用miniconda(简化版的anacodna),使用conda管理不同版本的python。这里并不一定要要conda,直接安装python然后安装对应包就可以,看个人习惯。

    1. 安装wget,用于下载其他内容

      yum -y install wget
      

      docker部署django网站

    2. 官网下载miniconda

      wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
      

      docker部署django网站

      docker部署django网站

    3. 安装miniconda

      bash Miniconda3-latest-Linux-x86_64.sh
      

      安装流程:

      • 回车:开始安装

      • 按住空格:跳过条款

      • yes:接受条款

      • 回车:默认安装路径

      • yes:是否初始化conda

    4. 安装miniconda后,需要重新进入系统这样才能启动conda环境

      1. ctrl + D 退出系统

      2. 进入容器

        docker exec -it sample_django_project /bin/bash
        

        此时命令行最前面将会出现base字样,表示初始化了conda

        docker部署django网站

      3. 进入家目录

        cd
        
      4. 修改conda配置文件,添加镜像源

        vi .condarc
        

        修改为下列内容

        ssl_verify: true
        show_channel_urls: true
        channels:
          - https://mirrors.sjtug.sjtu.edu.cn/anaconda/cloud/conda-forge/
          - https://mirrors.sjtug.sjtu.edu.cn/anaconda/pkgs/free/
          - https://mirrors.sjtug.sjtu.edu.cn/anaconda/pkgs/main/
          - defaults
        channel_priority: flexible
        
  4. 创建网站运行环境

    1. 创建python环境

      注意:这里的python版本是根据网站来的。

      • ponsol 环境名称,再之后会多次使用到
      • python=3.7.7 指定python版本
      conda create -n ponsol python=3.7.7
      
    2. 激活ponsol环境

      conda activate ponsol
      
    3. 安装指定包

      根据项目安装相应包,本网站所有需要的软件包都放在了PonSol2_Web/environment.yml中。

      pip install -r /root/PonSol2_Web/environment.yml
      
  5. 测试网站是否能够正常运行

    python /root/PonSol2_Web/manage.py runserver 0.0.0.0:80
    

    如果没有报错的话,一般就是正常运行了。在我们启动容器的时候,已经将容器的端口映射到了外部的8090端口,所以可以在访问系统的8090端口,就可以看到网站。

    注意:如果不能访问,请检查ip是否为装有docker的linux的ip,是否开启防火墙。

    docker部署django网站

    ? docker部署django网站

4. 安装uwsgi

django可以直接使用runserver启动网站,但是这适合在测试时使用,实际部署需要使用uwsgi进行部署。

  1. 进入项目的python环境,如果已经进入,跳过这一步

    conda activate ponsol
    
  2. 安装 gcc

    uwsgi的安装,需要使用gcc及进行编译,所以先安装gcc。

    yum -y install gcc gcc-c++ kernel-devel
    
  3. 安装 uwsgi

    pip 安装会报错,所以这里请使用 conda 安装。

    conda install uwsgi
    

    docker部署django网站

5. 使用uwgsi运行网站

  1. 将项目设置为非debug环境

    1. 修改项目setting文件中DEBUG为True

      vi /root/PonSol2_Web/PonSol2_Web/settings.py
      

      docker部署django网站

    2. 设置静态文件路径

      这里的STATIC_ROOT,如果没有话,自己添加一个就可以了。因为在正式的部署环境中,静态文件是单独管理的,之后也需要交给uwsgi单独管理。

      • STATIC_ROOT = ‘/srv/django/ponsol2/static‘ 静态文件保存在哪个路径
      • STATIC_URL = ‘/PON-Sol2/static/‘ 网站静态文件的url前缀
      vi /root/PonSol2_Web/PonSol2_Web/settings.py
      

      docker部署django网站

    3. 迁移静态文件

      静态文件将会迁移到上述STATIC_ROOT路径中去。

      python /root/PonSol2_Web/manage.py collectstatic
      
  2. 编写uwgsi配置文件

    为了方便运行网站,将uwsgi需要的参数全写进配置文件中,这个文件我保存在了/root/PonSol2_Web/uwsgi.ini,也就像项目根目录下。

    vi /root/PonSol2_Web/uwsgi.ini
    

    内容如下:

    [uwsgi]
    http=:80
    chdir= /root/PonSol2_Web
    module=PonSol2_Web.wsgi
    static-map=/PON-Sol2/static=/srv/django/ponsol2/static
    vacuum=True
    master=True
    pidfile=/tmp/project-master.pid
    processes = 4
    threads = 20
    

    解释:

    [uwsgi]
    # 网站启动端口
    # 注意:端口与映射端口一致
    http=:80
    # 项目根路径
    chdir= /root/PonSol2_Web 
    # 注意:这个是指项目根路径下的PonSol2_Web目录下的wsgi.py文件
    # 也就是/root/PonSol2_Web/PonSol2_Web/wsgi.py
    module=PonSol2_Web.wsgi  
    # 这里是指静态文件将会在网站的/PON-Sol2/static路径
    # 静态文件所在的目录为/srv/django/ponsol2/static,也就是在之前迁移的地方。
    # 注意:这里是一个很关键的地方,静态文件是否能够正常加载,就靠这里了
    static-map=/PON-Sol2/static=/srv/django/ponsol2/static  
    # 以下内容默认就可
    vacuum=True
    master=True
    pidfile=/tmp/project-master.pid
    processes = 4  # 进程数
    threads = 20  # 线程数
    
  3. 使用uwgsi启动网站

    uwsgi --ini /root/PonSol2_Web/uwsgi.ini
    

    docker部署django网站

    docker部署django网站

6. 设置网站开机自动启动

在docker的容器中,使用系统服务,设置网站开机自动启动,并且方便在后台运行与管理。在之后分享给其他人后,别人只需要创建容器,便可以直接使用网站,而不需要进入容器中启动,这样对于其他人就很方便了。

  1. 编写系统服务配置文件

    需要编写配置文件来注册系统服务,系统服务配置文件在/usr/lib/systemd/system中,并根据网站的名称创建service文件。配置文件中需要注意的只有ExecStart,将之修改为之前运行uwsgi的指令,但是这里需要使用绝对路径。具体如下所示:

    寻找uwgsi绝对路径:

    conda activate ponsol  # 进入之前创建的python环境
    type uwsgi  # 使用type找到uwgsi的路径,这里为/root/miniconda3/envs/ponsol/bin/uwsgi
    # 测试启动指令能够正常运行,这个就是配置文件的ExecStart
    /root/miniconda3/envs/ponsol/bin/uwsgi --ini /root/PonSol2_Web/uwsgi.ini 
    

    docker部署django网站

    创建并编写配置文件:

    vi /usr/lib/systemd/system/ponsol.service
    

    文件内容:

    [Unit]
    Description=ponsol2
    After=network.target
    
    [Service]
    TimeoutStartSec=30
    ExecStart=/root/miniconda3/envs/ponsol/bin/uwsgi --ini /root/PonSol2_Web/uwsgi.ini
    ExecStop=/bin/kill -9 $MAINPID
    
    [Install]
    WantedBy=multi-user.target
    
  2. 启动服务

    在常见好配置文件后,需要刷新系统服务,让系统识别到我们新增的服务。同时,还需要设置服务为开机启动,并启动服务。启动服务后,网站就部署完成了,会一直在后台运行。

    systemctl daemon-reload  # 刷新系统服务
    systemctl enable ponsol.service  # 开机启动
    systemctl start ponsol  # 启动网站服务
    systemctl status ponsol  # 查看网站状态
    

    docker部署django网站

  3. 管理网站(以下操作不是必须)

    网站设置为系统服务后,网站将运行在后台且容易管理,如启动、重启、停止和查看状态。

    systemctl start ponsol  # 启动
    systemctl status ponsol  # 查看状态
    systemctl stop ponsol  # 停止
    systemctl restart ponsol  # 重启
    

7. 保存容器为镜像并上传

在完成部署后,就可以将容器保存为镜像,保存网站的初始状态,并可以分享给其他人。

  1. 保存为镜像

    保存镜像的操作,与git的commit类似,将容器保存当前状态并创建镜像。

    使用ctrl+D退出容器后,执行:

    • -m "init django project" 添加备注
    • -a "xdcat" 用户名称
    • ponsol2 容器的名称
    • xdcat/sample_django_project创建镜像的名称,xdcat表示用户名称,sample_django_project表示具体镜像名称。注意:这里的用户名称要与之前创建的用户名称一致
    docker commit -m "complete deploying website" -a "xdcat" sample_django_project xdcat/sample_django_project  # 创建镜像。第一次需要等待比较长的时间。
    docker iamge ls  # 查看所有镜像
    

    docker部署django网站

  2. 注册dockerhub账户

    dockerhub将类似于github一样,可以将自己的镜像分享到dockerhub上,并可以分享给其他人。在使用dockerhub前,必须要注册一个账户:https://hub.docker.com/

  3. 登陆dockerhub账户

    docker login
    

    docker部署django网站

  4. push镜像

    使用push将镜像推送至dockerhub远程仓库。

    • xdcat/sanmpe_django_project 其中 xdcat 表示用户名,sanmpe_django_project是镜像名称,将镜像推送到登陆的账户的仓库中
    docker push xdcat/sample_django_project
    

    docker部署django网站

8. 将网站分享给其他人

dockerhub的用户名是唯一的,只需要通用用户名/镜像名,其他人就可以使用镜像。下面的例子,我已经换了另一台电脑用于展示。

  1. 使用pull拉取镜像

docker pull xdcat/sanmpe_django_project


![image-20210702192134136](https://xdcat-tuchuang.oss-cn-beijing.aliyuncs.com/imgimage-20210702192134136.png)

2. 查看镜像

```sh
docker image ls

docker部署django网站

  1. 创建并启动容器

    在启动容器后,就可以直接在8090端口访问网站。

    docker run -tid -p8090:8000 --name sample_django_project --privileged=true xdcat/sanmpe_django_project /usr/sbin/init  # 创建并启动容器
    

    docker部署django网站

部署后管理

  1. 保存项目

    在我们设置开机启动前,我们不妨保存一下容器的状态,将容器保存为一个镜像。使用Ctrl+D退出容器,再使用以下指令创建镜像,这个指令很想git的commit。

    • -m "init django project" 添加备注
    • -a "xdcat" 用户名称,这里的用户是指docker网站上的用户,可以去注册一个
    • ponsol2 容器的名称
    • xdcat/sanmpe_django_project 创建镜像的名称,xdcat表示用户名称,sanmpe_django_project表示具体镜像名称
    docker commit -m "init django project" -a "xdcat" sample_django_project xdcat/sanmpe_django_project
    

    在指令结束后,可以使用docker image ls查看所有的镜像。这里第一个就是我们的镜像,虽然有3G,但是相比于一个完整的centos已经很小了。

    docker部署django网站

  2. 删除并重新运行容器

    在之前我们启动的容器的方式,无法使用systemctl管理系统服务的指令,需要重新启动一下,我们需要删除容器,并从我们自己的镜像中重新启动一下。

    docker stop sample_django_project  # 停止容器
    docker rm sample_django_project  # 删除容器
    docker run -tid -p8090:8000 --name sample_django_project --privileged=true xdcat/sanmpe_django_project /usr/sbin/init  # 创建并启动容器
    docker exec -it sample_django_project /bin/bash  # 进入容器
    

常用指令

docker部署django网站

上一篇:HTML大文件上传方法


下一篇:动态构建 urlpatterns