docker_practice/basic_concept/container.md

12 lines
1.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

## Docker 容器
镜像Image和容器Container的关系就像面向对象程序设计中的`类`和`实例`关系一样。容器是由镜像创建运行的实例。容器可以被创建、启动、停止、删除、暂停等。
容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的[命名空间](https://en.wikipedia.org/wiki/Linux_namespaces)。因此容器可以拥有自己的 `root` 文件系统,拥有自己的网络配置,拥有自己的进程空间,甚至用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来的感觉,就好像是在一个独立宿主的操作系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。也因为这种隔离的特性,很多人初学 Docker 时经常把容器和虚拟机搞混。
前面讲过镜像使用的是分层存储,容器也是如此。每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,我们可以称这个为容器准备的层为**容器存储层**。
容器运行时所有的读写实际上都是发生在容器存储层的,容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。
按照 Docker 最佳实践的要求容器不应该向其存储层内写入任何数据容器存储层要保持无状态化。所有的文件写入操作都应该使用数据卷Volume、或者绑定宿主目录这些位置的读写会跳过容器存储层直接对宿主或者网络存储发生读写其性能和稳定性更高。数据卷的生存周期独立于容器容器消亡数据卷不会消亡。因此使用数据卷后容器可以随意删除、重新 `run`,数据却不会丢失。