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