回顾之前遇到的问题:
1、安装一堆不同版本的python在本机,明明用pip安装套件却无法import
2、本地开发用的套件版本和生产环境不合,代码一到生产环境就不能用
3、申请一个测试用的开发环境需要等一段时间
4、重新建立环境很麻烦,搞不清楚先前的环境到底装了什么东西
用docker好处:
每次不用deploy算法跟ops从头解释一遍,专心开发,不用花太多时间管环境的事情
更新python版本,python2.7--python3.6
对应系统不同命令安装python包,系统升级之后,很多东西需要重新pip,需要检查代码
如果有其它语言还需要配置相应环境
虚拟环境:
1、Isolation :python版本和包在它们自己的虚拟环境下
2、Organization:对于python包,每个项目可以维持他自己的需求虚拟环境
3、No-Globalization:don't require installing stuff globally on the system
隔离不同专案的环境:
virtualenv 1 virtualenv2
project1 project2
python2.7 python3.6
上面针对python解法
如果环境更复杂,还有其它项目及其它语言对版本依赖等等
使用Container隔离环境
虚拟机和容器
隔离环境
隔离环境主要分为三个等级 :应用层级、执行指令层级、硬体层级
最右边:
硬体隔离 :(会想到双系统) 优点:从底层相互隔离互不影响 缺点:浪费资源
一个不够用从另一个挖过来,影响其它系统
最左边:
硬体环境:hypervisor:host os 之后上面安装虚拟机os1.2.3,每个虚拟机安装自己的软体,不同虚拟机无法沟通
缺点:运行太慢,每个硬体都需要虚拟层去模拟虚拟环境,每个vn故自己硬体
中间:
硬体层,共同使用linux资源,应用层互不干扰,执行层共享资源
虚拟机和容器差异:
左边虚拟机:
server:硬体环境
Host OS:windows 7 、windows 10
Hypervisor:Vmware、virtualbox
之后彼此独立,在centos安装自己东西,互不独立,资源不共享,事先设置好每个虚拟机资源
Container:应用层面虚拟化,通过Docker与host OS进行交流,从应用层面开始的分离的而不是从host os开始隔离的
使用资源效率更好,因为可以利用底层资源
容器可以直接使用kernal资源
Containers彼此之间互相独立,通过Interface,每个Containers都可以直接和linux上的Drivers沟通,来调度硬体资源,
可以直接使用资源,之间隔离是通过linux Kernel既有的功能(Namespaces、cgroups、SELinux)做隔离的,所以说它是应用端的隔离不需要重新模拟出一个os来操作
二者比较:
VMs Containers
硬体层:从新模拟出一台系统 从os层面模拟必须是linux os因为需要用到linux kernel
重:启动速度慢 轻:启动速度快
性能比较差 性能逼近原生
完全隔离更加安全 进程之间隔离却少一定安全性
Docker logo:
Container:大鱼上的货柜
Docker:像大鱼一样,载着各种容器运行
Docker是Contain一种,也是目前普遍的技术,
Docker主要三个用途:Build Ship and Run
Build:可以使用任何语言在docker containers 开发一个app,可以把你做的东西打包成一个镜像文件,
ship:这个镜像文件可以放到任何一台安装docker里面来使用
run:一般标准配置会运行1000个以上containers
Docker is a kind of container
Container可以想象一个货柜可以在里面安装东西
Docker把 自己Container打包成image,image可以叠起来,用哪个image直接调用就好
Docker的生命周期:
把需要的配置写入到Dockerfile,通过build指令压缩一个image,到本地通过docker的run指令,本机就可以用
Containers可以理解为让你进,让你操作的一个环境,Containers有自己的生命周期有stop、start、restart完全可以当成一个机器用
Containers有很多操作还可以用commit重新给它打包成image
大家之间互相共享可以把images push到Docker registry里面,也可以pull下来
也可以存起来backup.tar
和Docker一起工作:
Client和Docker_Host一般是指本机(本机装个Docker_Host),Registry一般指远端的机器,在本机可以通过docker build法会把指令传送到Docker Daemon,Docker_Host一直有运行指令会把docker build指令的内容建立成image。 运行docker run 也会传送到Docker Daemon 会搜索一下是否有image,如果有想要的image,就会run一下,变成containers,之后进行操作;如果本机没有image,它回去远端pull到image然后启动它。