zoukankan      html  css  js  c++  java
  • 【python django docker】docker部署django网站

    docker部署django网站

    以下均在centos7下进行。

    1. 安装docker

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

    • 没有安装

      image-20210701144602193

    • 已经安装

      image-20210701144634099

    安装并启动docker

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

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

      systemctl start docker
      

    2. 下载并启动centos镜像

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

    1. 注册dockerhub账号

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

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

      docker pull centos
      

      image-20210701154340806

      • 查看是否下载完成

        image-20210701154357267

    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
      

      image-20210701150810974

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

      docker exec -it sample_django_project /bin/bash
      

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

      image-20210701154538862

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

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

    1. 进入家目录

      cd
      

      image-20210701155452481

    2. 下载代码

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

      1. 安装 git

        yum install -y git
        

        image-20210701155831526

      2. clone 代码

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

        image-20210701155925581

    3. 安装python

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

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

        yum -y install wget
        

        image-20210701160630912

      2. 官网下载miniconda

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

        image-20210701160745730

        image-20210701161058216

      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

          image-20210701161703472

        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,是否开启防火墙。

      image-20210701204127501

      image-20210702101415767

    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
      

      image-20210702112225623

    5. 使用uwgsi运行网站

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

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

        vi /root/PonSol2_Web/PonSol2_Web/settings.py
        

        image-20210702134005138

      2. 设置静态文件路径

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

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

        image-20210702204940105

      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
      

      image-20210702135559919

      image-20210702135848941

    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 
      

      image-20210702142916498

      创建并编写配置文件:

      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  # 查看网站状态
      

      image-20210702144147718

    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  # 查看所有镜像
      

      image-20210702184247865

    2. 注册dockerhub账户

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

    3. 登陆dockerhub账户

      docker login
      

      image-20210702185647232

    4. push镜像

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

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

      image-20210702191847655

    8. 将网站分享给其他人

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

    1. 使用pull拉取镜像

       docker pull xdcat/sanmpe_django_project
      

      image-20210702192134136

    2. 查看镜像

      docker image ls
      

      image-20210702192446718

    3. 创建并启动容器

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

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

      image-20210702192619819

    部署后管理

    1. 部署后,发现有问题,需要修改代码

      这个是一个非常常见的场景,部署完成后,发现还有问题需要代码并重新部署。

      1. 进入容器

        默认我们初始的背景是之前的步骤已经完成了,且在安装docker的系统中。

        docker exec -it sample_django_project /bin/bash  # 进入镜像
        
      2. 停止网站

        systemctl stop ponsol  # 这个步骤时间会较长,请耐心等候
        systemctl status ponsol  # 查看状态
        

        image-20210703105438785

      3. 修改代码

        根据自己的需求修改代码。通常我的做法是,在其他电脑上写代码,然后推送到github上,再在容器中pull代码,这样就完成了代码的修改,接下来的操作就与之前的一样设置setting文件的DEBUG、迁移镜像文件等操作。

      4. 启动网站

        systemctl restart ponsol  # 重启镜像
        systemctl status ponsol  # 查看状态
        

        image-20210703105504502

      5. commit提交镜像

        使用ctrl+D退出容器后,使用commit指令提交修改内容,并保存为镜像。

        docker commit -m "complete deploying website" -a "xdcat" sample_django_project xdcat/sample_django_project  # 创建镜像。第一次需要等待比较长的时间。
        docker iamge ls  # 查看所有镜像
        
      6. push推送镜像

        docker push xdcat/sample_django_project
        
      7. 分享给其他人

        在其他人的电脑中,拉去镜像并启动。

        docker pull xdcat/sample_django_project  # 拉去镜像
        docker run -tid -p8090:8000 --name sample_django_project --privileged=true xdcat/sanmpe_django_project /usr/sbin/init  # 创建并启动容器
        
    2. 如果在同一个机器上想要使用同一个镜像创建不同的容器,注意容器的名称不能重复,要么重新命名,要么删除后重新创建。

      1. 重命名容器
      ```sh
      docker run -tid -p8090:8000 --name other_sample_django_project --privileged=true xdcat/sanmpe_django_project /usr/sbin/init  # 创建并启动容器
      ```
      
      1. 删除并重新运行容器

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

      ```sh
      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  # 进入容器
      ```
      

    常用指令

    控制台快捷键

    ctrl + D  # 退出当前sh用户
    ctrl + C  # 停止当前命令
    

    sh常见指令

    git clone https://github.com/XDcat/PonSol2_Web  # 下载代码
    vi .condarc  # 编辑文件
    type uwsgi  # 查看指令指向
    

    docker 相关

    systemctl start docker  # 启动docker
    
    docker run -tid --privileged=true --name sample_django_project -p 8090:80 centos /usr/sbin/init  # 启动容器
    docker exec -it sample_django_project /bin/bash  # 进入容器
    docker ps  # 运行的容器
    docker ps -a  # 所有的容器
    docker stop ponsol  # 停止容器
    docker start ponsol  # 启动容器(停止后)
    docker rm ponsol  # 删除容器(停止后)
    
    docker commit -m "complete deploying website" -a "xdcat" sample_django_project xdcat/sample_django_project  # 创建镜像
    docker image ls  # 查看所有镜像
    docker image rm xdcat/sample_django_project  # 删除镜像
    
    docker push xdcat/sample_django_project  # 推送镜像
    docker pull xdcat/sanmpe_django_project  # 拉去镜像
    
    docker login  # 登录账号
    

    conda 相关

    conda create -n ponsol python=3.7.7  # 创建环境
    conda activate ponsol  # 激活环境
    pip install -r /root/PonSol2_Web/environment.yml  # 根据文件安装包
    conda install uwsgi  # conda 安装指定包
    

    django 相关

    python /root/PonSol2_Web/manage.py runserver 0.0.0.0:80  # 指定端口测试网站
    python /root/PonSol2_Web/manage.py collectstatic  # 迁移静态文件
    

    服务相关

    uwsgi --ini /root/PonSol2_Web/uwsgi.ini  # uwsgi 根据配置文件启动网站
    systemctl daemon-reload  # 刷新系统服务
    systemctl enable ponsol.service  # 开机启动
    systemctl start ponsol  # 启动
    systemctl status ponsol  # 查看状态
    systemctl stop ponsol  # 停止
    systemctl restart ponsol  # 重启
    
  • 相关阅读:
    css 三角形
    转盘
    使用history.back()出现"警告: 网页已过期的解决办法"
    jQuery 左侧滑动
    Go语言数组的使用
    Go的变量作用域
    Go语言中函数的实现
    Go语言循环判断的使用~
    Go基础
    go环境的安装~
  • 原文地址:https://www.cnblogs.com/XD00/p/14964886.html
Copyright © 2011-2022 走看看