Docker 镜像操作
获取镜像
一般镜像通过 Docker Hub 来获取。
搜索镜像
通过 docker search
命令可以搜索公共仓库 Docker Hub 中的镜像:
[root@server4 ~]$ docker search python
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
python Python is an interpreted, 6632 [OK]
pypy PyPy is a fast, compliant 290 [OK]
nikolaik/python-nodejs Python with Node.js 86 [OK]
搜索结果以 STARS 排序,默认显示 25 个结果。其字段说明如下:
- NAME:镜像名称。
- DESCRIPTION:创建者对镜像的简单描述。
- STARS:镜像在官方镜像仓库中受欢迎程度。
- OFFICIAL:是否由 Docker 官方提供。
- AUTOMATED:镜像是否使用了自动构建。
设置搜索结果数目限制到 100 个:
[root@server4 ~]$ docker search --limit 100 centos
使用 --filter
参数来限制搜索结果只显示官方构建的 nginx
镜像:
[root@server4 ~]$ docker search --filter=is-official=true nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 15666 [OK]
过滤收藏数小于 10 的镜像:
[root@server4 ~]$ docker search --filter=stars=10 linux
拉取镜像
在运行 Docker 容器之前,需要在本地获取相应的镜像,可以使用 docker pull
命令进行镜像拉取。
例如,从 Docker Hub 拉取 Ubuntu 18.04
系统的基础镜像:
[root@server4 ~]$ docker pull ubuntu:18.04
18.04: Pulling from library/ubuntu
284055322776: Pull complete
Digest: sha256:0fedbd5bd9fb72089c7bbca476949e10593cebed9b1fb9edf5b79dbbacddd7d6
Status: Downloaded newer image for ubuntu:18.04
docker.io/library/ubuntu:18.04
Docker 利用镜像的分层机制,将镜像分为多个包进行下载。当所有镜像层的下载和解压等操作完成后,镜像会出现在本地镜像仓库中。
如果不指定标签,默认使用 latest 标签。例如,从网易镜像站下载最新版本的 Ubuntu
镜像:
[root@server4 ~]$ docker pull hub-mirror.c.163.com/public/ubuntu
此外,可以使用 -a
参数一次性下载所有标签版本的镜像。
管理镜像
镜像管理命令和容器管理命令类似。
创建镜像
可以使用 docker commit
将容器转换为镜像,以保存容器中所做的更改:
[root@server4 ~]$ docker commit c238293 newimage:v1
sha256:392f66f55bace6d10def28028edc90eebc3bb1e23e8e30a030aeb8f96e98ac8e
[root@server4 ~]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
newimage v1 392f66f55bac 4 seconds ago 63.1MB
这种手动创建镜像的方法容易出错且可重复性较差,因此最好使用 docker build
命令结合 Dockerfile 来构建镜像。
默认情况下,docker build
命令会自动在指定目录下查找名为 Dockerfile 的文件,并使用该文件进行构建。也可以通过 -f
参数指定要使用的文件名:
[root@server4 ~]$ vi Dockerfile
FROM ubuntu:18.04
CMD echo "Hello Dockerfile"
[root@server4 ~]$ docker build .
Sending build context to Docker daemon 5.938MB
Step 1/2 : FROM ubuntu:18.04
---> 5a214d77f5d7
Step 2/2 : CMD echo "Hello Dockerfile"
---> Running in 2fe4d2fa8be2
Removing intermediate container 2fe4d2fa8be2
---> 4e73bed1428a
Successfully built 4e73bed1428a
[root@server4 ~]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 4e73bed1428a 12 seconds ago 63.1MB
[root@server4 ~]$ docker run --rm 4e73
Hello Dockerfile
使用 -t
参数可以指定构建镜像的名称和标签:
[root@server4 ~]$ docker build -t assassing/redis:2.3 .
删除镜像
要删除本地镜像,可以使用 docker rmi
命令。如果一个镜像有多个标签,只有在最后一个标签被删除时,镜像才会被真正删除:
[root@server4 ~]$ docker rmi 5a214d77
Error response from daemon: conflict: unable to delete 5a214d77f5d7 (must be forced) - image is referenced in multiple repositories
[root@server4 ~]$ docker rmi base:1.0
Untagged: base:1.0
如果镜像中包含与其他镜像共享的镜像层,那些层将被保留下来,只删除未被使用的层。
当镜像被容器使用时,可以使用 -f
参数强制删除镜像:
[root@server4 ~]$ docker rmi -f nginx
Untagged: nginx:latest
Untagged: nginx@sha256:644a70516a26004c97d0d85c7fe1d0c3a67ea8ab7ddf4aff193d9f301670cf36
但是,强制删除镜像不会自动停止或删除使用该镜像的容器,这可能会导致一些难以处理的问题。最好先停止或清理使用该镜像的容器,然后再删除镜像。
清理镜像
要清理系统中残留的临时镜像文件或未使用的镜像,可以使用 docker image prune
命令进行清理:
[root@server4 ~]$ docker image prune
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y
Total reclaimed space: 0B
导出镜像
要导出镜像,可以使用 docker save
命令。例如,将 alpine
镜像导出到本地的 a.tar
文件:
[root@server4 ~]$ docker images alpine
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine latest 14119a10abf4 7 weeks ago 5.6MB
[root@server4 ~]$ docker save -o a.tar alpine
[root@server4 ~]$ ll a.tar
-rw-------. 1 root root 5874688 Oct 20 23:22 a.tar
也可以使用输出重定向将导出内容保存到指定文件:
[root@server4 ~]$ docker save alpine > a1.tar
可以一次将多个镜像导出到单个文件中:
[root@server4 ~]$ docker save -o docker.tar alpine hello-world
导入镜像
可以使用 docker load
命令从文件中导入镜像:
[root@server4 ~]$ docker load -i docker.tar
e2eb06d8af82: Loading layer [========================================>] 5.865MB/5.865MB
Loaded image: alpine:latest
e07ee1baac5f: Loading layer [========================================>] 14.85kB/14.85kB
Loaded image: hello-world:latest
也可以使用输入重定向符号从文件中导入镜像:
[root@server4 ~]$ docker load < 2.tar
2653d992f4ef: Loading layer [==================================================>] 216.5MB/216.5MB
Loaded image ID: sha256:300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55
查询镜像
镜像以分层文件的形式存储在文件系统中。
查询镜像列表
使用 docker images
命令可以列出本地镜像列表:
[root@server4 ~]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 18.04 5a214d77f5d7 2 weeks ago 63.1MB
hello-world latest feb5d9fea6a5 3 weeks ago 13.3kB
结果显示字段的含义如下:
- REPOSITORY: 镜像名或镜像来源仓库。如果有 Namespace,也会一同显示。
- TAG: 镜像标签,用于标记不同的版本信息。
- IMAGE ID: 镜像的 ID,也是镜像的唯一标识。可以使用前几个字符代替完整的 ID。
- CREATED: 镜像的创建时间。
- SIZE: 镜像的大小,包括共享的镜像层。实际占用的存储空间可能较小。
可以使用通配符来过滤镜像列表:
[root@server4 ~]$ docker images ubu*
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 18.04 5a214d77f5d7 2 weeks ago 63.1MB
查询镜像详情
可以使用 docker inspect
命令获取镜像的详细信息:
[root@server4 ~]$ docker inspect ubuntu:18.04
[
{
"Id": "sha256:5a214d77f5d747e6ed81632310baa6190301feeb875cf6bf9da560108fa09972",
"RepoTags": [
"base:1.0",
"ubuntu:18.04"
],
"RepoDigests": [
"ubuntu@sha256:0fedbd5bd9fb72089c7bbca476949e10593cebed9b1fb9edf5b79dbbacddd7d6"
],
也可以通过镜像的 ID 进行查询:
[root@server4 ~]$ docker inspect 5a21
查询结果以 JSON 格式返回,可以使用输出格式化工具进行过滤:
[root@server4 ~]$ docker inspect -f {{".ContainerConfig.Hostname"}} alpine
330289c649db
查询镜像修改历史
可以使用 docker history
命令查看镜像的每一层具体内容:
[root@server4 ~]$ docker history --no-trunc alpine
IMAGE CREATED CREATED BY SIZE COMMENT
14119a10abf4 7 weeks ago /bin/sh -c #(nop) CMD ["/bin/sh"] 0B
<missing> 7 weeks ago /bin/sh -c #(nop) ADD file:aad4290d 5.6MB
操作镜像
涉及到镜像操作的内容包括镜像改名和上传镜像。
镜像改名
可以使用 docker tag
命令为本地镜像添加标签,并删除原始镜像,从而实现改名的目的。
例如,为 ubuntu:18.04
镜像添加一个新标签 base:1.0
:
[root@server4 ~]$ docker tag ubuntu:18.04 base:1.0
[root@server4 ~]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
base 1.0 5a214d77f5d7 2 weeks ago 63.1MB
ubuntu 18.04 5a214d77f5d7 2 weeks ago 63.1MB
hello-world latest feb5d9fea6a5 3 weeks ago 13.3kB
现在可以看到多了一个名为 base:1.0
的镜像,其镜像 ID 与 ubuntu:18.04
相同。通过添加标签,类似于创建文件的硬链接。
上传镜像
要将镜像上传到仓库,可以使用 docker push
命令。在上传之前,需要为目标镜像打上标签。如果要上传到 Docker Hub,则目标镜像的命名空间为用户的用户名;如果要上传到私有仓库,则命名空间变为仓库的地址:
[root@server4 ~]$ docker tag alpine:latest assassing/a1:latest
[root@server4 ~]$ docker push assassing/a1:latest
The push refers to repository [docker.io/assassing/a1]
e2eb06d8af82: Mounted from library/alpine
latest: digest: sha256:69704ef328d05a9f806b6b8502915e6a0a4faa4d72018dc42343f511490daf8a size: 528