Docker是一个可用于开发、交付和运行应用程序的开放平台。它能够使你的程序和你的基础设施(服务器、数据库等)分离开,这样你可以快速交付软件。使用Docker,你可以像管理你的应用程序一样管理基础设施。通过利用Docker的方法原则来快速交付、测试和部署,可以明显的减少代码开发和部署之间的延迟。
Docker平台
Docker能够提供一个宽松、隔离的环境来打包、运行应用程序,这个环境叫做容器。这种隔离、安全的环境,可以使你在一个主机上同时运行多个容器,即多个应用程序。容器是一个轻量级的、包含了运行应用程序所需的一切,这样你就不用依赖目前主机上安装的东西。在你的工作中,可以轻松分享容器,确保得到你分享的容器的人以同样的方式工作。
Docker提供了工具和平台来管理容器的整个生命周期:
- 使用Docker开发你的应用程序及其依赖的组件。
- 容器成为你的应用程序的发布、测试单元。
- 准备好之后,将你的应用程序以容器或编排的服务(后续讲到,涉及Docker Swarm或k8s)的方式发布到生产环境。无论你的生产环境是本地的数据库中心还是云供应商,或者是两者的混合,都是一样的。
可以用Docker做什么
快速、持续交付程序 Docker通过允许开发人员使用本地容器提供程序和服务,在标准化的环境中工作,使整个开发周期流水线化。容器非常适合持续集成/持续发布(CI/CD)工作流。
考虑下面的示例场景:
- 开发人员本地编写代码,使用Docker容器和同事分享工作。
- 使用Docker推送应用程序到测试环境,执行自动和手工测试。
- 当发现bug时,可以在开发环境下修复并重新发布到测试环境进行测试和验证。
- 当测试完成后,将修复程序发送给客户,就像将更新后的镜像推送到生产环境一样简单。
响应式的部署和扩展 Docker基于容器的平台允许高度可移植的工作负载。Docker容器可以运行在本地开发人员的笔记本上、数据库中心的物理机或虚拟机上、云供应商或这些环境的混合上。 Docker的可移植、轻量级特性,同样使得其可以轻松的根据业务需要,快速的动态管理工作负载、扩容或缩容应用程序和服务。
在同样的硬件上运行更多的工作负载 Docker是轻量级的、快速的。和以hypervisor为基础的虚拟机相比,提供了一套可行的、经济的替代方案。这样你可以更加充分的利用你的服务器容量来达到你的目标。Docker非常适合高密度环境和需要更少资源做更多事情的中小型部署。
Docker架构
Docker使用的是客户端-服务端架构。Docker客户端与Docker守护进程通话,Docker守护进程负责容器的构建、分发和运行等繁重工作。Docker客户端和守护进程可以运行在同一操作系统中,也可以使用Docker客户端连接远程的Docker守护进程。Docker客户端和守护进程之间使用REST API,通过UNIX socket或网络接口通信。另一个Docker客户端就是Docker Compose,它允许你使用由一组容器组成的程序。
Docker守护进程
Docker守护进程监听着Docker API请求,管理Docker对象,比如镜像、容器、网络和卷。一个守护进程还可以和其他Docker守护进程通信来管理Docker服务。
Docker客户端
Docker客户端是多数用户和Docker交互的主要方式,当你使用类似docker run的命令时,客户端发送这些命令到守护进程,执行这些命令。客户端使用Docker API。客户端可以和不止一个守护进程通信。
Docker桌面软件
Docker桌面软件是一个易安装的、适用于Mac、Windows或Linux环境应用程序,可以使你构建、分发容器应用和微服务。它包括了Docker守护进程、Docker客户端、Docker Compose、Docker Content Trust、Kubernetes, and Credential Helper。更多信息参考Docker Desktop(个人建议,学习阶段,不建议使用,因为图形化操作,会影响对Docker底层的理解)
Docker仓库
Docker仓库用来存放Docker镜像。Docker Hub是一个公共的仓库,任何人都可以使用,默认情况下,Docker的配置就是到此查找镜像。用户可以运行自己的仓库。
当你运行docker pull或docker run命令时,所需的镜像会从你配置的仓库中拉取。当你运行docker push命令时,你的镜像被推送到你配置的仓库。
Docker对象
当你使用docker时,你创建和使用镜像、容器、网络、卷、插件和其他对象。这部分是一个简要的概括来说明这些对象。
镜像
镜像是一个只读的模版,包含了创建容器所需的命令,通常情况下,一个镜像是基于另一个镜像,添加一些额外的定投内容。比如,你可以基于ubuntu构建一个镜像,但安装了Apache的web服务器和你的应用,以及运行你的应用程序所需的详细配置。
你可以构建你自己的镜像,或者你只是使用其他人推送到仓库的镜像。为构建你自己的镜像,你创建并运行了一个Dcokerfile,一个通过简单语法来定义构建镜像所需若干步骤的文档。Dockerfile中每一个指令在镜像中创建了一个层。当你修改Dockerfile并重新构建镜像,只有受影响的层会重新构建。和其他虚拟技术相比,这是使镜像如此轻量、小和快的部分原因。
容器
容器是镜像的运行实例。你可以通过Docker API或命令行创建、运行、停止、移动或删除一个容器。一个容器可以连接到一个或多个网络,连接外部存储,甚至可以基于它当前状态创建新的容器。
默认情况下,一个容器和其他容器及其宿主机隔离的相对较好。你可以控制一个容器的网络、存储或其他底层子系统与其他容器或宿主机的隔离程度。
一个容器是被它的镜像以及你创建或运行它时的配置选项定义的。当一个容器被移除时,任何未被持久化到存储中的状态变更都将消失。
比如**docker run**命令
下面的命令运行一个ubuntu容器,以交互的方式连接到本地命令行会话,运行/bin/bash
docker run -i -t ubuntu /bin/bash
当你运行这条命令,发生下面的事情(假设你使用的默认的仓库)
- 如果本地没有
ubuntu镜像,Docker会从配置的仓库拉取,就像你手动运行了docker pull ubuntu - Docker创建一个新的容器,就像你手动执行了
docker container create命令一样。 - Docker分配一个可读写的文件系统给这个容器,做为它的最后一层。这允许运行中的容器创建或更新它自己文件系统中的文件或目录。
- Docker创建一个网络接口来连接容器和默认的网络,即使你没有指定任何网络配置。默认情况下,容器通过宿主机制网络连接外部的网络。
- Docker启动容器,执行
/bin/bash。因为容器是以交互模式运行,并且连接到你的终端(因为使用了-i和-t),你可以通过键盘提供输入,同时输出打印到了你的终端。 - 当你录入exit来终止
/bin/bash命令,容器停止,但并未删除,你可以重启或删除它。
底层的技术
Docker是用Go语言开发,利用了几个Linux内核的几个特性来提供自己的功能。Docker使用了一种命为namespace的技术提供叫做容器隔离工作空间。当你运行容器,Docker为这个容器创建了一组namespace。
这些namespace提供了一层隔离,容器的每一方面都在一个单独的namespace中,访问权限仅限于该namespace.