Docker镜像是Docker中三大概念之一,其主要作用是作为启动容器的模板。
一、下载镜像
#1.含义
镜像是运行容器的模板,官方Docker Hub 仓库已经提供了许多镜像共开发者使用。如果我们需要获取某个镜像则可以去Docker仓库下载所需的镜像。
#2.格式:
docker pull [指定仓库URL]/[命名空间]/[镜像名称]:[镜像版本ID]
默认情况下:镜像URL是:docker.io, 命名空间名称:library
#3.实例:
[root@m01 ~]# docker pull centos:7.9.2009
7.9.2009: Pulling from library/centos
2d473b07cdd5: Pull complete
Digest: sha256:0f4ec88e21daf75124b8a9e5ca03c37a5e937e0e108a255d890492430789b60e
Status: Downloaded newer image for centos:7.9.2009
docker.io/library/centos:7.9.2009
下载的时候,我们可以看到有若干层组成,像afb6ec6fdc1c这样的字符串是层的唯一ID(实际上,完整的ID包括256比特, 64个十六进制字符组成)。使用docker pull 命令下载中会获取并输出镜像的各层信息。当不同的镜像包括相同的层的时候,本地仅存一份内容,减小存储空间。
二、查看镜像信息
镜像主要包括镜像文件、镜像tag以及镜像详细信息等等。
1.查看镜像列表
使用docker images 或 docker images ls命令可以列举本地主机上已有镜像的基本信息。
#1.格式:
docker image ls 或者 docker images
#2.实例:
[root@m01 ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest ae2feff98a0c 3 weeks ago 133MB
centos 7.9.2009 8652b9f0cb4c 8 weeks ago 204MB
或者
[root@m01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest ae2feff98a0c 3 weeks ago 133MB
centos 7.9.2009 8652b9f0cb4c 8 weeks ago 204MB
#3.参数:
-a : 列出系统临时镜像文件
--digests=true|false : 列出系统镜像摘要
-q : 只显示镜像ID
2.字段信息
列举信息中,可以看到几个字段信息:
1)镜像来源:来自哪个仓库,默认来自:hub.docker.com
2)镜像标签:比喻1.17、1000-teach-2020-10-28-13-40-27
3)镜像ID:例如22fdec3d9a6d
4)镜像创建时间:例如:3 weeks ago
5)镜像大小:127MB
其中镜像的ID信息十分重要,它唯一标识了镜像。在使用镜像ID的时候,一般可以使用该ID的前若干个字符组成的可区分串来替代完整的ID。
TAG信息用于标记来自同一个仓库的不同镜像。TAG在同一个仓库中是唯一的。
镜像大小信息只是表示了该镜像的逻辑体积大小,实际上由于相同的镜像层本地只会存储一份,物理上占用的存储空间会小于各镜像逻辑体积之和。
3.查看镜像详细信息
使用docker inspect 命令获取镜像的详细信息,包括PID、作者、架构等等。
#1.格式:
docker inspect [镜像名称]:[版本号] | [镜像ID]
#2.实例:
[root@m01 ~]# docker inspect 8652b9f0cb4c
[
{
"Id": "sha256:8652b9f0cb4c0599575e5a003f5906876e10c1ceb2ab9fe1786712dac14a50cf",
"RepoTags": [
"centos:7.9.2009"
],
... ...
三、镜像tag
为了方便后续工作中使用特定的镜像,还可以使用docker tag命令来为本地的镜像添加标签。
#1.格式
docker tag [镜像ID] [别名]:[版本号]
#2.示例:
[root@m01 ~]# docker tag ae2feff98a0c registry.cn-hangzhou.aliyuncs.com/alvinos/test-nginx:v1
[root@m01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest ae2feff98a0c 3 weeks ago 133MB
registry.cn-hangzhou.aliyuncs.com/alvinos/test-nginx v1 ae2feff98a0c 3 weeks ago 133MB
centos 7.9.2009 8652b9f0cb4c 8 weeks ago 204MB
四、推送仓库
#1.格式:
docker push [镜像名称及版本号]
#2.示例:
[root@docker ~]# docker push registry.cn-hangzhou.aliyuncs.com/linux_yuncloud/test-nginx:v1
The push refers to repository [registry.cn-hangzhou.aliyuncs.com/alvinos/test-nginx]
4eaf0ea085df: Pushed
2c7498eef94a: Pushed
7d2b207c2679: Pushed
5c4e5adc71a8: Pushed
87c8a1d8f54f: Pushed
v1: digest: sha256:13e4551010728646aa7e1b1ac5313e04cf75d051fa441396832fcd6d600b5e71 size: 1362
五、登录远程仓库
#1.格式:
docker login [参数] [仓库URL(默认使用docker.io)]
#2.示例:
[root@docker ~]# docker login registry.cn-hangzhou.aliyuncs.com
Username: jhno1
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
六、查看镜像历史
#1.格式:
docker history [镜像名称或ID]
#2.示例:
[root@docker ~]# docker history 8652b9f0cb4c
IMAGE CREATED CREATED BY SIZE COMMENT
8652b9f0cb4c 10 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 10 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 10 months ago /bin/sh -c #(nop) ADD file:b3ebbe8bd304723d4… 204MB
#3.作用:
查看镜像构建步骤。
#4.注意:
有些构建信息过长,可以使用--no-trunc选项来输出完整信息。
七、搜索镜像
在docker中搜索镜像主要使用Search子命令,默认只搜索Docker Hub官方镜像仓库中的镜像。
#1.格式:
docker search [参数] [镜像名称]
#2.示例
# 搜索官方提供的带有Redis关键字的镜像
[root@docker ~]# docker search -f is-official=true redis
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
redis Redis is an open source key-value store that… 8779 [OK]
# 搜索被收藏超过8000个的并且关键词包括Redis的镜像
[root@docker ~]# docker search -f stars=8000 redis
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
redis Redis is an open source key-value store that… 8779 [OK]
[root@docker ~]# docker search -f stars=8 --limit 3 redis
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
redis Redis is an open source key-value store that… 8779 [OK]
bitnami/redis Bitnami Redis Docker Image 167 [OK]
rediscommander/redis-commander Alpine image for redis-commander - Redis man… 47 [OK]
[root@docker ~]# docker search -f stars=8 --limit 3 --no-trunc redis
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
redis Redis is an open source key-value store that functions as a data structure server. 8779 [OK]
bitnami/redis Bitnami Redis Docker Image 167 [OK]
rediscommander/redis-commander Alpine image for redis-commander - Redis management tool. 47 [OK]
#3.解释:
NAME : 镜像名称
DESCRIPTION : 镜像简介
STARS : 收藏数
OFFICIAL : 是否是官方镜像
AUTOMATED : 是否是自构建镜像
#4.参数:
-f: 过滤 is-official=true
--no-trunc : 不截断输出
--limit : 设置查询的条数
八、删除镜像和清理镜像
1.删除镜像
在docker中,删除镜像主要使用rmi子命令,使用docker rmi 或docker image rm命令可以删除镜像。
#1.格式:
docker rmi [镜像名称或ID]
#2.示例:
[root@docker ~]# docker rmi redis
Untagged: redis:latest
Untagged: redis@sha256:5b98e32b58cdbf9f6b6f77072c4915d5ebec43912114031f37fa5fa25b032489
[root@docker ~]# docker rmi -f redis
Untagged: redis:latest
Untagged: redis@sha256:5b98e32b58cdbf9f6b6f77072c4915d5ebec43912114031f37fa5fa25b032489
#3.参数:
-f : 强制删除镜像
2.清理镜像
使用一段时间之后,docker会产生很多临时文件,以及一些没有被使用的镜像,在docker中,清理镜像主要使用prune子命令。
#1.格式:
docker image prune [参数]
#2.示例:
# 查看原来的镜像
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myredis latest 74d107221092 19 hours ago 104MB
redis latest 74d107221092 19 hours ago 104MB
registry.cn-hangzhou.aliyuncs.com/alvinos/teach 1000-teach-2020-10-28-13-40-27 22fdec3d9a6d 3 weeks ago 1.02GB
Nginx
# 删除所有的未被使用的镜像
[root@docker ~]# docker image prune -a
WARNING! This will remove all images without at least one container associated to them.
Are you sure you want to continue? [y/N] y
Deleted Images:
untagged: nginx:1.17
...
Total reclaimed space: 231MB
[root@docker ~]# docker image prune -a -f
Deleted Images:
untagged: registry.cn-hangzhou.aliyuncs.com/alvinos/swoole:latest
...
untagged: nginx:latest
参数:
-a : 删除所有未被使用的镜像
-f : 是否需要提示
九、构建镜像
构建镜像一般有三种情况,基于容器导入、基于本地模板导入、基于Dockerfile创建,本章主讲基于容器保存镜像和本地保存镜像导入。
1.基于容器保存镜像
commit保存镜像针对的是保存容器。
#1.格式:
docker commit [参数] [容器ID] [镜像名称:版本号]
#2.示例:
[root@docker ~]# docker commit -m '这是一个CentOS' -a "xxx" -p d92bbdfc3273
sha256:a6980fb4e70c206b9e9ce03d4cb8e03bf0a2af305aca0c4468e841c9c0ad2e0d
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> a6980fb4e70c 4 seconds ago 209MB
#3.参数:
-m : 简介信息
-a : 指定作者
-p : 保存镜像时,镜像暂停运行(挂起)
2.基于本地模板导入
用户也可以将保存的镜像传到另一台机器上,另一台机器就可以直接导入。
[root@docker ~]# cat ubuntu-18.04-x86_64-minimal.tar.gz | docker import - ubuntu:18.04
十、保存镜像
有时我们需要将一台电脑上的镜像复制到另一台电脑上使用,除了可以借助仓库外,还可以直接将镜像保存成一个文件,再拷贝到另一台电脑上导入使用。
对于镜像的导出和导入,Docker 提供了两种方案,下面分别进行介绍。
1.使用 export 和 import
export 和 import的针对点是容器,将本机的容器导出为镜像包。
#1.格式:
docker export [容器名称] > [压缩包名称]
docker import [压缩包名称] [镜像名称]
#2.示例
#使用export保存容器为镜像
[root@instance-gvpb80ao docs]# docker export daf9c3656be3 > nginx.tar
[root@instance-gvpb80ao docs]# ll | grep nginx.tar
-rw-r--r-- 1 root root 135117824 9月 24 20:51 nginx.tar
#使用import导入包为镜像
[root@instance-gvpb80ao docs]# docker import nginx.tar test/nginx:v1
sha256:02107323de1b074c5d2034b01eff855fec5922b45776c2721882d100ba6dd15b
[root@instance-gvpb80ao docs]# docker images | grep test
test/nginx v1 02107323de1b 22 seconds ago 131MB
2.使用 load 和 save
save 和 load的针对的点是镜像,将本机的镜像导入、导出为镜像包。
#1.格式:
docker save [镜像ID...] > [压缩包名称]
docker load < [压缩包名称]
注:使用镜像ID保存镜像时,导入时没有名称
#2.示例
#使用save保存镜像
[root@instance-gvpb80ao docs]# docker save 6858809bf669 > busybox.tar
[root@instance-gvpb80ao docs]# ll | grep busy
-rw-r--r-- 1 root root 1458176 9月 24 21:01 busybox.tar
#使用save保存多个镜像
[root@instance-gvpb80ao docs]# docker save -o test.tar busybox nginx:1.18.0
[root@instance-gvpb80ao docs]# docker load < test.tar
Loaded image: busybox:latest
Loaded image: nginx:1.18.0
#使用load导入镜像
[root@instance-gvpb80ao docs]# docker load < busybox.tar
[root@instance-gvpb80ao docs]# docker load -i busybox.tar
Loaded image ID: sha256:6858809bf669cc5da7cb6af83d0fae838284d12e1be0182f92f6bd96559873e3
[root@instance-gvpb80ao docs]# docker images | grep 685880
busybox latest 6858809bf669 2 weeks ago 1.23MB
3.两种方案的差别
1、针对的对象不一样
export和import针对的是容器,save和load针对的是镜像
2、save是完全保存, export是部分保存
3.文件大小不同
export导出的镜像文件体积小于 save 保存的镜像
4.是否可以对镜像重命名
docker import可以为镜像指定新名称,docker load不能对载入的镜像重命名。
5.是否可以同时将多个镜像打包到一个文件中
docker export不支持,docker save支持。
6.是否包含镜像历史
save保存的是原生的镜像,export保存成一个新的镜像
export 导出(import 导入)是根据容器拿到的镜像,再导入时会丢失镜像所有的历史记录和元数据信息(即仅保存容器当时的快照状态),所以无法进行回滚操作。
save 保存(load 加载)的镜像,没有丢失镜像的历史,可以回滚到之前的层(layer)。
[root@instance-gvpb80ao docs]# docker history 6858809bf669cc5da7cb6af83d0fae838284d12e1be0182f92f6bd96559873e3
IMAGE CREATED CREATED BY SIZE COMMENT
6858809bf669 2 weeks ago /bin/sh -c #(nop) CMD ["sh"] 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ADD file:72be520892d0a903d… 1.23MB
7.应用场景不同
save应用场景在部署或者需要追溯的场景中,export应用场景在作为基础镜像时使用.
docker export的应用场景:主要用来制作基础镜像,比如我们从一个 ubuntu 镜像启动一个容器,然后安装一些软件和进行一些设置后,使用 docker export保存为一个基础镜像。然后,把这个镜像分发给其他人使用,比如作为基础的开发环境。
docker save的应用场景:如果我们的应用是使用docker-compose.yml编排的多个镜像组合,但我们要部署的客户服务器并不能连外网。这时就可以使用docker save将用到的镜像打个包,然后拷贝到客户服务器上使用docker load载入。