写在最前面
本文主要是转译docker官方文档。主题是Docker overview,这里是链接
Docker概述
Docker是一个用于开发、发布和运行应用程序的开放平台。Docker使你能够将应用程序与基础设施分离,从而可以快速交付软件。你可以使用相同的方法像管理应用程序那样去管理基础设施。通过利用Docker的发布、测试和部署代码的方法,你可以显著减少编写代码和在生产过程中运行代码之间的时间
Docker能干嘛?
1.快速且持续地发布你的应用程序
Docker把开发生命周期流水线化,通过使用容器,从而使开发者的工作环境变得标准化,这些容器提供应用程序和服务。容器时大量的持久化集成(continuous integration CI)和持久化发布(continuous delivery CD)的工作流.如以下情况
- 开发者本地写代码并且通过Docker容器分享工作给其他同事
- 使用Docker将应用程序推到测试环境中,并运行自动化和手动测试。
- 当开发者发现bug,他们能够在生成环境进行修复,且重新部署在测试环境进行测试和验证
- 当测试完成后,向客户提供修复程序就像将更新后的代码推送到生产环境一样简单。
2.响应式部署和扩展
Docker的基于容器的方式拥有高度可移植性。Docker容器能运行在开发者本地电脑,在数据中心的物理或虚拟机器,在云服务,或者多种混合环境。
Docker的便携性和轻量性使得其天生的能从容地管理程序,有商业需求时,近乎实时的扩大或缩小应用程序和服务
3.在相同的硬件下能运行更多的程序
Docker是轻量且快速的。它相比于基于虚拟机部署的方案提供了另一种可行的、经济有效的替代方案,相比基于虚拟机的方法来说可以部署更多的服务。Docker非常适合服务集中的环境和中小型部署,达成用更少的资源完成更多的工作。
Docker架构
Docker使用客户端-服务器架构。Docker客户端与Docker守护进程交流,Docker客户端负责构建,运行和发布Docker容器。Docker客户端和Docker守护进程能够工作在同一个系统,也能使用Docker客户端去连接远程的Docker守护进程,它们之间使用Rest API进行交流。另一种Docker客户端是Docker Compose,允许你使用由一组容器组成的应用程序。
Docker守护进程
Docker守护进程(dockerd)监听Docker API请求并管理Docker对象如镜像,容器,网络和卷。一个守护进程能够与其他守护进程进行交流去共同管理Docker服务
Docker客户端
Docker客户端(docker)是使用Docker的主要方式。当年使用命令docker run
,客户端会发送命令到dockerd。docker命令使用Docker API。Docker客户端能够连接多个Docker守护进程
Docker Desktop
Docker桌面是一个应用程序,能够轻松地安装在Mac,Windows,Linux中。Docker桌面包括Docker守护进程(dockerd),Docker客户端(dockerd),Docker Compose,Docker Content Trust, Kubernetes和Credential Helper。
Docker registries
Docker registries是存储Docker image的地方。Docker Hub是一个公开的Docker registries,任何人都能使用。默认使用Docker Hub作为Docker registries。也可以使用私有的registry。
当使用docker pull
或者docker run
命令,Docker从配置好的registry 拉取需要的images,docker push
同理
Docker objects
Docker对象主要有以下,images(镜像),containers(容器),networks(网络),volumes(卷),plugins(插件)
Images
一个images是一个只读的模板,包含一些指令,能这些指定够创建一个Docker容器。通常来说,一个image是在另一个image的基础上加上自定义配置形成的。
Contains
一个container是一个可运行的image的实例。container能够被创建,开始,停止,移动或删除。容器可以连接一个或多个网络,存储,或者基于当前container创建一个新的image
默认情况下,容器之间是独立的。可以控制如何隔离容器的网络,存储或其他subsystems
底层原理
Docker是用Go编程语言编写的,并利用了Linux内核的几个特性。Docker使用一种名为namespace的技术来提供称为容器的隔离工作区。当您运行一个容器时,Docker会为该容器创建一组名namespace。这些namespace提供了一个隔离层。容器的每个方面都在一个单独的namespace中运行,其访问权限仅限于该namespace。