Docker构建镜像的方式有多种,先介绍下最常用的两种
docker commit
命令,基于一个已存在的容器构建出镜像。Dockerfile
文件,并使用docker build
命令来构建镜像。通过docker commit来构建一个镜像,命令的格式为docker commit [选项] [<仓库名>[:<标签>]]。
具体步骤如下:
docker ps
获取需要构建镜像的容器 ID 08cd43c7e50d
。docker pause 08cd43c7e50d
暂停08cd43c7e50d
容器的运行。docker commit 08cd43c7e50d redis:test
,基于容器 ID 08cd43c7e50d
构建 Docker 镜像。docker images redis:test
,查看镜像是否成功构建。这种镜像构建方式通常用在下面两个场景中:
除了这两种场景,不建议你使用docker commit来构建生产现网环境的镜像。主要原因有两个:
docker build的命令格式为:docker build [OPTIONS] PATH | URL | -
PATH、URL、-
指出了构建镜像的上下文(context),context 中包含了构建镜像需要的Dockerfile文件和其他文件。
-f :指定要使用的Dockerfile路径;
-t :指定镜像的名字及标签
例如:
$ docker build -f /path/to/a/Dockerfile -t ubuntu:v1 .
和用docker commit
构建镜像的方式相比,它有三个好处:
以下为本方法的附加内容,可不看。
执行docker build后的构建流程为:
第一步,docker build会将 context 中的文件打包传给 Docker daemon。如果 context 中有.dockerignore
文件,则会从上传列表中删除满足.dockerignore
规则的文件。
.dockerignore
文件中有.dockerignore
或者Dockerfile
,docker build
命令在排除文件时会忽略掉这两个文件。如果指定了镜像的 tag,还会对 repository 和 tag 进行验证。第二步,docker build
命令向 Docker server
发送 HTTP 请求,请求 Docker server
构建镜像,请求中包含了需要的 context 信息。
第三步,Docker server
接收到构建请求之后,会执行以下流程来构建镜像:
为了提高构建效率,docker build
默认会缓存已有的镜像层。如果构建镜像时发现某个镜像层已经被缓存,就会直接使用该缓存镜像,而不用重新构建。如果不希望使用缓存的镜像,可以在执行docker build
命令时,指定--no-cache=true
参数。
Docker 匹配缓存镜像的规则为:遍历缓存中的基础镜像及其子镜像,检查这些镜像的构建指令是否和当前指令完全一致,如果不一样,则说明缓存不匹配。对于ADD
、COPY
指令,还会根据文件的校验和(checksum)来判断添加到镜像中的文件是否相同,如果不相同,则说明缓存不匹配。
这里要注意,缓存匹配检查不会检查容器中的文件。比如,当使用RUN apt-get -y update
命令更新了容器中的文件时,缓存策略并不会检查这些文件,来判断缓存是否匹配。
最后,可以通过docker history
命令来查看镜像的构建历史。
docker save用来将镜像保存为一个 tar 文件,docker load用来将 tar 格式的镜像文件加载到当前机器上。
docker save [OPTIONS] IMAGE [IMAGE...]
OPTIONS 说明:
-o :输出到的文件。
例如:
docker save -o my_ubuntu_v3.tar ubuntu:v3
docker load [OPTIONS]
OPTIONS 说明:
--input , -i : 指定导入的文件。
--quiet , -q : 精简输出信息。
例如:
docker load --input my_ubuntu_v3.tar
使用 docker export 命令根据容器 ID 将镜像导出成一个tar文件。
docker export [OPTIONS] CONTAINER
例如:将id为a404c6c174a2的容器按日期保存为tar文件。如下:
docker export -o mysql-'date +%Y%m%d'.tar a404c6c174a2
使用 docker import 命令则可将这个镜像文件导入进来。
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
例如:从镜像归档文件my_ubuntu_v3.tar创建镜像,命名为ubuntu:v4。如下
docker import my_ubuntu_v3.tar ubuntu:v4