1、why–为什么需要容器
(1)背景
今天,开发人员通常使用多种服务(比如 MQ,Cache,DB)构建和组装应用,而且应用很可能会部署到不同的环境,比如虚拟服务器,私有云和公有云。一方面应用包含多种服务,这些服务有自己所依赖的库和软件包;另一方面存在多种部署环境,服务在运行时可能需要动态迁移到不同的环境中。这就产生了一个问题:如何让每种服务能够在所有的部署环境中顺利运行?
(2)引入docker的理由
简要的答案是:容器使软件具备了超强的可移植能力。
(3)docker的优势
对于开发人员来说–Build Once, Run Anywhere
容器意味着环境隔离和可重复性。开发人员只需为应用创建一次运行环境,然后打包成容器便可在其他机器上运行。另外,容器环境与所在的 Host 环境是隔离的,就像虚拟机一样,但更快更简单。
对于运维人员来说–Configure Once, Run Anything
只需要配置好标准的 runtime 环境,服务器就可以运行任何容器。这使得运维人员的工作变得更高效,一致和可重复。容器消除了开发、测试、生产环境的不一致性。
2、what–什么是容器
(1)定义
容器是一种轻量级、可移植、自包含的软件打包技术,使应用程序可以在几乎任何地方以相同的方式运行。开发人员在自己笔记本上创建并测试好的容器,无需任何修改就能够在生产系统的虚拟机、物理服务器或公有云主机上运行。
(2)组成
应用程序本身;
依赖:比如应用程序所需要的库或者其他软件
(3)对比容器与虚拟机
相同点:两者都是为应用提供封装何隔离
不同点:
a、容器在Host操作系统的用户空间中运行,与操作系统的其他进程隔离。这一点显著区别于虚拟机。
b、由于所有的容器共享同一个Host OS,这使得容器在体积上要比虚拟机小很多。另外,启动容器不需要启动整个操作系统,所以容器部署和启动速度更快,开销更小,也更容易迁移。
3、how–容器是如何工作的
(1)docker架构
docker采用的是Client/Server架构。客户端向服务端发送请求,服务端负责构建、运行和分发容器。客户端和服务端可以运行在同一个Host上,客户端也可以通过socket或REST API与远程的服务器通信
(2)核心组件
a、docker客户端
定义:通过docker客户端我们可以方便地在Host上构建和运行容器。
相关命令:最常用的Docker客户端是docker命令;直接输入docker可以查看docker支持的子命令。
b、docker服务端
定义:Docker daemon以后台服务的方式运行在Docker host上,负责创建、运行、监控容器,构建、存储镜像。
默认配置:默认配置下,Docker daemon只能响应来自本地Host的客户端请求。(也可以配置允许远程客户端请求)
c、docker镜像
定义:可将Docker镜像看着只读模板,通过它可以创建Docker容器。例如某个镜像可能包含一个Ubuntu操作系统、一个Apache HTTP Server以及用户开发的Web应用。
生成镜像:
可以从无到有开始创建镜像(可以将镜像的内容和创建步骤描述在一个文本文件中,这个文件被称作 Dockerfile,通过执行 docker build
也可以下载并使用别人创建好的现成的镜像;
还可以在现有镜像上创建新的镜像。
d、docker容器
定义:Docker容器就是Docker镜像的运行实例。
通俗理解:可以这么认为,对于应用软件,镜像是软件生命周期的构建和打包阶段,而容器则是启动和运行阶段。
e、registry
定义:Registry 是存放 Docker 镜像的仓库。
分类:
公有:Docker Hub(https://hub.docker.com/) 是默认的 Registry,由 Docker 公司维护,上面有数以万计的镜像,用户可以自由下载和使用;
私有:出于对速度或安全的考虑,用户也可以创建自己的私有 Registry。
相关命令:
docker pull:命令可以从 Registry 下载镜像。
docker run:命令则是先下载镜像(如果本地没有),然后再启动容器。