docker 入个门
Docker中三个基础概念:镜像、容器、仓库
镜像(Image)
操作系统分为内核和用户空间。对于 Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持。而 Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:18.04 就包含了完整的一套 Ubuntu 18.04 最小系统的 root 文件系统。Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变
分层存储
因为镜像包含了操作系统完整的 root 文件系统,其体积还是很巨大的,所以引入了 Unios FS 技术,将其设计为分层存储的架构。所以镜像不是那种 ISO 打包文件,镜像是一个虚拟的概念,它是由一组文件系统构成,或者说多层文件系统联合构成
镜像在构建时,是一层层构建,上一层是下一层的基础,每一层构建结束就不会在被修改,后一层任何修改只会作用在当前层。例如删除上一层文件,不会真的删除该文件,而是会标记删除然后隐藏起来,最终运行容器的时候不会被看见,但是会一直跟随镜像。因此构建镜像时需要小心,不要添加不需要的东西,任何额外的东西都要在本层构建完之前清除
分层存储使镜像的定制和复用变得容易,可以用之前做好的镜像作为基础层,然后添加新的层,定制自己所需要的东西,构建新的镜像
容器(Container)
镜像和容器的关系,就像是面向对象程序中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建,启动,停止,删除,暂停等
每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的存储层为容器存储层
容器存储层的生存周期和容器一样,容易消亡时,容器存储层也随之消亡,因此,任何保存于容器存储层的信息都会随容器的删除而丢失
按照docker最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用数据卷,或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高
数据卷的生存周期独立于容器,容器消亡,数据卷不会消失。因此,使用数据卷后,容器可以随意删除,重新run,数却不会丢失
仓库(Repository)
镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务
一个 Docker Registry 可以有多个 仓库(Repository),每个仓库可以含多个标签(Tag),每个标签都是一个镜像
最初我没有搞懂 Docker Registry 和 仓库(Repository),简单来说就是 Docker Registry 是注册服务器,用于管理镜像仓库,起到服务器的作用,仓库(Repository)就是存储镜像,起到存储镜像的作用。默认的 Docker Registry 就是 Docker Hub,其中拥有很多高质量的镜像
Docker中常用命令
镜像相关命令
容器相关命令
仓库相关命令
Docker run相关命令
Docker exec相关操作
Docker commit相关操作
版权声明: 本文为 InfoQ 作者【书旅】的原创文章。
原文链接:【http://xie.infoq.cn/article/87d62f57f2b3dc6d8832a7f68】。文章转载请联系作者。
评论 (2 条评论)