基于docker部署nginx+uwsgi+django

     阅读:27


先吹一波,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.tsinghua.edu.cn/simple
pip install django==1.11.28 -i https://pypi.tuna.tsinghua.edu.cn/simple

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

[uwsgi]
http= 0.0.0.0:8080
chdir = /home/test
wsgi-file = test/wsgi.py
processes = 1
threads = 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时间

 # 建立 python3.7 环境
 FROM python:3.7.10
 
 # 镜像作者菠菜
 MAINTAINER bocai
 
  # 设置容器内工作目录
 WORKDIR /home
 
 # 将项目文件拷贝到工作目录下(拷贝的主机内容,最好是相对路径,绝对路径会有报错 )
 COPY ./demo /home/demo
 
 # 在容器内安装django
 RUN pip install Django==1.11.28 -i https://pypi.douban.com/simple/
 
 # 在容器内安装uwsgi
 RUN pip install uwsgi==2.0.19.1 -i https://pypi.douban.com/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 server
     server {
         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
在这里插入图片描述

大功告成,项目启动
在这里插入图片描述
静态文件的代理也么的任何问题
在这里插入图片描述

对于上面这种多容器配合,如果一个一个容器启动就会很麻烦,所以这里就用到了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/demo
 
COPY ./demo /home/demo
 
# 在容器内安装django
RUN pip install Django==1.11.28 -i https://pypi.douban.com/simple/

nginx目录下的Dockerfile

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

nginx的配置文件

// An highlighted block
worker_processes 1;


events {
    worker_connections 1024;
}

http {
     include mime.types;
     default_type application/octet-stream;
     sendfile on;
     keepalive_timeout 65;

     #gzip on;
     # HTTPS server

     server {
         listen 80;
         server_name localhost;

         location /static {
	alias /home/static;
	 }

         location / {
            proxy_pass http://demo:8080;
   	}
 }

}

docker-compose.yml配置文件

// An highlighted block

version: "3"

networks: # 自定义网络(默认桥接), 不使用links通信
  demo_network:
    driver: bridge
  nginx_network:
    driver: bridge

services:
  demo:
    build: /root/docker/demo
    command: python manage.py runserver 0.0.0.0:8080 # 容器启动后启动web服务器
    networks:
      - demo_network
    expose:
      - "8080"
    restart: always # always表容器运行发生错误时一直重启

  nginx:
    build: /root/docker/nginx
    ports:
      - "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.tsinghua.edu.cn/simple
pip install django==1.11.28 -i https://pypi.tuna.tsinghua.edu.cn/simple

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

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

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

[uwsgi]
socket  = 0.0.0.0:8080
chdir = /home/test
wsgi-file = test/wsgi.py
processes = 1
threads = 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 server
     server {
         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
 
 # 在容器内安装django
 RUN pip install Django==1.11.28 -i https://pypi.douban.com/simple/
 
 # 在容器内安装uwsgi
 RUN pip install uwsgi==2.0.19.1 -i https://pypi.douban.com/simple/

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

[uwsgi]
socket= 0.0.0.0:8080
chdir = /home/demo
wsgi-file = demo/wsgi.py
processes = 1
threads = 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 server

     server {
         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: bridge
  nginx_network:
    driver: bridge

services:
  demo:
    build: /root/docker/demo
    command: uwsgi /home/demo/uwsgi.ini  # 容器启动后启动web服务器
    networks:
      - demo_network
    expose:
      - "8080"
    volumes:
      - /root/docker/demo/demo:/home/demo
    restart: always # always表容器运行发生错误时一直重启

  nginx:
    image: nginx:latest
    ports:
      - "1234:80"
    restart: always # always表容器运行发生错误时一直重启
    volumes:
      - /root/docker/nginx/nginx.conf:/etc/nginx/nginx.conf
      - /root/docker/nginx/static:/home/static
    networks:
      - nginx_network
      - demo_network #将nginx加入到demo的网络中
    depends_on:
      - demo

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

在这里插入图片描述

(四)PS

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

(五)结语

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