Docker笔记(一):什么是Docker中,我们提到了Docker管理的对象包含镜像、容器、网络、数据卷等,本文就来介绍下这些对象及用途。

1. 镜像

所谓镜像,是一个静态的概念。它对我们期望干的事情做了一些定义,比如要运行什么程序,需要哪些依赖,需要什么样的配置,需要开放哪个网络端口等等。
Docker的镜像是一个特殊的文件系统,提供了运行时需要的程序、库、资源、配置等文件,还包含一些为运行时准备的配置参数(如环境变量、匿名数据卷、用户等),镜像不包含任何动态数据,其内容在构建之后也不会被改变。
镜像的文件系统有一个分层存储的概念,采用的是Union FS技术,因此,镜像并不是简单地由一组文件组成,而是由多层文件系统叠加联合组成。如下图所示
container-layers

镜像构建时,会一层一层地构建,前一层是后一层的基础,每层构建完后就变成只读的,不会再发生改变。镜像分层存储的一大好处是复用,镜像的每一层可以在不同镜像间复用,这就好比我们开发项目时将一些公共功能封装成jar包,在各个项目可以直接依赖使用一样。关于镜像的更多内容,在后续使用时再详述。

2. 容器

相对镜像,容器是一个动态的运行时的概念,它与镜像的关系类似于面向对象中类与实例的关系。容器可以被创建、启动、停止、删除等。容器运行实质上就是运行一个进程,但与那些直接在宿主机上运行的进程不同,容器运行在自己的独立的隔离的命名空间中——拥有自己的root文件系统、网络配置、进程空间,甚至自己的用户ID空间,因此虽然是以进程的形式运行,但好像是运行在一个独立的系统中一样,这样相比直接运行于宿主机的进程,容器的运行显得更为安全。
前面说到镜像的分层存储概念,对于容器来说,实际上也是以镜像作为基础层,在其上创建了一个当前容器的存储层,如下图
sharing-layers.jpg

以镜像ubuntu:15.04为基础层所创建的容器,都有一个自己的可读写的存储层(镜像的存储层是只读的)。容器存储层的生命周期与容器一样,容器销毁时,容器的存储层也会随之消亡,任何保存在容器存储层的数据也都会随容器的删除而丢失,因此一般我们要保持容器存储层的无状态化,所有文件的写操作,都应该使用数据卷或绑定宿主机目录。

3. 数据卷

数据卷是一个独立于容器,可供一个或多个容器使用的特殊目录,它绕过了Union FS,不会随容器的销毁而消亡。这好比我们在阿里云上建虚机,再加载一个数据盘一样,一般产生的数据都要保存在数据盘,而不是虚机的系统盘。
数据卷具备如下特性:

  1. 可以在容器之间共享和重用
  2. 对数据卷的修改会立马生效
  3. 数据卷的更新,不会影响到镜像
  4. 数据卷默认会一直存在,不会随容器的删除而消亡

4. 网络

Docker容器是如何与外部进行网络通信的?一般来说,我们在运行容器时,只需要指定容器服务端口与宿主机端口的映射,就可以通过宿主机IP与映射的端口访问容器服务了,因为Docker默认使用了Bridge的模式来实现容器与外部的通信。
Docker的网络子系统通过使用一些驱动程序,是可插拔式的,默认提供了如下几种驱动:

  1. bridge:默认的网络驱动。运行在容器中的应用程序一般是通过网桥与外部进行通信。
  2. host:容器直接使用宿主机的网络通信。host只在基于Docker 17.06或以上版本的Swarm服务中可用
  3. overlay:overlay可将多个Docker daemon进程连接起来使得Swarm服务之间能相互通信,也可以将overlay用于Swarm服务与容器之间,或运行在不同Docker daemon上的容器之间的通信,不需要操作系统层面的路由配置。
  4. macvlan:macvlan允许你分配一个mac地址给容器,让它像一台物理设备一样加入你的网络中。Docker daemon通过mac地址将请求路由给容器,适用于那些希望直接连到物理网络的遗留应用。
  5. none:禁用所有网络。一般与一个自定义的网络驱动一起使用。none不能用于Swarm服务。
  6. 其它第三方网络插件:可从Docker Hub或其它第三方供应商获取安装。

总之,bridge适用于在同一台宿主机运行多个容器的场景;host适用于不应与宿主机进行网络隔离的场景;overlay适用于运行在不同宿主机上的容器间通信,或多个应用通过Swarm服务来共同协作的场景;macvlan适用于从虚拟机迁移配置或希望容器作为物理机一样使用网络的场景。

5. 总结

本文对Docker所管理的几个基本对象——镜像、容器、数据卷、网络做了简单介绍,这是认识或学习Docker的基础,在后续实践操作过程中,将会对各部分进行更详细的使用说明,欢迎持续关注。


我的个人博客地址:http://blog.jboost.cn
我的微信公众号:jboost-ksxy (一个不只有技术干货的公众号,欢迎关注,及时获取更新内容)
———————————————————————————————————————————————————————————————
微信公众号