以下均在centos7下进行。
相关指令
- 启动docker服务 systemctl start docker
在安装前,需要确认是否已经安装docker,直接执行docker
指令。如果已经安装,则直接跳到下一步。
没有安装
已经安装
安装并启动docker
安装方法,执行下列语句(参考):
curl -sSL https://get.daocloud.io/docker | sh
安装后,启动docker服务:
systemctl start docker
相关指令
- 下载镜像 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
查看是否下载完成
创建并启动容器
docker run -tid --privileged=true --name sample_django_project -p 8090:80 centos /usr/sbin/init
进入容器,这里直接使用刚刚创建的别名进入。
docker exec -it sample_django_project /bin/bash
在进入容器后,我们可以发现前面的标识符不一样了。
容器就相当于一个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版本是根据网站来的。
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,是否开启防火墙。
?
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
将项目设置为非debug环境
修改项目setting文件中DEBUG为True
vi /root/PonSol2_Web/PonSol2_Web/settings.py
设置静态文件路径
这里的STATIC_ROOT,如果没有话,自己添加一个就可以了。因为在正式的部署环境中,静态文件是单独管理的,之后也需要交给uwsgi单独管理。
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
在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 # 重启
在完成部署后,就可以将容器保存为镜像,保存网站的初始状态,并可以分享给其他人。
保存为镜像
保存镜像的操作,与git的commit类似,将容器保存当前状态并创建镜像。
使用ctrl+D
退出容器后,执行:
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远程仓库。
docker push xdcat/sample_django_project
dockerhub的用户名是唯一的,只需要通用用户名/镜像名
,其他人就可以使用镜像。下面的例子,我已经换了另一台电脑用于展示。
使用pull拉取镜像
docker pull xdcat/sanmpe_django_project

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。
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 # 进入容器
原文:https://www.cnblogs.com/XD00/p/14964886.html