基于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》对你有帮助,请点赞、收藏,并留下你的观点哦!