Docker概述
为什么用Docker
我们经常遇到因为环境不一样而导致程序运行出错,而Docker的出现解决了这个问题。
Docker是一种虚拟化方式,Docker有很多优势:
- 高效的系统资源利用率
- 启动快
- 统一的运行环境
- 持续的交付和部署
- 轻松便捷的迁移
- 简便的维护和扩展
Docker的基本概念
可以说,Docker主要由三个部分组成。
- 镜像(
Image
) - 容器(
Container
) - 仓库(
Repository
)
Docker镜像
Docker镜像是一个特殊的文件系统,其包含了容器运行所需的程序、库、资源等,也包含了运行时准备的一些配置参数。镜像不包含任何动态数据,也就是其内容构建之后也不会被改变。
Docker镜像是分层存储的,构建时是一层一层的,这种特性也使它的复用、定制变得容易。
Docker容器
镜像(Image
)和容器(Container
)的关系,类似于面向对象程序设计中的类
和对象
的关系。容器是镜像运行时的实体,容器可以被创建、启动、停止、删除、暂停等。
容器的实质是进程,但这个容器进程运行于属于自己的独立的命名空间。容器内的进程是运行在一个隔离的环境里。
容器和镜像一样,分层存储。每一个容器运行时是以镜像为基础层,在其上创建一个当前容器的存储层,这个为容器运行时读写而准备的存储层称为容器存储层。(有点类似于电脑的内存)
容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用数据卷(Volume
)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。
数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器删除或者重新运行之后,数据却不会丢失。
Docker仓库
对于用过GitHub仓库就很好理解,镜像和仓库的关系就类似于用 git管理的项目
与GitHub仓库
之间的关系。
每个仓库可以包含多个标签,每个标签对应一个镜像,我们可以通过 <仓库名>:<标签>
的格式来指定具体是这个软件哪个版本的镜像。