Docker使你的应用于底层基础硬件无关。借助Docker,您可以以与管理应用程序相同的方式来管理基础架构。通过利用Docker快速交付,测试和部署代码的方法,您可以大大减少从代码编写到上线的时间。
Docker平台
Docker容器的隔离技术和安全性使您可以在一个主机上运行多个容器。容器是非常轻量的因为直接运行在宿主机内核,不需要hypervisor的额外的开销。这意味着在同样的硬件配置下你可以运行更多的容器,比虚拟机更多。甚至可以在虚拟机里运行Docker。
Docker提供平台和工具来管理你的容器。
- 用容器来开发你的应用以及依赖的组件
- 容器是你发布和测试的应用程序的单位
- 将应用程序作为容器或编排协调服务部署到生产环境中。无论你的环环境是本地数据中心,云上或者混合云,docker容器将一样运行
Docker Engine
Docker是一个开源的容器化技术,用于构建和容器化你的应用。docker是cs(client-server)模式.。
- 服务端进程 dockerd
- API 提供接口 用来和docker daemon交互
- 命令行客户端(CLI)docker
客户端用CLI或者脚本的方式调用API发指令与Docker daemon交互。daemon 负责创建和管理docker中的对象:images,containers,networks,volumes。
应用场景
docker提供了一个快速一致性的交付环境。
Docker通过提供标准的容器环境简化了开发流程。非常适合CI/DI的工作流程。
- 本地开发的代码通过容器与同事共享他们的工作成果
- 将应用程序推送到测试环境中,并执行自动和手动测试。
- 当开发人员发现错误时,他们可以在开发环境中对其进行修复,然后将其重新部署到测试环境中以进行测试和验证。
- 测试完成后,将修复程序推送给生产环境就像将更新的映像推送到生产环境一样简单。
响应式部署扩展
docker容器可以没差别的运行在笔记本,物理机,虚拟机,云上或者混合云上,这使他具有非常高的移植性。根据业务可以实时的动态扩展。
Docker架构
Docker使用client-server模式。客户端发指令,Docker daemon负责构建,运行,发布docker container。client daemon可以在同一个主机上,也可以用client连一个远程的daemon,client和daemon通过RESTAPI进行交互
Docker daemon
Docker daemon (dockerd) 监听客户端的请求管理Docker images containers networks , volumes。dockerd 还可以和其他dockerd通讯,以便管理Docker 服务。
Docker client
和dockerd交互的主要工具,比如客户端发送docker run命令到dockerd。client 可以和多个dockerd交互。
docker register
存放docker 镜像的地方。Docker Hub 是docker官方的一个docker仓库,Docker默认从Docker Hub中获取镜像。你也可以用你自己的私有仓库。
docker pull 或docker run 命令将从你配置好的仓库中获取镜像。docker push 可以将镜像推到你配置的仓库中。
Docker object
本小节简单介绍下images,containers,networks,volumes。
IMAGES
镜像是只读的用来创建docker container。通常镜像是一层一层的,一个镜像依赖另外的镜像。打个比方你的应用是基于Apache 和 ubuntu的,如果应用要跑起来还要配置信息。
你可以用自己的镜像也可以用其他人的镜像。如果要创建镜像就要写Dockerfile。Dockerfile中的每个指令代表镜像中的某一层。当你修改Dockerfile重新构建镜像,只有那些有变更的层会重新构建,这也是docker相较于其他虚拟化技术轻量,小体积,快速的原因。
CONTAINERS
容器是一个运行的镜像容器。你可以通过API或CLI 进行 create, start, stop, move, or delete。可以将容器连接到一个或多个网络中,挂上存储。甚至可以将当前状态做成一个新的镜像。
默认情况下,容器与其他容器及其主机之间的隔离度相对较高。你可以控制容器的网络,存储,底层子系统的隔离度。
容器是由镜像和启动或创建时候的选项定义的。删除容器将删除没有持久化的数据。
docker run
下面的例子在你的本地命令行启动一个ubuntu容器,并运行/bin/bash
$ docker run -i -t ubuntu /bin/bash
这条命令 docker做了哪些事情
- 如果你本地没有ubuntu镜像。docker会从从仓库中拉取一个镜像。就像手动执行 docker pull ubuntu
- 创建容器 docker container create
- Docker将分配一个文件系统给容器。作为其最后一层。这样容器就可以在本地的文件系统中创建或修改文件和目录
- Docker创建一个网络接口将容器接入默认的网络,如果你没有指定网络相关的参数。包括分配IP地址。默认容器通过宿主机能后访问外部网络。
- 当你执行exit命令 退出/bin/bash。容器将停止但不会删除,可以重启再删除。
集群模式- SERVICES
Services 使多个Docker daemon组成一个集群,对于消费者client来说跟一个dockerd一样。Docker Engine 1.2 之后支持集群模式。
底层技术
Docker是go语言的编写的,许多功能都依赖了Linux内核:
Namespace
Namespace可以为容器提供隔离的工作区。当你运行一个容器,docker为容器创建了一系列namespaces。
这些namespaces提供了一层隔离层,并在各个层面提供了资源隔离
docker用了下面这些命名空间
- The
pid
namespace: Process isolation (PID: Process ID). - The
net
namespace: Managing network interfaces (NET: Networking). - The
ipc
namespace: Managing access to IPC resources (IPC: InterProcess Communication). - The
mnt
namespace: Managing filesystem mount points (MNT: Mount). - The
uts
namespace: Isolating kernel and version identifiers. (UTS: Unix Timesharing System).
Control Groups
docker的资源隔离依赖了内核的cgroups。cgroup 限制了应用程序的资源集。cgroup使docker可以各自隔离的共享硬件资源。比方给某容器限制内存大小为1G。
Union file systems
创建层的文件系统Union文件系统 UnionFS,docker用UnionFS为容器提供构建模块。Docker可以使用多个UnionFS的变体,包括AUFS, btrfs, vfs,DeviceMapper 等等。
Container format
将namespaces, control groups, and UnionFS包装起来叫做容器格式
默认容器格式是libcontainer
。未来Docker可能通过集成BSD Jails 或者 Solaris Zones支持其他容器格式