镜像
Docker 通过镜像来创建容器。镜像是文件,它包含两类数据:
- 用于创建容器的文件;
- 镜像的元数据,包括 标签、环境变量、默认的执行上下文、镜像的命令历史记录等。
每个镜像都有全局唯一的标识符,更改镜像后标识符也会跟着变更。
命名仓库
命名仓库是一个网络服务,用于注册存放镜像文件。可以通过一个 仓库名称 来获取对应的镜像。仓库名称类似 URL,结构为:
<主机名>/<用户名或组织名>/<镜像简称>
如:"docker.io/dockerinaction/ch3_hello_registry"
一个仓库名称可以有多个版本的镜像,可通过镜像标签去标记。
镜像标签
标签既可以用来唯一标识镜像,也可以用来创建有用的别名。标签只能作用于单个镜像,而镜像可以有多个别名。
安装镜像
通常有三种方式来安装镜像:
- 从 Docker Hub 或私有的仓库注册表直接拉取镜像;
- 从文件中加载镜像;
- 在项目中使用 Dockerfile 来构建镜像。
可以通过 docker login
及 docker logout
来登录登出 Docker Hub 或私有的注册表,用以后续发布镜像。
在未指定注册表时执行 docker pull
或 docker run
等命令,Docker 默认会从 Docker Hub 获取镜像。
拉取及删除镜像:
# 地址形式:`[仓库主机名[:端口]/][用户名/]名称[:标签]`
docker pull quay.io/dockerinaction/ch3_hello_registry:latest
docker rmi quay.io/dockerinaction/ch3_hello_registry
docker pull
为docker image pull
的别名;docker rmi
为docker image rm
的别名,支持传入多个镜像,用空格隔开。
可以用 docker save
将镜像保存为文件,其中 -o
指定了输出的文件地址:
docker pull busybox:latest
docker save -o myfile.tar busybox:latest
可以用 docker load
从文件中加载并安装镜像,同样,-i
指定输入的文件地址:
docker load -i myfile.tar
使用项目中编写的 Dockerfile 来构建镜像:
git clone https://github.com/dockerinaction/ch3_dockerfile.git
docker build -t dia_ch3/dockerfile:latest ch3_dockerfile
镜像层级
通常谈论到的"镜像"实际上是多个镜像层级的集合。比如一个 app
镜像的实际层级可能是这样的:
[debian] → [openjdk] → [app]
这样的好处在于,如果多个"镜像"中存在相同的层级镜像时,Docker 将不会重复下载公共层级。
默认情况下,docker images
仅显示镜像。而如果制定了 -a
选项,输出列表将会包括已安装的层级镜像。
容器文件系统
在
docker run
中可以用--rm
选项来在容器退出时自动删除容器。
Docker 通过 联合文件系统 UFS 实现容器文件系统的隔离,它采用了写时复制(copy-on-write)的模式。从容器的角度看,它具有镜像提供的文件的专有副本。
其他有用的工具包括 MNT 命名空间和 chroot 系统调用。当 Docker 创建容器时,新容器会有自己的 MNT 命名空间,并挂载到镜像上。其次 chroot 会使镜像文件系统的根成为容器环境中的根,这样可以防止容器中的程序引用到主机文件系统的其他部分。