1.什么是Docker
-
0-1:创新新的技术
1-1.5:在已有的技术基础上进行更新,补充
1-2:重大变革 -
DOCKER是1-1.5的,是基于内核的一些技术用新的观念革新,形成了DOCKER,原技术可以追溯至Unix,当初为了测试内核稳定性而开发出来的技术
-
Docker 是一个 容器管理引擎 ,用于 创建 、 管理 和 编排容器 。
-
Docker可以作为 开发、测试、生产平台 。使用Docker 将程序与基础架构分离 同时, 创建、管理架构非常方便 ,我们可以通过Docker可以实现 PAAS的快速交付 , 以及代码的快速部署 。
- 基于Linux container (LXC) 实现的
共用一个内核,DOCKER也可以理解为一个进程
golang是一门新型的编译型语言,在 08年以后才诞生,是谷歌内部开发出来的,08年有的CPU多核心技术,go语言从基础就支持多核心
编译:c,c++ ,go等,直接和CPU沟通,CPU看得懂,直接编译
解释:shell,PHP等,需要先解释成CPU能看懂的语言,然后才能进行编译(12306不崩溃的很大原因就是从PHP语言变成了go语言)
2.传统虚拟化以及Docker的区别
-
设想现在有一个大仓库
传统虚拟化:把每个环境(虚拟机)当做一个用户,然后用水泥打隔断,但是占地面积多,麻烦
容器级虚拟化:拉窗帘,资源利用率高,方便快捷
传统虚拟化:消耗资源高,安全性更好
容器级虚拟化:消耗资源低,他只是一个进程,启动也快,但是相对来说安全性比较低
-
传统虚拟化操作系统:
数组化操作系统——虚拟引擎——虚拟机操作系统——应用程序
假如有十个G内存三个APP共用6个G
DOCKER:让资源利用率进一步提升,没有独立的操作系统
数组操作系统——文件运行环境(不消耗资源)——应用程序
十个G,九个G运行5个APP
3.Docker的发展历程
-
1、Linux Container 是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源
-
2、Docker 是 PAAS 提供商 dotCloud 开源的一个基于 LXC 的高级容器引擎,源代码托管在 Github 上, 基于 go 语言并遵从 Apache2.0 协议开源
-
3、Docker 设想是交付运行环境如同海运,OS 如同一个货轮,每一个在 OS 基础上的软件都如同一个集装箱,用户可以通过标准化手段自由组装运行环境,同时集装箱的内容可以由用户自定义,也可以由专业人员制造
4.Docker的构成
- 容器——镜像——仓库
容器
理解为虚拟机,VM
一个镜像可以启动无限个容器,一个容器只能有一个镜像
镜像
理解为ISO文件或者ESXI的ovf模板 mysql:5.6centos mysql:5.6Ubuntu
系统环境:容器里是共享内核,我们启动的每个容器都是没有内核的操作系统。把内核去掉就是生态了,把这些生态打包,就是系统环境
应用环境:可执行文件,依赖等等,展开就是一个应用
仓库
理解为存储镜像的服务器,提供下载服务
有本地和网络
- 1、Docker 仓库:https://hub.docker.com
- 2、Docker 自身组件
Docker Client:Docker 的客户端:命令行管理工具 client和server是可以跨机器的
Docker Server:Docker daemon 的主要组成部分,接受用户通过 Docker Client 发出的请求,并按照相应的路由规则实现路由分发:服务器端,通过http协议进行发送
server端有自己的API接口,是一个识别动作的编程接口,只要你的client端符合它的规则,就可以链接,换取资源,创建容器,下载镜像等
Docker 镜像:Docker 镜像运行之后变成容器(docker run)
5.Docker化应用存在的方式
5.1每个应用都有对应的操作系统
5.2 共享操作系统(内核)
- 一切皆文件,就有共享性,干脆就把操作系统共享,节约资源
但是这样应用A崩了,B也不能用了
- 一个应用随着时间推移,访问量越来越多,功能越来越多。而且功能多了在一个进程里,七八个部门在一个目录里修改,那经常崩,所以有了微服务,把子功能分开,同样,这样也需要更多的设备支持
5.3内核与运行环境进行分离
- 操作系统也是镜像文件,文件没有死活,何况还有只读等权限,就解决了依赖问题
但是出现了新问题,兼容性问题,也就是A需要关闭IPforward,B需要打开
5.4增加可写层,其他环境不变
- 所以推出了可写层,可写层一下都是只读的,想写入的话就只能写在可写层之中
上层优先级大于下层,也就是说如果冲突了,那就是按照可写层的来,比如镜像中是关闭IPforward,那就在A的可写层之中写开启
5.5基础运行环境(镜像)与可写层分离(容器可写层),多个容器共用一个基础运行环境
假如我们需要安装LAMP,LNMP,Tomcat,那么我们需要
centos ISO apache mysql php tomcat jdk
也就是需要装这些
apache
apache
centos
mysql
mysql
centos
php
php
centos
tomcat
tomcat
centos
由于很多重复文件,并且文件过大,所以镜像有了UFS,他可以叠放,把重复的去除
UnionsFS(Union File System,联合文件系统)是一个 可叠放的联合文件系统
镜像也是分层的,需要什么,就在可写层中写,然后去镜像中调用就行
镜像分层的好处
-
假如现在公司需要把PHP5.4变成PHP7.4.十倍提升,那么只需要把7.4迁移就好,其他的之前都有,不需要拷贝mysql,Apache,centos等等。
哪怕是制作镜像的过程中也会节省资源,毕竟重新编译也很费资源
计算: docker images 镜像名 版本号 镜像 ID 创建时间 大小 nginx v1 xxxxx 500MB tomcat v1 xxxx 300MB centos v2 200MB 问,当前的镜像实际占用空间是多大:FGH A、150MB B、200MB C、255Mb D、300MB E、450Mb F、500MB G、600MB H、1000MB I、1111MB 按照极值来说,从500-1000都有可能,500的时候nginx中包含Tomcat和centos需要的所有东西,1000的时候都不包括
6.安装相关
-
网易yum
http://mirrors.163.com/.help/centos.html
网易DOCKER镜像仓库
https://c.163yun.com/dashboard#/home
docker官方镜像
hub.docker.com
道云,人少时候很快,人多时候很慢,小公司,带宽不大
http://get.daocloud.io/ -
DOCKER-ce-selinux这个包就是如果你开启了selinux,他会帮你管控,放权给docker,让它正常工作
docker会利用大量的防火墙规则,结合nat,filter表进行访问控制
所以最好先enable,然后重启,重启可以让docker和防火墙规则紧密的结合 -
对于go语言来说,他在编译成可执行文件的时候,就把所有的依赖都打包放在自己的执行库中,所以他源码安装是没有任何提升的,那就没必要了
代理加速器
-
DOCKER的仓库默认在美国,很慢很慢,也就几十kb,国内很多公司做了代理服务器,他帮你去下载,在本地也会做一些缓存,这样就会快一些,这种操作叫做镜像加速器
-
目前国内绝大部分代理已被长城防火墙封禁
Docker简单应用
docker run --name db --env MYSQL_ROOT_PASSWORD=example -d mariadb
--name 起一个别名,不起别名的话默认名会非常复杂
--env 设置环境变量,理解为内部设置了一个模板,如果他发现有这个变量,就会把mysql的root密码设置为这个值example
-d 放在后台运行,不放后台他就放在前台了
docker run --name MyWordPress --link db:mysql -p 8080:80 -d wordpress
--link db:mysql 简单理解和db绑定一起
-p 8080:80 每个容器都是私有地址,这些就相当于DNAT转换,把原本访问8080的转到80
8080是物理的地址,80是容器内部的端口
-
容器运行的最低标准:必须具备一个前台进程
应用启动运行有两种1.启动后就放入后台了,消失在前台了
2.启动后放在前台,占用了。比如top,dd -
如果容器内部启动的进程是一个后台进程,容器会觉得没给他安排任务,容器就退出了,所以必须有一个放在前台的进程,不然一启动就自动退出