失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 基于docker部署nginx+uwsgi+django

基于docker部署nginx+uwsgi+django

时间:2022-10-21 12:43:31

相关推荐

基于docker部署nginx+uwsgi+django

基于docker部署nginx+uwsgi+django

(一)docker+uwsgi+django(二)docker+nginx+django(三)docker+nginx+uwsgi+django(四)PS(五)结语

先吹一波,Docker 的优点

Docker 是一个用于开发,交付和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。通过利用 Docker 的方法来快速交付,测试和部署代码,您可以大大减少编写代码和在生产环境中运行代码之间的延迟。

docker知识补充连接

(一)docker+uwsgi+django

这里在一个容器上跑django服务,就不使用nginx进行代理了,当然你也可以不使用uwsgi。

首先把uwsgi+django容器跑起来

docker run -it -d --name test -p 1234:8080 -v /home/test:/home/test python:3.7.10#-v /home/test:/home/test是将/home/test是将主机上的该目录挂载到容器内的home目录下(当然也可以使用docker cp命令)

然后进入到容器内

docker exec -it test bash

然后安装uwsgi和django

pip install uwsgi -i https://pypi.tuna./simplepip install django==1.11.28 -i https://pypi.tuna./simple

其中在test目录下有一个uwsgi.ini的uwsgi启动配置文件(给你们瞅瞅)

[uwsgi]http= 0.0.0.0:8080chdir = /home/testwsgi-file = test/wsgi.pyprocesses = 1threads = 4

然后使用uwsgi将将django项目启动

uwsgi -d --ini uwsgi.ini(uwsgi无挂断运行)

这里需要注意的是,**因为没有使用nginx,所以在uwsgi.ini的配置文件中,http= 0.0.0.0:8080(而不是socket=0.0.0.0:8080)**当然这里的0.0.0.0也可以修改为容器的IP号

#docker inspect [容器名或id]| grep "IPAddress"docker inspect test| grep "IPAddress"

至此服务已经跑起来了

下面是dockerfile时间(区别于上面进入docker容器安装依赖,非常麻烦,所以就可以写个dockefile)

# 建立 python3.7 环境FROM python:3.7.10# 镜像作者菠菜MAINTAINER bocai# 设置容器内工作目录WORKDIR /home# 将项目文件拷贝到工作目录下(拷贝的主机内容,最好是相对路径,绝对路径会有报错 )COPY ./demo /home/demo# 在容器内安装djangoRUN pip install Django==1.11.28 -i /simple/# 在容器内安装uwsgiRUN pip install uwsgi==2.0.19.1 -i /simple/#用uwsgi运行django项目(这里运行的进程不要以后台运行比如nohup,uwsgi -d等)#为什么不要用后台方式运行? 因为后台运行方式启动,容器会认为服务没起来,从而导致容器停止ENTRYPOINT uwsgi /home/demo/uwsgi.ini

#开始构建镜像,先进入Dockerfile目录(注意:上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢。)docker build -t demo:1.0 .#docker build -t demo:1.0 -f /root/docker/Dockerfile .#镜像构建好后运行镜像docker run -it -d --name demo -p 1234:8080 demo:1.0

PS:补充命令

docker cp container:src_path dest_path #将容器内的文件复制到主机目录

docker cp dest_path container:src_path #将主机目录文件复制到容器目录

docker logs -f 容器id/容器名 查看容器日志

详情百度

(二)docker+nginx+django

这里,不使用uwsgi服务器,这里使用django自带的web服务器

docker run -it -d --name test -v /home/test:/home/test python:3.7.10

然后进入到容器内

docker exec -it test bash

启动django项目,cd到项目目录下

python manage.py runserver 0.0.0.0:8080

再把nginx容器跑起来

docker run --name nginx -d -p 7777:80 -v /home/nginx.conf:/etc/nginx/nginx.conf nginx

nginx的配置文件如下

worker_processes 1;events {worker_connections 1024;}http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;#gzip on;# HTTPS serverserver {listen 80;server_name localhost;location /static {alias /home/static;}location / {proxy_pass http://172.17.0.2:8080;}}}

这里需要注意的是,这里的nginx.conf配置文件与上面的nginx.conf不同,下面箭头标红修改为跑django服务的容器IP

大功告成,项目启动

静态文件的代理也么的任何问题

对于上面这种多容器配合,如果一个一个容器启动就会很麻烦,并且上面nginx配置文件中还要指定容器IP,非常麻烦,如果使用使用docker-compose就可以让各个服务之间组网,使用域名的方式连接各个服务,所以这里就用到了docker-compose,至于怎么安装这里就不赘述了

下面是目录的大致结构

docker/

├── demo

│ ├── demo

│ │ ├── demo

│ │ ├── manage.py

│ │ ├── nothing

│ │ ├── start.sh

│ │ ├── static

│ │ ├── templates

│ │ ├── uwsgi.ini

│ │ └── uwsgi.log

│ └── Dockerfile

├── docker-compose.yml

└── nginx

├── Dockerfile

├── nginx.conf

└── static

├── css

├── dog_imgs

├── fei_hua

├── js

demo目录下的Dockerfile

// An highlighted block# 建立 python3.7 环境FROM python:3.7.10# 镜像作者菠菜MAINTAINER bocai# 设置容器内工作目录WORKDIR /home/demoCOPY ./demo /home/demo# 在容器内安装djangoRUN pip install Django==1.11.28 -i /simple/

nginx目录下的Dockerfile

// An highlighted block# 下载nginxFROM nginx:latest# 镜像作者菠菜MAINTAINER bocai# 设置容器内工作目录WORKDIR /homeCOPY ./nginx.conf /etc/nginx/nginx.confCOPY ./static /home/static

nginx的配置文件(可以看见配置文件的代理服务这里使用的是proxy_pass http://demo:8080)

// An highlighted blockworker_processes 1;events {worker_connections 1024;}http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;#gzip on;# HTTPS serverserver {listen 80;server_name localhost;location /static {alias /home/static;}location / {proxy_pass http://demo:8080;}}}

docker-compose.yml配置文件

// An highlighted blockversion: "3"networks: # 自定义网络(默认桥接), 不使用links通信demo_network:driver: bridgenginx_network:driver: bridgeservices:demo:build: /root/docker/democommand: python manage.py runserver 0.0.0.0:8080 # 容器启动后启动web服务器networks:- demo_networkexpose:- "8080"restart: always # always表容器运行发生错误时一直重启nginx:build: /root/docker/nginxports:- "1234:80"restart: always # always表容器运行发生错误时一直重启networks:- nginx_network- demo_network #将nginx加入到demo的网络中depends_on:- demo

docker-compose up #启动,大功告成PS 命令补充docker-compose ps #列出项目中所有在运行的容器docker-compose stop #停止正在运行的容器docker-compose start #启动停止的容器等等,还有许多的命令,为什么不写?老子单纯的懒得抄而已

(三)docker+nginx+uwsgi+django

下面是我简单的画了一个图,小伙伴们可以简单的参考一下

传送门

这里nginx单独一个容器,uwsgi+django为一个容器。但然它们三个也可以部署在一个容器内,但是这样没啥意义(目的就是为了动静分离),其实配置也差不多,这种但容器的配置和我之前的个人视觉网站的搭建的配置差不多,只是没有用到docker,好,废话不多说

首先把uwsgi+django容器跑起来

docker run -it -d --name test python:3.7.10

然后进入到容器内

docker exec -it test bash

然后安装uwsgi和django

pip install uwsgi -i https://pypi.tuna./simplepip install django==1.11.28 -i https://pypi.tuna./simple

然后退出容器,将django项目复制到容器内(当然也可以通过目录挂载的方式)

docker cp /home/test test:/home/#将主机/homw/test目录拷贝到容器test的/home目录下。

其中在test目录下有一个uwsgi.ini的uwsgi启动配置文件(给你们瞅瞅)

[uwsgi]socket = 0.0.0.0:8080chdir = /home/testwsgi-file = test/wsgi.pyprocesses = 1threads = 4

然后使用uwsgi将将django项目启动

uwsgi -d --ini uwsgi.ini(uwsgi无挂断运行)

这里需要注意的是,区别于上面不使用nginx代理django服务(即直接使用uwsgi),这里的uwsgi.ini的配置文件第二行是socket = 0.0.0.0:8080(也可以写为socket = 本机IP:8080,不知道为什么127.0.0.1不行),不使用nginx的uwsgi.ini的配置文件的第二行为http= 0.0.0.0:8080,其余都相同

至此,django服务已经使用uwsgi跑起来了,然后退出容器

再把nginx容器跑起来

docker run --name nginx -d -p 7777:80 -v /home/nginx.conf:/etc/nginx/nginx.conf nginx

这个端口映射一定要注意,这一端口并不是随便开的,因为某些浏览器是将某些端口禁用,我猜测这些端口被浏览器某些服务占了,当你使用了禁用端口后一般会报这个错误:[ERR_UNSAFE_PORT]

可以参考:传送门

上面有用到文件挂载,就是配置了nginx.conf文件(来瞅瞅)

worker_processes 1;events {worker_connections 1024;}http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;upstream django {server 172.17.0.2:8080;}#gzip on;# HTTPS serverserver {listen 80;server_name localhost;location /static {alias /home/static;}location / {uwsgi_pass django;include /etc/nginx/uwsgi_params;}}}

这里就不详细接受文件配置含义了,其中需要注意的是在配置文件的第13行的ip和端口,这里的IP是你上面django容器对应的ip(该ip是docker给容器自动分配的),端口就是你uwsgi.ini配置文件中服务起的端口

那应该怎么查询容器的ip呢,命令如下:

#docker inspect [容器名或id]| grep "IPAddress"docker inspect test| grep "IPAddress"

下面是docker-compose时间

demo目录下的Dockerfile

# 建立 python3.7 环境FROM python:3.7.10# 镜像作者菠菜MAINTAINER bocai# 设置容器内工作目录WORKDIR /home# 将项目文件拷贝到工作目录下(拷贝的主机内容,最好是相对路径,绝对路径会有报错 )#COPY ./demo /home/demo# 在容器内安装djangoRUN pip install Django==1.11.28 -i /simple/# 在容器内安装uwsgiRUN pip install uwsgi==2.0.19.1 -i /simple/

因为这里使用了uwsgi,所以uwsgi的配置文件

[uwsgi]socket= 0.0.0.0:8080chdir = /home/demowsgi-file = demo/wsgi.pyprocesses = 1threads = 4

这里nginx就直接用镜像了,主要就是一个配置文件,使用volumes进行挂载即可

nginx的配置文件

worker_processes 1;events {worker_connections 1024;}http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;#gzip on;# HTTPS serverserver {listen 80;server_name localhost;location /static {alias /home/static;}location / {uwsgi_pass demo:8080;include /etc/nginx/uwsgi_params;}}}

docker-compose.yml

version: "3"networks: # 自定义网络(默认桥接), 不使用links通信demo_network:driver: bridgenginx_network:driver: bridgeservices:demo:build: /root/docker/democommand: uwsgi /home/demo/uwsgi.ini # 容器启动后启动web服务器networks:- demo_networkexpose:- "8080"volumes:- /root/docker/demo/demo:/home/demorestart: always # always表容器运行发生错误时一直重启nginx:image: nginx:latestports:- "1234:80"restart: always # always表容器运行发生错误时一直重启volumes:- /root/docker/nginx/nginx.conf:/etc/nginx/nginx.conf- /root/docker/nginx/static:/home/staticnetworks:- nginx_network- demo_network #将nginx加入到demo的网络中depends_on:- demo

然后 docker-compose up,在浏览器输入url即可访问web服务

(四)PS

一定一定一定要注意,在使用docker镜像容器端口映射时,并不是主机上的所有端口你都可以映射,严格来说是可以映射的,但是某些端口被浏览器禁用了,导致你没办法用浏览器访问你的服务。最好使用80和443端口,我这里之所以没用,是因为我的服务器上的80和443端口被占了,哈哈,写的好像比较乱,That’s all

(五)结语

如果有什么错误的地方,还请大家批评指正。最后,希望小伙伴们都能有所收获。码字不易,喜欢的话,点赞关注一波在走吧

如果觉得《基于docker部署nginx+uwsgi+django》对你有帮助,请点赞、收藏,并留下你的观点哦!

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