docker 补充

dockerfile

dockerfile 就是由一系列命令和参数构成的脚本,通过这个文件构建镜像,dockerfile就是一个文件,占得空间非常小。

可以理解成一个文件里面写了很多命令。

是什么作用,你把东西都写好在这个文件里了,执行这个文件,一个完整的镜像就创建好了。

dockerfile内容

FROM 镜像名字:镜像标签 FROM centos:centos7 指定基于哪个镜像

MAINTAINER 作者 作者是谁

ENV key value 环境变量

RUN 命令 要执行的命令

ADD 文件路径 拷贝文件到镜像内(自动解压)

COPY 文件路径 拷贝文件到镜像内(不会自动解压)

WORKDIR 路径 工作目录(工作的目录,一旦启动起容器来,进入,在的路径)

栗子:通过dockerfile,构建一个django 1.11.9的镜像,内部装上requests模块,在home目录下创建一个test文件夹,传一个a.txt到镜像中

第一步:在当前路径下创建一个a.txt,再创建一个dockerfile文件,dockerfile的名字必须是Dockerfile,首字母大写。

Dockerfile的内容如下:

FROM python:3.6
MAINTAINER lqz

RUN pip install django==1.11.9

RUN mkdir /home/test

RUN pip install requests

ADD a.txt /hom

WORKDIR /home

第二步:构建:docker build -t=‘镜像名字‘ .

docker build -t=‘django1.11.9‘ .

只要执行这句命令,马上就会去找当前文件夹下的Dockerfile文件,并执行。

然后就可以通过docker images 来看构建出来的镜像了。

通过镜像跑来容器来。

docker run -id --name=django1.11.9_my django1.11.9:latest

进入到容器内部

docker exec -it django1.11.9_my /bin/bash

案例一

通过uwsgi部署到容器中,起一个nginx容器,做转发

1 先把文件传到服务器解压

2 启动一个容器,做目录挂载

docker run -id -p 8088:8088 -v /root/djangotest:/home --name=my_django_test python:3.6

3 进入容器

docker exec -it my_django_test /bin/bash

4 安装django环境

pip install django==1.11.9

5 运行项目

python manage.py runserver 0.0.0.0:8088 用的是wsgiref

6 通过uWSGI跑项目

安装uwsgi:pip install uwsgi

写入:

vim uwsgi.ini

写入

[uwsgi]

配置和nginx连接的socket连接

socket=0.0.0.0:8088

也可以使用http

http=0.0.0.0:8088

配置项目路径,项目的所在目录

chdir=/home/untitled3

配置wsgi接口模块文件路径

wsgi-file=untitled3/wsgi.py

配置启动的进程数

processes=4

配置每个进程的线程数

threads=2

配置启动管理主进程

master=True

配置存放主进程的进程号文件

pidfile=uwsgi.pid

配置dump日志记录

daemonize=uwsgi.log

启动

uwsgi --ini uwsgi.ini #启动

7 用nginx转发

docker pull nginx

mkdir -p nginx/conf nginx/html nginx/logs

新建配置文件

在conf目录下新建nginx.conf

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        location / {
          #方式一
          #include uwsgi_params; # 导入一个Nginx模块他是用来和uWSGI进行通讯的
            #uwsgi_connect_timeout 30; # 设置连接uWSGI超时时间
          #uwsgi_pass 101.133.225.166:8080;
          #方式二
          #include uwsgi_params; # 导入一个Nginx模块他是用来和uWSGI进行通讯的
          #uwsgi_pass unix:///var/www/script/uwsgi.sock; # 指定uwsgi的sock文件所有动态请求
          #方式三
          proxy_pass http://101.133.225.166:8088
    
        }  
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

docker run --name mynginx -id -p 80:80 -v /root/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /root/nginx/html:/etc/nginx/html -v /root/nginx/logs:/var/log/nginx nginx

在外部浏览器访问宿主机ip地址80端口,就可以访问项目了

补充1

K8s:容器编排,夸服务器,多台服务器上的多个docker容器

docker-compos:单机容器编排,8个容器,同时启动,

补充2

scp 远程拷贝命令,从mac拷贝到了阿里云服务器的/root路径

scp untitled3.zip :/root

解压文件:yum install zip yum install unzip

补充3

在python3.6的容器中安装软件需要apt-get

apt-get update

apt-get install vim

补充4 cgi wsgi

2.uWSGI ,WSGI和uwsgi的区别

2.1 WSGI:

WSGI,全称 Web Server Gateway Interface,或者 Python Web Server Gateway Interface ,是为 Python 语言定义的 Web 服务器和 Web 应用程序或框架之间的一种简单而通用的接口。也可以认为WSGI是一种通信协议。自从 WSGI 被开发出来以后,许多其它语言中也出现了类似接口。

WSGI 的官方定义是,the Python Web Server Gateway Interface。从名字就可以看出来,这东西是一个Gateway,也就是网关。网关的作用就是在协议之间进行转换。

WSGI 是作为 Web 服务器与 Web 应用程序或应用框架之间的一种低级别的接口,以提升可移植 Web 应用开发的共同点。WSGI 是基于现存的 CGI 标准而设计的。

WSGI是Web 服务器(uWSGI)与 Web 应用程序或应用框架(Django)之间的一种低级别的接口

2.2 uWSGI:

uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。

2.3 uwsgi:

uwsgi是服务器和服务端应用程序的一种协议,规定了怎么把请求转发给应用程序和返回; uwsgi是一种线路协议而不是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信。

cgi:通用网关接口

WSGI:python的协议,Web服务网管接口,简单来说它是一种Web服务器和应用程序间的通信规范。

uwsgi:也是协议。

wsgiref,uWSGI(c语言实现的,性能比较高),gunicorn。。。:根据这个协议的实现

java、php都会有一些协议

tomcat就是python中的uwsgi

php服务器

docker 补充

讲一下外部请求访问宿主机上的容器里面的项目的过程

就由上面的案例作为例子

装有nginx的容器,部署在了宿主机的80端口上,并且做了端口映射,nginx监听着这个容器的80端口,只要外部请求访问了宿主机的80端口,就直接转到了容器的80端口,然后nginx监听着80,然后就根据外部的路由去转发请求,这时我们的项目是起在容器上的,容器也在宿主机上,所以有两种方式转发,一种是直接转发到项目容器的ip地址加端口号,还有一种就是转发到宿主机的ip加端口,因为项目的容器也是起在宿主机上的,做了8088的端口映射,只要访问宿主机的8088端口,就等于访问了项目容器得8088,而我们起的uWSGI(在项目容器上)监听着8088端口,所以外部的请求,终于到了项目中了。