经过下图能够得知,Docker
在运行时分为 Docker 引擎(服务端守护进程)
和 客户端工具
,咱们平常使用各类 docker 命令
,其实就是在使用 客户端工具
与 Docker 引擎
进行交互。docker
Client 客户端
Docker 是一个客户端-服务器(C/S)架构程序。Docker 客户端只须要向 Docker 服务器或者守护进程发出请求,服务器或者守护进程将完成全部工做并返回结果。Docker 提供了一个命令行工具 Docker 以及一整套 RESTful API。你能够在同一台宿主机上运行 Docker 守护进程和客户端,也能够从本地的 Docker 客户端链接到运行在另外一台宿主机上的远程 Docker 守护进程。数据库
Host 主机(Docker 引擎)
一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。服务器
Image 镜像
什么是 Docker 镜像?简单的理解,Docker 镜像就是一个 Linux 的文件系统(Root FileSystem),这个文件系统里面包含能够运行在 Linux 内核的程序以及相应的数据。架构
经过镜像启动一个容器,一个镜像就是一个可执行的包,其中包括运行应用程序所须要的全部内容:包含代码,运行时间,库,环境变量和配置文件等。工具
Docker 把 App 文件打包成为一个镜像,而且采用相似屡次快照的存储技术,能够实现:性能
- 多个 App 能够共用相同的底层镜像(初始的操做系统镜像);
- App 运行时的 IO 操做和镜像文件隔离;
- 经过挂载包含不一样配置/数据文件的目录或者卷(Volume),单个 App 镜像能够用来运行无数个不一样业务的容器。
Container 容器
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例同样,镜像是静态的定义,容器是镜像运行时的实体。容器能够被建立、启动、中止、删除、暂停等。学习
Docker | 面向对象 |
---|---|
容器 | 对象 |
镜像 | 类 |
镜像分层
Docker 支持经过扩展示有镜像,建立新的镜像。实际上,Docker Hub 中 99% 的镜像都是经过在 base 镜像中安装和配置须要的软件构建出来的。ui
从上图能够看到,新镜像是从 base 镜像一层一层叠加生成的。每安装一个软件,就在现有镜像的基础上增长一层。操作系统
镜像分层最大的一个好处就是共享资源。好比说有多个镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需在磁盘上保存一份 base 镜像;同时内存中也只需加载一份 base 镜像,就能够为全部容器服务了。并且镜像的每一层均可以被共享。命令行
若是多个容器共享一份基础镜像,当某个容器修改了基础镜像的内容,好比 /etc 下的文件,这时其余容器的 /etc 是不会被修改的,修改只会被限制在单个容器内。这就是容器 Copy-on-Write 特性。
可写的容器层
当容器启动时,一个新的可写层被加载到镜像的顶部。这一层一般被称做“容器层”,“容器层”之下的都叫“镜像层”。
全部对容器的改动 - 不管添加、删除、仍是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的全部镜像层都是只读的。
镜像层数量可能会不少,全部镜像层会联合在一块儿组成一个统一的文件系统。若是不一样层中有一个相同路径的文件,好比 /a,上层的 /a 会覆盖下层的 /a,也就是说用户只能访问到上层中的文件 /a。在容器层中,用户看到的是一个叠加以后的文件系统。
文件操做 | 说明 |
---|---|
添加文件 | 在容器中建立文件时,新文件被添加到容器层中。 |
读取文件 | 在容器中读取某个文件时,Docker 会从上往下依次在各镜像层中查找此文件。一旦找到,当即将其复制到容器层,而后打开并读入内存。 |
修改文件 | 在容器中修改已存在的文件时,Docker 会从上往下依次在各镜像层中查找此文件。一旦找到,当即将其复制到容器层,而后修改之。 |
删除文件 | 在容器中删除文件时,Docker 也是从上往下依次在镜像层中查找此文件。找到后,会在容器层中记录下此删除操做。(只是记录删除操做) |
只有当须要修改时才复制一份数据,这种特性被称做 Copy-on-Write。可见,容器层保存的是镜像变化的部分,不会对镜像自己进行任何修改。
总结下来就是:容器层记录对镜像的修改,全部镜像层都是只读的,不会被容器修改,因此镜像能够被多个容器共享。
Volume 数据卷
实际上咱们的容器就好像是一个简易版的操做系统,只不过系统中只安装了咱们的程序运行所须要的环境,前边说到咱们的容器是能够删除的,那若是删除了,容器中的程序产生的须要持久化的数据怎么办呢?容器运行的时候咱们能够进容器去查看,容器一旦删除就什么都没有了。
因此数据卷就是来解决这个问题的,是用来将数据持久化到咱们宿主机上,与容器间实现数据共享,简单的说就是将宿主机的目录映射到容器中的目录,应用程序在容器中的目录读写数据会同步到宿主机上,这样容器产生的数据就能够持久化了,好比咱们的数据库容器,就能够把数据存储到咱们宿主机上的真实磁盘中。
Registry 注册中心
Docker 用 Registry 来保存用户构建的镜像。Registry 分为公共和私有两种。Docker 公司运营公共的 Registry 叫作 Docker Hub。用户能够在 Docker Hub 注册帐号,分享并保存本身的镜像。
Docker 公司提供了公共的镜像仓库 https://hub.docker.com(Docker 称之为 Repository)提供了庞大的镜像集合供使用。
一个 Docker Registry 中能够包含多个仓库(Repository);每一个仓库能够包含多个标签(Tag);每一个标签对应一个镜像。
一般,一个仓库会包含同一个软件不一样版本的镜像,而标签对应该软件的各个版本。咱们能够经过 <仓库名>:<标签> 的格式来指定具体是这个软件哪一个版本的镜像。若是不给出标签,将以 latest 做为默认标签。
总结
Docker 官网写着这样一句话:Build and Ship any Application Anywhere,再结合刚才咱们所理解的内容,总结下来就是:一次构建,处处运行。
此外,Docker 公司提供了公共的镜像仓库 https://hub.docker.com(Docker 称之为 Repository),GitHub connect,自动构建镜像,大大简化了应用分发、部署、升级流程。加上 Docker 能够很是方便的创建各类自定义的镜像文件,这些都是 Docker 成为最流行的容器技术的重要因素。
经过以上这些技术的组合,最后的结果就是:绝大部分应用,开发者均可以经过 docker build 建立镜像,经过 docker push 上传镜像,用户经过 docker pull 下载镜像,使用 docker run 运行容器应用。用户再也不须要去关心如何搭建环境,如何安装,如何解决不一样发行版的库冲突——并且一般不会消耗更多的硬件资源,不会明显下降性能。
从下文开始,咱们就进入 Docker 实操部分,先从 Docker 的安装及配置镜像加速讲起,而后再学习一些镜像和容器最经常使用的命令。
本文采用 知识共享「署名-非商业性使用-禁止演绎 4.0 国际」许可协议
。
🤗 您的点赞
和转发
是对我最大的支持。
📢 扫码关注 哈喽沃德先生
「文档 + 视频」每篇文章都配有专门视频讲解,学习更轻松噢 ~