【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  # 重启
原文地址:https://www.cnblogs.com/XD00/p/14964886.html