一、私有仓库搭建
镜像获取方式:
方式1、docker pull 镜像
方式2、dockerfile构建
方式3、拷贝tar文件,load过来
注意:一般是 公司内部用的镜像,docker hub上没有,私服(私有服务器)
私有仓库搭建
操作步骤:
步骤 1 拉一个registry镜像 (本质是个什么?答:web服务(想像成 web项目在里面))
docker pull registry
步骤 2 跑起容器来
docker run -di --name=registry -p 5000:5000 registry
步骤3 浏览器输入地址(目前是空的)
http://宿主机IP:5000/v2/_catalog
例如:http://10.0.0.203:5000/v2/_catalog
以上就是搭建好了私有仓库
步骤 4 vi /etc/docker/daemon.json (文件 如果没有就创建出来:vim daemon.json)。以后docker pull 镜像时 先从自己配置的这个拉,再去远程拉
{"insecure-registries":["10.0.0.203:5000"]}
图型解释 步骤4 的意思
步骤 5 重启docker 服务。发现容器停了
systemctl restart docker
步骤 6 启动容器
docker restart registry
步骤 7 标记本地的镜像(本地的镜像可能是dockerfile构建的,也可能是通过容器打包成的)
docker tag django1.11.9 10.0.0.203:5000/django1.11.9 django1.11.9 表示镜像的名字
步骤 8 把标记好的本地镜像,传到搭建好的私有仓库上
docker push 10.0.0.203:5000/django1.11.9
问题:
解决:
原因:docker镜像仓库暂不支持https
办法:
在”/etc/docker/“目录下,创建”daemon.json“文件(如果有的话直接覆盖)。在文件中写入
{ "insecure-registries":["10.0.0.203:5000"] }
然后重启docker服务,重启registry容器,再docker push 10.0.0.203:5000/django1.11.9
步骤9 再访问这个地址http://宿主机:5000/v2/_catalog ,就能看到你上次的镜像再里面了
注意:
只要在他自己的电脑上 etc/docker/daemon.json,配置了这个{"insecure-registries":["10.0.0.203:5000"]} 的所有小伙伴,都可以拉取我上传的镜像
docker pull10.0.0.203:5000/django1.11.9
注意:
公司可能没有私服,直接通过dockerfile构建
大一点的公司,搭建私有仓库,里面放了一些镜像(不让你去docker hub下了,直接只从私有仓库下载)
私服传奇 大哥传奇,一刀传奇
现成的代码,只需要买台服务器,部署上就行了(只要有用户,充钱,就冲在你那里),利润非常非常高,请到一些明星代言
安卓修改器,apk解压,修改源代码,把原来的服务器地址,改成你的就可以了
安卓的破解软件多,安卓逆向
二、
1 、CGI :通用 网关接口,一句话总结: 一个标准,定义了客户端服务器之间如何传数据
2 、FastCGI:快速通用 网关接口,一句话总结: CGI的升级版,更快。
web服务器作用:接收请求,转发请求,做负载均衡,还可以做 动静分离
-Nginx:符合快速通用网关接口的web服务器
-apache:类似于nginx 的web服务器
例子:架构
-lamp:表示 linux+apache+mysql+php
-lnmp:表示 linux+nginx+mysql+php
-tomcat ,uwsgi,php,gunicorn 这些都是协议
-nginx ,apache
-tomcat,jboss,weblogic(java),uwsgi,gunicorn(python),php(php服务器)(php的web服务器)
3、 WSGI:协议,Web服务器网关接口(Python Web Server Gateway Interface,缩写为WSGI),只针对python
Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口
为Python定义的web服务器和web框架之间的接口标准
规定了什么?规定了http请求来了后,如何拆,拆成一个一个key和value 放到一个字典中,env对象
from wsgiref.simple_server import make_server
def mya(environ, start_response):
print(environ)
#request对象:environ包装成了一个对象
start_response('200 OK', [('Content-Type', 'text/html')])
if environ.get('PATH_INFO') == '/index':
with open('index.html','rb') as f:
data=f.read()
elif environ.get('PATH_INFO') == '/login':
with open('login.html', 'rb') as f:
data = f.read()
else:
data=b'<h1>Hello, web!</h1>'
return [data]
if __name__ == '__main__':
myserver = make_server('', 8011, mya)
# 请求来了,执行后面的可调用对象 mya(environ:http请求拆了,拆成字典, start_response:响应对象)
print('监听8010')
myserver.serve_forever()
例子:这是请求来的入口
4 、uWSGI/gunicorn/wsgiref/ tornado 部署。注意:(tornado可能是服务器,可能是框架)
一个是符合WSGI协议的web服务器
一句话总结: 一个Web Server,即一个实现了WSGI的服务器,大体和Apache是一个类型的东西,处理发来的请求
5 、uwsgi
一句话总结: uWSGI自有的一个协议
uWSGI uwsgi的区别
pip install uwsgi(真正装的uWSGI)
6 、ASGI :是WSGI的升级,性能更高,支持的更多,支持websocket和异步
异步网关协议接口,一个介于网络协议服务和Python应用之间的标准接口,能够处理多种通用的协议类型,包括HTTP,HTTP2和WebSocket
django3.0 以后支持异步
三、
1 、GIL:只针对cpython解释器,只适用于cpython解释器,(pypy:没有gil锁)。python出的时候,是单核cup,开启线程,垃圾回收,让其他线程停掉,只走垃圾回收线程,不会有并发问题
-同一时刻,实际上只有一条线程在执行,有一把全局锁,只要线程执行,必须获得这把锁,才能执行
-多核cpu出现,cpython,只能有一条线程执行,就是由于GIL锁的原因
-python不能利用多核优势
-想要分到不同cpu上执行,需要开进程(解释器进程),进程里最少有一条线程,开进程,非常耗资源
-在某些情况下,并不是进程开的越多,程序执行越快
-IO密集型,开线程,计算密集型,开进程 只适用于python
注意:
2 、线程是cpu调度的最小单位
3、IO模型
-内存分为:内核缓冲区,用户缓冲区
例子:你打开你的QQ,从内核缓冲区挪到用户缓冲区
例子:你打开浏览器去请求数据,先到内核缓冲区再挪到用户缓冲区
-BIO : 同步阻塞模式I/O
-NIO:同步非阻塞模式I/O
-AIO:异步非阻塞模式I/O
4、IO多路复用
5、总结:BIO,NIO,IO多路复用 都是同步IO (nginx,tornado:都是epoll模型),windows平台不支持epoll,用的是select(最大可以监听1024个)
AIO:真正的异步io,用的很少
6、 epoll和select的区别
一个老师检查10个学生写作业
-select:小明,你写好了么?小红你写好了么?.......
-epoll:同学写好了,举手告诉老师来检查
四、pycharm远程连接docker开发
步骤1、 配置docker服务端(docker是c/s架构)
01、设置 允许远程客户端连接
vim /lib/systemd/system/docker.service
把标红的注释掉
#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
添加
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock
02、 systemctl daemon-reload && systemctl restart docker
03、 验证
内部能访问到:
curl 127.0.0.1:2376/version
外部能访问到:
http://宿主机ip:2376/version
例如:http://10.0.0.203:2376/version
若:外部访问不到,则 防火墙关了,入网规则 改一下
3 上传代码到远端服务器
4 配置sftp
5 配置sftp连接
6 配置映射路径
7 把本地代码传到远端
8 配置自动上传代码
9 通过本地dockerfile构建远端的镜像(直接在远端安装是一样的)
10 修改构建镜像的名字