(三)镜像、容器 和 联合文件系统(Union File System)

时间:2022-06-01 20:27:59

为了理解镜像和容器两者的关系,我们需要解释一项Docker的关键技术——UFS(有时简称为union mount)。Union文件系统允许多个文件系统堆叠,在用户看来是一个单独的文件系统。目录中可能包含来自多个文件系统的文件,但是如果两个文件有相同的路径,最后挂载的文件将隐藏之前的文件。Docker支持几种不同的UFS实现,包括AUFS、Overlay、devicemapper、BTRFS和ZFS。哪一个被用看系统需要并且可以通过运行 docker info来检查,在“Storage Driver”下列出。改变文件系统是有可能的,但是只建议在你知道自己正在做什么并知道这样做的利弊的情况下操作。

ubuntu@ubuntu:~$ docker info
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 5
Server Version: 1.10.2
Storage Driver: aufs
Root Dir: /var/lib/docker/aufs

Docker镜像由多层组成。每一层都是一个只读的文件系统,层是由Dockerfile中的指令创建并放在上一层的顶层,当一个镜像被转换为一个容器(来自docker run 或 docker create 命令),Docker引擎使用这个镜像并在顶部添加一个读写文件系统(和初始化各种设置一样比如IP地址、名字、ID和资源限制)。

因为不必要的层会让镜像变大(并且AUFS文件系统有一个127层的限制),你将注意到很多Dockerfiles试着最小化层数,通过将不同的UNIX命令放在一个单独的RUN指定中来实现。

容器可以属于以下状态:已创建、重启中、运行中、暂停或退出(created, restarting, running, paused, or exited)。“created”状态的容器是使用docker create命令初始化但还没有启动。退出状态通常被称为停止并表明在容器内没有正在运行的进程 (这也符合于“created”容器,但退出的容器至少被启动一次了。)容器在它的主进程退出时退出。退出的容器能使用 docker start命令重新启动。一个停止的容器和镜像是不一样的,停止的容器会记住设置的改变,metadata元数据和文件系统,包括正在运行的配置比如IP地址没有存储在镜像中。重启状态在现实中很少看到,当Docker引擎试图重启一个失败的容器时会发生。