什么是docker
Docker是一个开源的应用容器引擎,基于LXC(Linux Container)内核虚拟化技术实现,提供一系列更强的功能,比如镜像、 Dockerfile等;
Docker理念是将应用及依赖包打包到一个可移植的容器中,可发布到任意Linux发行版Docker引擎上。使用沙箱机制运行程序, 程序之间相互隔离;
Docker使用Go语言开发。
docker架构和内部组建
Docker采用C/S架构(服务端与客户端,b/s浏览器和服务器),Dcoker daemon作为服务端接受来自客户端请求,并处理这些请求,比如创建、运行容器等。客户端为用 户提供一系列指令与Docker daemon交互。
LXC:Linux容器技术,共享内核,容器共享宿主机资源,使用namespace和cgroups对资源限制与隔离。
Cgroups(control groups):Linux内核提供的一种限制单进程或者多进程资源的机制;比如CPU、内存等资源的使用限制。 NameSpace:命名空间,也称名字空间,Linux内核提供的一种限制单进程或者多进程资源隔离机制;一个进程可以属于多个命 名空间。Linux内核提供了六种NameSpace:UTS、IPC、PID、Network、Mount和User。
AUFS(advanced multi layered unification filesystem):高级多层统一文件系统,是UFS的一种,每个branch可以指定readonly(ro 只读)、readwrite(读写)和whiteout-able(wo隐藏)权限;一般情况下,aufs只有最上层的branch才有读写权限,其他branch 均为只读权限。 UFS(UnionFS):联合文件系统,支持将不同位置的目录挂载到同一虚拟文件系统,形成一种分层的模型;成员目录称为虚拟 文件系统的一个分支(branch)。
docker的优点
- 持续集成
在项目快速迭代情况下,轻量级容器对项目快速构建、环境打包、发布等流程就能提高工作效率。 - 版本控制
每个镜像就是一个版本,在一个项目多个版本时可以很方便管理。 - 可移植性
容器可以移动到任意一台Docker主机上,而不需要过多关注底层系统。 - 标准化
应用程序环境及依赖、操作系统等问题,增加了生产环境故障率,容器保证了所有配置、依赖始终不变。 - 隔离性与安全
容器之间的进程是相互隔离的,一个容器出现问题不会影响其他容器。
虚拟机与容器的区别
以KVM举例,与Docker对比
- 启动时间
Docker秒级,KVM分钟级。 - 轻量级
容器镜像大小通常以M为单位,虚拟机以G为单位。
容器资源占用小,要比虚拟机部署更快速。 - 性能
容器共享宿主机内核,系统级虚拟化,占用资源少,没有Hypervisor层开销,容器性能基本接近物理机; 虚拟机需要Hypervisor层支持,虚拟化一些设备,具有完整的GuestOS,虚拟化开销大,因而降低性能,没有容器性能好。 - 安全性 由于共享宿主机内核,只是进程级隔离,因此隔离性和稳定性不如虚拟机,容器具有一定权限访问宿主机内核,存在一定安全 隐患。
- 使用要求
KVM基于硬件的完全虚拟化,需要硬件CPU虚拟化技术支持; 容器共享宿主机内核,可运行在主流的Linux发行版,不用考虑CPU是否支持虚拟化技术。
应用场景
- 应用打包与部署自动化
构建标准化的运行环境; 现在大多方案是在物理机和虚拟机上部署运行环境,面临问题是环境杂乱、完整性迁移难度高等问题,容器即开即用。 - 自动化测试和持续集成/部署
自动化构建镜像和良好的REST API,能够很好的集成到持续集成/部署环境来。 - 部署与弹性扩展
由于容器是应用级的,资源占用小,弹性扩展部署速度要更快。 - 微服务 Docker这种容器华隔离技术,正式应对了微服务理念,将业务模块放到容器中运行,容器的可复用性大大增加了业务模块扩展性。
什么是镜像?
简单说,Docker镜像是一个不包含Linux内核而又精简的Linux操作系统。
镜像分层
Dockerfile 中的每一行都产生一个新层
FROM alpine:latest 132h1rk1hb3rkjb
MAINTAINER mxy 12hb1b2b12b4y1b42k
CMD echo "hello Docker!" 12jhvkj1241
ro只读 rw读写 最上的是容器层 下面是那个是image 层
分层的好处 层如果重复的话,会共享,压力会小很多