300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > docker打包部署nginx django应用

docker打包部署nginx django应用

时间:2024-01-03 08:54:14

相关推荐

docker打包部署nginx django应用

1、创建django项目

a)

安装django依赖包:pip3 install Django# 使用 django-admin 来创建 HelloWorld 项目django-admin startproject srccd src/执行同步数据库文件:python3 manage.py migrate# 启动djangopython3 manage.py runserver 0.0.0.0:8000

本地测试:

在浏览器中输入127.0.0.1:8000

后面将代码放到了服务器上进行测试

b) django中连接mysql数据库

DATABASES = {# 'default': {#'ENGINE': 'django.db.backends.sqlite3',#'NAME': BASE_DIR / 'db.sqlite3',# }'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'jlpost','USER': 'root','HOST': '10.30.239.206','PASSWORD': '123456','PORT': '3306',}}

c) 安装mysql

安装mysql:参见/mysql/mysql-install.html

安装pymsql==1.0.2作为数据库驱动,在_init_.py文件中配置,此处需要指定pymysql的版本,否则可能报错

import pymysqlpymysql.version_info = (1, 4, 13, "final", 0)pymysql.install_as_MySQLdb()

在测试代码的时候此处遇到一个问题Forbidden (CSRF cookie not set.),参见:/qq_43245972/article/details/87883108

d) 运行时数据库会报错

django.core.exceptions.ImproperlyConfigured: SQLite 3.8.3 or later is required (found 3.7.17).

解决方法如下:/weixin_43336281/article/details/100055435

/u/4337873/blog/4279371

得到django项目目录如下:

2、本地部署

采用uwsgi+nginx部署项目。服务器:CentOS 7.9

2.1 uwsgi启动django

安装uwsgi

pip3 install uwsgi

报错如下:

查阅资料发现是python3_devel(centos系统下)未安装,补充该安装包,成功

yum install python3-devel

收集静态资源

配置django目录下的settings.py

# 静态资源访问的起始urlSTATIC_URL = '/static/'# 指定静态资源所在的目录STATICFILES_DIRS = [os.path.join(BASE_DIR, 'hello_dist', 'dist', 'static'),]# 设置收集静态资源的路径(部署时使用)STATIC_ROOT = os.path.join(BASE_DIR, 'hello_dist', 'dist')

收集静态资源

python3 manage.py collectstatic

新建uwsgi.ini,与manage.py同一目录下,配置uwsgi.ini

[uwsgi]; 监听的端口http = :8001;指定和nginx进行套接字通信的方式:端口或文件; socket = :8002; 项目所在目录,和manage.py同级chdir = /opt/zxq/hello; 主应用中的wsgi文件wsgi-file = /opt/zxq/hello/src/wsgi.py; 代理静态资源:路径映射static-map = /static=/opt/zxq/hello/src/hello_dist/dist; 启动一个master进程,来管理其余的子进程master=Trueprocesses = 4threads = 2; 保存主进程的pid,用来控制uwsgi服务pidfile=/opt/zxq/hello/logs/uwsgi.pid; 设置后台运行,保存日志daemonize=/opt/zxq/hello/logs/uwsgi.log; 设置每个工作进程处理请求的上限,达到上限时,将回收(重启)该进程。可以预防内存泄漏max-requests=5000; 服务停止时自动移除unix Socket和pid文件vacuum=true

启动与关闭

uwsgi uwsgi.ini# 停止uwsgi --stop logs/uwsgi.pidpkill -f uwsgi -9

问题:

采用runserver的命令直接启动django时,无报错信息,网页能够正常使用,但是采用uwsgi启动时,日志报错:sqlite版本过低

检查sqlite版本信息:

find / -name sqlite3*

检查发现:/usr/bin/sqlite3软链接存在异常,重新设置软链接,失败,仍然无法访问网页

ln -s /usr/local/sqlite/bin/sqlite3 /usr/bin/sqlite3

查阅资料:/legendary_Dragon/article/details/117295774,可能是sqlite3的库文件没有更新,uwsgi优先调用/usr/lib64/目录下的库文件

替换后成功运行

# 查找库文件find / -name *sqlite3.so.0# 替换.so文件cp /usr/local/sqlite/lib/libsqlite3.so.0 /usr/lib64/libsqlite3.so.0

日志配置

由于uwsgi的入口是src/wsgi.py,因此需要在该文件下配置日志输出信息,将django请求的日志记录下来。

def _handle_cmd_line(args=None):parser = OptionParser()parser.add_option("--id", dest="id", action="store",type="string", default="0",help="id use guard and create log file")parser.add_option("--logconfig", dest="logconfig", action="store",type="string",default=os.path.join(work_dir, 'etc', 'log.conf'),help="log config file [%default]")(options, args) = parser.parse_args(args=args)return options, argsoptions, _args = _handle_cmd_line()if options.logconfig:defaults = {"id": options.id}logging.config.fileConfig(options.logconfig, defaults)

2.2 采用nginx代理

安装nginx,并启动ngix

# 防止报错nginx包不存在yum install epel-releaseyum install nginxsystemctl start nginx

修改6.1节中的uwsgi.ini,添加socket端口

[uwsgi]; 监听的端口,不配置nginx; http = :8001; 指定和nginx进行套接字通信的方式:端口或文件socket = :8002#---# 其它配置不变#---

配置 uwsgi 和 Nginx 的连接,并重启nginx:systemctl start nginx

vim /etc/nginx/nginx.conf

# 修改user为rootuser root;# 在server中添加如下配置server {listen 80;location /static {# 静态资源加载的路径alias /opt/zxq/hello/src/hello_dist/dist;}location / {include uwsgi_params;# 转发的ip和端口uwsgi_pass 0.0.0.0:8002;}}

nginx 启动失败/xiaohuai0444167/article/details/105758684/

linux

查看端口占用 lsof -i:8002查看端口使用netstat -anpt启动nginx systemctl status nginx查看nginx运行状态 systemctl start nginx删除所有nginx的进程 killall -9 nginx

启动项目

cd /opt/zxq/hellouwsgi --ini uwsgi.ini

在浏览器中输入http://10.30.239.199/Weibo

3、项目部署(docker)

3.1 linux安装docker

启动docke

systemctl start docker

3.2 docker打包有ssh服务的centos镜像

一般情况下,linux操作系统的管理员通过SSH服务来管理操作系统,但是Docker的很多镜像都是不带SSH服务的,因此需要创建一个带有SSH服务的centos镜像

某些情况下,docker拉取镜像会报超时错误,处理方法:/ws0316/p/12066454.html

docker拉取镜像

docker pull centos

检查centos中是否存在ssh服务

# 启动centos镜像,docker.io/centos通过docker images得到docker run -it -d --name django_base -t centos:latest /bin/bash# 查看已启动的容器docker ps# 查找某个容器id,进入已启动的容器中docker exec -it 86 /bin/bash

判断该容器安装此服务

sshd

创建镜像打包目录,创建Dockerfile,run.sh两个文件,并赋予run.sh执行权限

cd /opt/zxq/ssh_centostouch Dockerfile run.shchmod +x run.sh

run.sh写入配置

#! /bin/bash/usr/sbin/sshd -D

dockerfile写入配置文件

# 设置继承镜像FROM centos:latest# 开始运行命令RUN yum install -y openssh-serverRUN yum install -y passwdRUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_keyRUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_ecdsa_keyRUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_ed25519_keyRUN echo "123456" | passwd --stdin root # 系统密码,可自行更改ADD run.sh /run.shEXPOSE 22CMD ["/run.sh"]

创建镜像

docker build -t sshd:centos .

3.3 docker打包有python3服务的centos镜像

由于机器学习必备python3的一些环境,因此,制作一个python3的基础镜像

创建镜像打包目录,创建Dockerfile

cd python3_centostouch Dockerfile

dockerfile写入配置文件

# 指定操作的镜像FROM sshd:centos# 创建文件夹RUN mkdir -p /opt/install# 安装软件# 安装centos的yum源RUN yum install epel-release -yRUN yum -y install wget# 安装python 3.6RUN yum install -y libffi-devel zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make# 存放安装包的路径WORKDIR /opt/installRUN wget /ftp/python/3.6.8/Python-3.6.8.tgz# 解压RUN tar -zxvf Python-3.6.8.tgzWORKDIR Python-3.6.8RUN ./configureRUN make&&make install

打包镜像

docker build -t python3:centos .

3.4 基于python3:centos打包django镜像

创建镜像打包目录,创建Dockerfile、web_run.sh,赋予web_run.sh执行权限

cd python_djangotouch Dockerfile

dockerfile写入配置文件

# 指定操作的镜像# 指定操作的镜像FROM python3:centos# 指定语言,防止中文日志乱码ENV LANG en_US.UTF-8 ENV LANGUAGE en_US:en ENV LC_ALL en_US.UTF-8# 创建文件夹# 项目存放路径RUN mkdir -p /opt/zxq/hello# 拷贝文件# django项目地址COPY hello /opt/zxq/hello#提取复制nginx相关配置内容COPY nginx.conf /etc/nginx/nginx.conf#这句指令相当于:cd django项目WORKDIR /opt/zxq/hello# 安装依赖包RUN pip3 install -r requirements.txt -i /pypi/simpleCMD ["uwsgi","/opt/zxq/hello/uwsgi.ini"]

使用当前目录的 Dockerfile 创建镜像,标签为 web:django

docker build -t uwsgi:django .

创建django的容器

docker run -it -d -p 80:80 --name web_uwsgi --rm uwsgi:django /bin/bash

进入nginx容器

docker exec -it web_uwsgi /bin/bash

在容器中安装nginx相关包

yum install epel-releaseyum install nginx

启动nginx、uwsgi

nginxuwsgi uwsgi.ini

docker run -tid --name nginx -id -p 80:80 --privileged=true -t uwsgi:django

访问http://10.30.239.199/Weibo

4、Docker容器转移至另一服务器部署

将当前的web_uwsgi容器提交为一个镜像nginx_first

docker commit web_uwsgi nginx_first

将镜像存为

docker save nginx_first >nginx_first.tar

将tar文件另一台服务器指定的目录下,将备份文件nginx_first.tar恢复为镜像

docker load < nginx_first.tar

根据镜像重新运行起容器

docker run -tid --name nginx -id -p 80:80 --privileged=true -t uwsgi:django

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。