今天我将围绕 Docker 核心概念镜像展开,首先重点讲解一下镜像的基本操作,然后介绍一下镜像的实现原理。首先说明,咱们本课时的镜像均指 Docker 镜像。
你是否还记得镜像是什么?我们先回顾一下。
镜像是一个只读的 Docker 容器模板,包含启动容器所需要的所有文件系统结构和内容。简单来讲,镜像是一个特殊的文件系统,它提供了容器运行时所需的程序、软件库、资源、配置等静态数据。即镜像不包含任何动态数据,镜像内容在构建后不会被改变。
然后我们来看下如何操作镜像。
镜像操作
图 1 镜像操作
从图中可知,镜像的操作可分为:
- 拉取镜像,使用docker pull命令拉取远程仓库的镜像到本地
- 重命名镜像,使用docker tag命令“重命名”镜像
- 查看镜像,使用docker image ls或docker images命令查看本地已经存在的镜像
- 删除镜像,使用docker rmi命令删除无用镜像
构建镜像,构建镜像有两种方式:
- 第一种方式是使用docker build命令基于 Dockerfile 构建镜像,也是我比较推荐的镜像构建方式
- 第二种方式是使用docker commit命令基于已经运行的容器提交为镜像
下面,我们逐一详细介绍。
拉取镜像
Docker 镜像的拉取使用docker pull命令, 命令格式一般为 docker pull [Registry]/[Repository]/[Image]:[Tag]。
- Registry 为注册服务器,Docker 默认会从 docker.io 拉取镜像,如果你有自己的镜像仓库,可以把 Registry 替换为自己的注册服务器。
- Repository 为镜像仓库,通常把一组相关联的镜像归为一个镜像仓库,library为 Docker 默认的镜像仓库。
- Image 为镜像名称。
- Tag 为镜像的标签,如果你不指定拉取镜像的标签,默认为latest。
例如,我们需要获取一个 busybox 镜像,可以执行以下命令:
busybox 是一个集成了数百个 Linux 命令(例如 curl、grep、mount、telnet 等)的精简工具箱,只有几兆大小,被誉为 Linux 系统的瑞士军刀。我经常会使用 busybox 做调试来查找生产环境中遇到的问题。
$ docker pull busybox
Using default tag: latest
latest: Pulling from library/busybox
61c5ed1cbdf8: Pull complete
Digest: sha256:4f47c01fa91355af2865ac10fef5bf6ec9c7f42ad2321377c21e844427972977
Status: Downloaded newer image for busybox:latest
docker.io/library/busybox:latest
实际上执行docker pull busybox
命令,都是先从本地搜索,如果本地搜索不到busybox
镜像则从 Docker Hub 下载镜像。
拉取完镜像,如果你想查看镜像,应该怎么操作呢?
查看镜像
Docker 镜像查看使用docker images或者docker image ls命令。下面我们使用docker images命令列出本地所有的镜像。
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 4bb46517cac3 9 days ago 133MB
nginx 1.15 53f3fd8007f7 15 months ago 109MB
busybox latest 018c9d7b792b 3 weeks ago 1.22MB
如果我们想要查询指定的镜像,可以使用docker image ls
命令来查询。
$ docker image ls busybox
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 018c9d7b792b 3 weeks ago 1.22MB
当然你也可以使用docker images
命令列出所有镜像,然后使用grep
命令进行过滤。使用方法如下:
$ docker images |grep busybox
busybox latest 018c9d7b792b 3 weeks ago 1.22MB
“重命名”镜像
如果你想要自定义镜像名称或者推送镜像到其他镜像仓库,你可以使用docker tag
命令将镜像重命名。docker tag
的命令格式为 docker tag [SOURCE_IMAGE][:TAG] [TARGET_IMAGE][:TAG]。
下面我们通过实例演示一下:
$ docker tag busybox:latest mybusybox:latest
执行完docker tag
命令后,可以使用查询镜像命令查看一下镜像列表:
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 018c9d7b792b 3 weeks ago 1.22MB
mybusybox latest 018c9d7b792b 3 weeks ago 1.22MB
可以看到,镜像列表中多了一个mybusybox
的镜像。但细心的同学可能已经发现,busybox
和mybusybox
这两个镜像的 IMAGE ID 是完全一样的。为什么呢?实际上它们指向了同一个镜像文件,只是别名不同而已。
如果我不需要mybusybox
镜像了,想删除它,应该怎么操作呢?
删除镜像
你可以使用docker rmi
或者docker image rm
命令删除镜像。
举例:你可以使用以下命令删除mybusybox
镜像。
$ docker rmi mybusybox
Untagged: mybusybox:latest
此时,再次使用docker images
命令查看一下我们机器上的镜像列表。
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 018c9d7b792b 3 weeks ago 1.22MB
通过上面的输出,我们可以看到,mybusybox
镜像已经被删除。