Docker容器

Docker中的镜像和容器的关系可以类比面向对象程序设计中的类和实例。镜像是静态的定义,容器是镜像运行的实体。容器可以被创建(run)、启动(start)、重启(restart)、关闭(stop)、删除(erm)等,镜像可以被拉取(pull),推送(push)、删除(rm)等。


容器的实质是进程,但与直接在宿主机上执行的进程不同,容器进程运行于数据自己的独立的命名空间。因此容器可以有自己的root文件系统、自己的网络配置、自己的进程空间等。

容器内的进程是运行在一个隔离的环境,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性也使得容器封装的应用直接在宿主机上运行更加安全。


前面说过镜像的分层存储,容器也是如此。每当一个容器运行的时候,是以镜像作为基础层,在上面创建一个当前容器的存储层,这个为容器运行时读写而准备的存储层也称为容器存储层。


容器存储层的生命周期和容器一样,当容器消亡的时候,容器存储层也随之消失,保存在容器存储层的信息也会随着容器的删除而丢失。

按照Docker最佳实践的要求,容器不应该像向其存储层存储任何的数据,容器存储层要保证无状态化。所有文件的写入操作,应该使用数据卷(Volume)、或者绑定宿主机目录,在这些位置的读写会跳过容器存储层,直接对宿主机进行读写,其性能和稳定性更高。


数据卷的生命周期独立于容器,容器消亡,其数据卷不会消亡,还可以被其他容器使用,在实际项目中,存在着多个容器使用同一个数据卷的情况。