docker部署django网站
以下均在centos7下进行。
1. 安装docker
相关指令
- 启动docker服务 systemctl start docker
在安装前,需要确认是否已经安装docker,直接执行docker
指令。如果已经安装,则直接跳到下一步。
-
没有安装
-
已经安装
安装并启动docker
-
安装方法,执行下列语句(参考):
curl -sSL https://get.daocloud.io/docker | sh
-
安装后,启动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镜像,然后再上面安装需要的软件。
-
注册dockerhub账号
dockerhub类似于github,是docker的远程仓库,在https://hub.docker.com/注册一个账号,并记住账户名,之后会使用到。这里我的账户名是
xdcat
,之后也会被多次用到。 -
下载centos镜像,这里的centos是一个官方镜像的名称。
docker pull centos
-
查看是否下载完成
-
-
创建并启动容器
- --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 exec -it sample_django_project /bin/bash
在进入容器后,我们可以发现前面的标识符不一样了。
3. 在容器中准备网站环境
容器就相当于一个linux系统,直接在容器中安装对应的软件并运行网站。这里我们以PON-Sol2的网站为例,使用uwsgi部署网站。
-
进入家目录
cd
-
下载代码
代码我放在的github上,默认是没有git的,所以需要先安装git后,再下载代码。
-
安装 git
yum install -y git
-
clone 代码
git clone https://github.com/XDcat/PonSol2_Web
-
-
安装python
项目中对于python版本和各个软件版本有明确要求,这里使用miniconda(简化版的anacodna),使用conda管理不同版本的python。这里并不一定要要conda,直接安装python然后安装对应包就可以,看个人习惯。
-
安装wget,用于下载其他内容
yum -y install wget
-
从官网下载miniconda
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
-
安装miniconda
bash Miniconda3-latest-Linux-x86_64.sh
安装流程:
-
回车:开始安装
-
按住空格:跳过条款
-
yes:接受条款
-
回车:默认安装路径
-
yes:是否初始化conda
-
-
安装miniconda后,需要重新进入系统这样才能启动conda环境
-
ctrl + D 退出系统
-
进入容器
docker exec -it sample_django_project /bin/bash
此时命令行最前面将会出现
base
字样,表示初始化了conda -
进入家目录
cd
-
修改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
-
-
-
创建网站运行环境
-
创建python环境
注意:这里的python版本是根据网站来的。
- ponsol 环境名称,再之后会多次使用到
- python=3.7.7 指定python版本
conda create -n ponsol python=3.7.7
-
激活ponsol环境
conda activate ponsol
-
安装指定包
根据项目安装相应包,本网站所有需要的软件包都放在了
PonSol2_Web/environment.yml
中。pip install -r /root/PonSol2_Web/environment.yml
-
-
测试网站是否能够正常运行
python /root/PonSol2_Web/manage.py runserver 0.0.0.0:80
如果没有报错的话,一般就是正常运行了。在我们启动容器的时候,已经将容器的端口映射到了外部的8090端口,所以可以在访问系统的8090端口,就可以看到网站。
注意:如果不能访问,请检查ip是否为装有docker的linux的ip,是否开启防火墙。
?
4. 安装uwsgi
django可以直接使用runserver启动网站,但是这适合在测试时使用,实际部署需要使用uwsgi进行部署。
-
进入项目的python环境,如果已经进入,跳过这一步
conda activate ponsol
-
安装 gcc
uwsgi的安装,需要使用gcc及进行编译,所以先安装gcc。
yum -y install gcc gcc-c++ kernel-devel
-
安装 uwsgi
pip 安装会报错,所以这里请使用 conda 安装。
conda install uwsgi
5. 使用uwgsi运行网站
-
将项目设置为非debug环境
-
修改项目setting文件中DEBUG为True
vi /root/PonSol2_Web/PonSol2_Web/settings.py
-
设置静态文件路径
这里的STATIC_ROOT,如果没有话,自己添加一个就可以了。因为在正式的部署环境中,静态文件是单独管理的,之后也需要交给uwsgi单独管理。
- STATIC_ROOT = ‘/srv/django/ponsol2/static‘ 静态文件保存在哪个路径
- STATIC_URL = ‘/PON-Sol2/static/‘ 网站静态文件的url前缀
vi /root/PonSol2_Web/PonSol2_Web/settings.py
-
迁移静态文件
静态文件将会迁移到上述STATIC_ROOT路径中去。
python /root/PonSol2_Web/manage.py collectstatic
-
-
编写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 # 线程数
-
使用uwgsi启动网站
uwsgi --ini /root/PonSol2_Web/uwsgi.ini
6. 设置网站开机自动启动
在docker的容器中,使用系统服务,设置网站开机自动启动,并且方便在后台运行与管理。在之后分享给其他人后,别人只需要创建容器,便可以直接使用网站,而不需要进入容器中启动,这样对于其他人就很方便了。
-
编写系统服务配置文件
需要编写配置文件来注册系统服务,系统服务配置文件在
/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
创建并编写配置文件:
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
-
启动服务
在常见好配置文件后,需要刷新系统服务,让系统识别到我们新增的服务。同时,还需要设置服务为开机启动,并启动服务。启动服务后,网站就部署完成了,会一直在后台运行。
systemctl daemon-reload # 刷新系统服务 systemctl enable ponsol.service # 开机启动 systemctl start ponsol # 启动网站服务 systemctl status ponsol # 查看网站状态
-
管理网站(以下操作不是必须)
网站设置为系统服务后,网站将运行在后台且容易管理,如启动、重启、停止和查看状态。
systemctl start ponsol # 启动 systemctl status ponsol # 查看状态 systemctl stop ponsol # 停止 systemctl restart ponsol # 重启
7. 保存容器为镜像并上传
在完成部署后,就可以将容器保存为镜像,保存网站的初始状态,并可以分享给其他人。
-
保存为镜像
保存镜像的操作,与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 # 查看所有镜像
-
注册dockerhub账户
dockerhub将类似于github一样,可以将自己的镜像分享到dockerhub上,并可以分享给其他人。在使用dockerhub前,必须要注册一个账户:https://hub.docker.com/
-
登陆dockerhub账户
docker login
-
push镜像
使用push将镜像推送至dockerhub远程仓库。
- xdcat/sanmpe_django_project 其中 xdcat 表示用户名,sanmpe_django_project是镜像名称,将镜像推送到登陆的账户的仓库中
docker push xdcat/sample_django_project
8. 将网站分享给其他人
dockerhub的用户名是唯一的,只需要通用用户名/镜像名
,其他人就可以使用镜像。下面的例子,我已经换了另一台电脑用于展示。
-
使用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
-
创建并启动容器
在启动容器后,就可以直接在8090端口访问网站。
docker run -tid -p8090:8000 --name sample_django_project --privileged=true xdcat/sanmpe_django_project /usr/sbin/init # 创建并启动容器
部署后管理
-
保存项目
在我们设置开机启动前,我们不妨保存一下容器的状态,将容器保存为一个镜像。使用
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已经很小了。 -
删除并重新运行容器
在之前我们启动的容器的方式,无法使用
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 # 进入容器