docker是一个开发平台,用于开发、传输和运行应用。Docker使你能够分发你的应用为基础设施,使你能够快速的部署软件。使用docker使用管理应用的方式来管理你的基础设施。充分利用docker的传输方法学,测试及迅速的部署代码。可以在写代码和运行程序时减少延迟。
The Docker platform
docker提供一个能力来打包和运行应用,在一个被称为容器的松散的孤立环境中。这种隔离和安全机制可以使你同时在一个主机上运行很多的容器。容器是轻量级,因为它们不需要额外的应用管理负载,直接在主机的内核当中运行。意味着可以在给定的硬件当中运行更多的容器(比虚拟机成本要低很多)。甚至可以在虚拟机当中运行docker!
docker提供工具和平台来管理容器的生命周期。
1. 使用容器开发应用及支持的组件
2. 容器称为了一个单元用于发布和测试你的应用
3. 准备发布的时候,作为一个容器或合理安排的服务,无论是产品环境还是云环境,都会是一致的。
Docker Engine
docker engine 是一个客户端应用:
a. 一个长时间运行的程序提供服务,docker守护进程(docker command)
b. REST API,定义程序和守护进程交互的接口。
c. 命令行接口
docker engineCLI 使用docker的REST API或命令行去控制或者和docker的守护进程进行交互。很多其它的docker应用使用底层的API和命令行接口。
守护进程创建和管理docker对象,比如: image、container、网络、磁盘
可以用docker来做什么。
1. 快速,一致发布应用
docker通过允许开发者在标准的环境使用本地容器提供应用和服务,来简单化开发生命周期。容器对于不断地集成(continuous integration)、发布(continuous delivery)(CI/CD)工作流是非常重要的!
2. 响应式部署
docker基于容器的平台具有具有高度的可移植性的工作负载。docker 容器可以运行在开发者的本地笔记本、在数据中心的物理机或虚拟机当中、云环境或者混合环境等等。
docker的可移植性和轻量级的特征可以使之很轻易地在真实环境当中,根据商业需要,动态地管理工作负载,按比例增加或减少应用服务 。
3. 运行更多的负载在相同的硬件当中。
docker是一个轻量并且快速。相对于应用管理的虚拟机设备,提供了一个可见、成本低廉的选择,所以你可以更加充分地运行本的计算 能力以达到商业布标。docker更喜欢高密度环境用于小型、中型部署,这样可以用更少地资源做更多的事。
Docker architecture
docker使用客户服务端架构(client-server architecture)。Docker客户端与这个Docker守护线程进行交互(Daemon是重中之重),运行和发布docker容器。docker客户端和守护线程能够在同一个操作系统上运行,或者你可以使用client连接远程的守护线程。client和daemon也可以通过REST API进行交互,借助于UNIX sockets套接字或者网络接口。
docker架构Docker daemon
docker守卫线程监听Docker API请求并管理docker对象(如:images、containers、networkds和磁盘)。一个守卫线程也可以和其他守卫线程进行交互管理Docker服务。(multiple machine)
Docker client
docker是很多docker用户和docker交互的主要方式。当你使用命令行如docker run,客户端便会发送命令到守卫进程并执行。Docker命令使用Docker API。客户端可以和不止一个的守卫进程进行交互。
Docker registries
一个docker注册商(如:docker hub)存储了docker的镜像。docker可以进行配置,默认在docker hub进行查找。也可以自己运行一个私有注册商。如果使用了Docker Datacenter(DDC), 它包括了Docker Trusted Registry(DTR),
当使用docker pull或者docker run命令时,需要的镜像可以从配置的注册商当中拉取。当你使用docker push命令时,你的镜像会被推送到远程注册商当中。
Images (镜像)
一个镜像就是一个只读模板,指示创建容器 。大多数情况下,一个镜像会基于另一个镜像以及一些额外的自定义选项。比如,你可以构建一个基于ubuntu镜像,但是安装apache网站服务器和应用,能够像配置的一样运行起来。
你可以创建自己的镜像或者可以仅仅使用那些已经被其它人创建发布的镜像。为了创建你自己的镜像,你需要创建一个dockerfile,使用相同的语法来定义和步骤来创建镜像并运行。
Container(容器)
一个容器就是就是一个镜像的实例,你可以通过Docker API或命令行创建、启动、停止、移动或者删除。一个容器可以连接多个网络或者基于当前的状态创造更多的镜像。
默认情况下,容器会与其它容器进行隔离,可以控制容器的网络、存储或其他底层系统。容器由镜像定义像其它配置选项一样
底层技术
Docker是用Go语言来写的,充分利用了linux内核的特点类发挥它的作用。
Namespaces(命名空间)
dockers使用一个叫做命名空间的技术来提供隔离工作空间的容器。当运行这个容器的时候,docker创建了一系列的命名空间。
这些命名空间提供了隔离层,每一个容器的各个方面运行着分离的命名空间并且访问限制在这个命名空间当中。
Docker Engine使用如下的命名空间(linux)
pid: 进行隔离
net: 管理网络接口
ipc: 管理访问网络进程通信
mnt: 管理文件系统和挂载点
uts: 隔离内核和版本标识(UTS: Unix Timesharing System)
Control groups
docker engine在linux上可以依赖另一个称为“control group”的技术。一个cgroup限制应用在一个给定的资源集当中。控制组允许docker engine分享可利用的硬件资源并可以强制限制和约束,如:限制容器的内存使用率
Union file systems
union file system或者unionFS,都是文件系统由创建层进行操作,使它们非常的轻量级和快速。Docker Engine使用UnionFS来提供构建块用于容器。Docker Engine可以使用多个UnionFS Variant,包括AUFS,btrfs,vfs和DeviceMapper
Container format格式
docker engine结合命名空间、控制组和UnionFS至一个称为容器格式的包裹。默认的容器格式就是libcontainerf. 在未来情况下,Docker可能会通过其他容器技术来支持其它的容器格式,比如BSD JAILS或者Solaris Zones.
网友评论