第七章 Docker镜像的使用

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载入。
posted @ 2021-09-13 14:17  年少纵马且长歌  阅读(138)  评论(0编辑  收藏  举报