docker


docker

Docker本质是宿主机上的进程。 Docker通过namespance实现了资源隔离;通过cgroups实现了资源限制;通过写时复制实现了 高效的文件操作。

Docker镜像是由文件系统叠加而成。最底端的是一个引导文件系统,即bootfs。当一个容器启动后,它会被移到内存中,而引导系统会被卸载,以留出更多内存供 initrd磁盘镜像使用。 镜像的第二层是root文件系统rootfs,它位于引导系统之上。在传统的Linux引导过程中,root文件系统会最先以只读形式加载,当引导结束并完成完整性检查后, 它会被切换为读写模式。但docker中,root文件系统永远只能是只读状态,并且,docker利用联合加载(union mount)技术又会在root文件系统层上 加载更多的只读文件系统。联合加载指的是一次同时加载多个文件系统,但在外面看起来只能看到一个文件系统。联合加载会将各层文件系统叠加到一起, 这样最终的文件系统会包含所有底层的文件和目录。

当从一个镜像启动一个容器时,Docker会在该镜像的最顶层加载一个读写文件系统。容器的运行采用写时复制技术:启动后的初始读写层是空的,当文件系统发生变化时,这些变化 都会被应用到这一层上。比如,如果想修改一个文件,这个文件会首先从该读写层下面的只读层复制到该读写层。该文件的只读版本依然存在,但已经 别读写层中的该文件副本所隐藏。


CMD指令

  • CMD指令可被docker run命令覆盖。
  • Dockerfile中只能指定一条CMD指令。如果指定了多条CMD指令,也只有最后一条CMD指令被使用。如果想在容器启动时运行多个进程或多条命令,可以考虑使用 类似supervisor之类的进程管理工具。