Docker入门之使用镜像(二)
前言Docker 中大部分的操作都是围绕三个核心概念:镜像、容器、仓库。如果这三个概念达到融会贯通后,我们也就入门了Docker这门技术,首先让我们学习一下Docker的镜像。什么是Docker镜像Docker镜像相当于一个虚拟机快照,如果你玩过使命召唤系列游戏,每次通关后都可以保存游戏进度(存档快照),Docker镜像我们也可以理解是保存了各种软件的存档快照,Docker官方维护了数以万计的Do
前言
Docker 中大部分的操作都是围绕三个核心概念:镜像、容器、仓库。如果这三个概念达到融会贯通后,我们也就入门了Docker这门技术,首先让我们学习一下Docker的镜像。
什么是Docker镜像
Docker镜像相当于一个虚拟机快照,如果你玩过使命召唤系列游戏,每次通关后都可以保存游戏进度(存档快照),Docker镜像我们也可以理解是保存了各种软件的存档快照,Docker官方维护了数以万计的Docker镜像仓库,仓库地址:https://hub.docker.com/。我们可以通过镜像仓库下载各种相应软件的镜像,无需再像以前一样下载软件然后手动进行各种配置,通过下载镜像我们可以启动应用,简化了开发工作,极大的提高了工作效率。
如何获取镜像
Docker Hub网站上提供了很多常用软件的应用镜像,例如:mysql
、redis
、nginx
、kafka
…,基本上你开发过程中需要使用的软件都有与之对应的镜像。通过docker 提供的pull命令,可以在镜像仓库下载镜像,命令格式为:
docker pull 应用镜像名:版本号
例如获取nginx,我们可以在Docker Hub网站上进行搜索:
也可以通过docker search
命令进行搜索如下所示:
默认搜索出来的镜像源还是比较多可以通过 -f 进行过滤,例如过滤STARS在1000以上的镜像源。
[root@VM-0-10-centos ~]# docker search nginx -f=STARS=1000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 15928 [OK]
jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 2101 [OK]
上面 -f 指定过滤的属性是STARS = 1000 表示查询STARS数量大于等于1000),下面使用docker pull命令以下载这个镜像:
需要指出的是如果下载镜像没有指定相应的版本,则docker默认会下载标签为latest的最新镜像版本。
查看镜像信息
- docker images
使用docker images 命令可以列出所有的下载镜像信息,其命令使用语法如下:
[root@VM-0-10-centos ~]# docker images --help
Usage: docker images [OPTIONS] [REPOSITORY[:TAG]]
List images
Options:
-a, --all Show all images (default hides intermediate images)
--digests Show digests
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print images using a Go template
--no-trunc Don't truncate output
-q, --quiet Only show image IDs
例如查询当前所有的应用镜像:
[root@VM-0-10-centos ~]# docker images -a
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest f652ca386ed1 12 days ago 141MB
属性 | 说明 |
---|---|
REPOSITORY | 标识镜像来自那个仓库 |
TAG | 镜像标签,通常指镜像的版本号 |
IMAGE ID | 标识镜像的唯一性,如果有相同的镜像ID说明两个镜像指向的是同一个镜像只是标签会不同 |
CREATED | 标识镜像构建时间 |
SIZE | 标识镜像的尺寸大小 |
- tag
可以使用此命令为应用镜像新增标签,例如新增标签my-nginx的镜像:
## 使用语法为 docker tag IMAGE ID 标签名
[root@VM-0-10-centos ~]# docker tag f652ca386ed1 my-nginx
## 查看所有的镜像信息
[root@VM-0-10-centos ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
my-nginx latest f652ca386ed1 12 days ago 141MB
nginx latest f652ca386ed1 12 days ago 141MB
可以看到新增镜像标签成功,需要注意的是这两个标签对应的镜像ID都是相同的。
- inspect
使用此命令可以查看构建镜像的详细信息,使用语法为 docker inspect 镜像ID。
返回的数据较多,如果只想查看某一个属性可以使用 -f进行过滤,例如获取 RootFS
[root@VM-0-10-centos ~]# docker inspect -f {{".RootFS"}} f652ca386ed1
{layers [sha256:9321ff862abbe8e1532076e5fdc932371eff562334ac86984a836d77dfb717f5 sha256:0664b7821b6050b321b14cdede97c2079ae45aff22beb4a42f7595294f5be62d sha256:c9fcd9c6ced8b793a0ad4f93820c1d51d94c3b1fca93000d93e9e8eefa6fdb38 sha256:d3e1dca44e8225cdd06b6bf7cdfc847e3ab9f09ab6aeefb006e2e8f02f0dd26c sha256:82caad489ad7bc7e1ae6f17bb1e9ade2bca44a41a07cc8c5587af8a2de2f536a sha256:2bed47a66c07ecddfea2bc9c128d81b31272d99b69aff1fb4edc079c4dbf56e7] }
需要注意的是通过两对大括号并且需要在过滤的属性名称加一个.
- history
上面我们下载nginx镜像时候出现了如下的界面:
下载的过程中出现好几个Pull complete 的字样好像是分层进行下载的。需要指出的是docker下载镜像就是分层进行下载的,这样做的好处就是:当不同镜像包含相同的镜像层,那么只需要进行第一次下载,后面的相同的镜像层直接拿来复用即可,我们可以通过history命令查看各个镜像层信息。
删除单个镜像
可以使用docker rmi 命令删除镜像,其使用语法如下:
## 查看Docker镜像删除命令
[root@VM-32-10-centos ~]# docker rmi --help
Usage: docker rmi [OPTIONS] IMAGE [IMAGE...]
Remove one or more images
Options:
-f, --force Force removal of the image
--no-prune Do not delete untagged parents
例如删除标签为my-nginx的镜像如下所示:
[root@VM-0-10-centos ~]# docker rmi my-nginx:latest
Untagged: my-nginx:latest
[root@VM-0-10-centos ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest f652ca386ed1 12 days ago 141MB
需要指出的是这种docker rmi REPOSITORY:TAG
命令只是删除了该镜像指定标签而巳, 并不影响镜像ID相同其他标签文件。 因此上述操作相当于只是删除了镜像 f652ca386ed1 的一个标签副本。但是如果使用的是docker rmi IMAGE ID
这种命令,将会删除所有相同镜像ID的镜像。
## 在此新增标签为my-nginx的文件
[root@VM-0-10-centos ~]# docker tag f652ca386ed1 my-nginx
## 查看所有的镜像文件
[root@VM-0-10-centos ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
my-nginx latest f652ca386ed1 12 days ago 141MB
nginx latest f652ca386ed1 12 days ago 141MB
我们根据镜像ID进行删除:
[root@VM-0-10-centos ~]# docker rmi f652ca386ed1
Error response from daemon: conflict: unable to delete f652ca386ed1 (must be forced) - image is referenced in multiple repositories
使用 -f进行强制删除:
[root@VM-0-10-centos ~]# docker rmi -f f652ca386ed1
Untagged: my-nginx:latest
Untagged: nginx:latest
Untagged: nginx@sha256:9522864dd661dcadfd9958f9e0de192a1fdda2c162a35668ab6ac42b465f0603
Deleted: sha256:f652ca386ed135a4cbe356333e08ef0816f81b2ac8d0619af01e2b256837ed3e
Deleted: sha256:a7edf84b6db27e8ef5d7368c95159120f00a74cee57368e2bc107ee713172699
Deleted: sha256:46893639b5fbc6315531cb197fb4071750508880425c0620d88aae4e483d72c1
Deleted: sha256:afa1ff13852cf0fa5d5ff8cd21c8a21a99c139fc069926cd1316d1ad3d0c7189
Deleted: sha256:831e8983bb6a65130bec4e73bed4bc641bfd6d7c6917be32a483882f70e809b0
Deleted: sha256:d213f9a0e4eef08107f70d94b36f5a41c1437fc68af82ee82eb74de80282130a
Deleted: sha256:9321ff862abbe8e1532076e5fdc932371eff562334ac86984a836d77dfb717f5
[root@VM-0-10-centos ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
这次我们发现当前没有一个nginx镜像存在了。
批量删除镜像
首先我们先下载nginx、tomcat与redis如下所示:
目前我的机器上存有三个镜像查询如下:
[root@VM-0-10-centos ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat latest 24207ccc9cce 5 days ago 680MB
redis latest aea9b698d7d1 11 days ago 113MB
nginx latest f652ca386ed1 12 days ago 141MB
批量删除镜像文件有两种方式:
- 使用$() 表达式进行删除
[root@VM-0-10-centos ~]# docker rmi -f $(docker images -qa)
Untagged: tomcat:latest
Untagged: tomcat@sha256:429d5c140820d5eba38042823501d5f4e0f03b282133513e29c22d6358daa7c7
Deleted: sha256:24207ccc9cce2cb6473cec77e1ec441a7b4e6d0579f4e361899fecfc1019189f
Deleted: sha256:ac4e16d5dfd2ff69bd1794be416c8e419ccd485afa28349ea54358af2412d2f8
Deleted: sha256:6074fd0b4c77dccc686e244fb22f46253f103324dd7f241821c535d669abff30
Deleted: sha256:e193493c6b62c99a0b1d71d35570abdc9659c06a603ef21b3c70eebd2d571080
Deleted: sha256:5ba402d00d241ed90ec1aeddc5f51d2c5fca13680aca609acbdae8394d274fda
Deleted: sha256:d949ff5ab84a822d9dc421efa1cf6182c39242f3fe9c014a84bd8314add2d405
Deleted: sha256:979a578d29c884e195c5d22fc1f056ea123ef6e26330ff546afef6680d1670e0
Deleted: sha256:d8846156f697b208f03e0c543e6a4fc7ad67f1fa1f201cdb98c9ff2183a0acd9
Deleted: sha256:696ddf161baa5116ea358eb43639634d9d74c1377532f6ee28a1b13612299cbd
Deleted: sha256:4248cb0e89f00c8fe152aa329eb0ea85490942d192ff6786af7783dcf3d354a9
Deleted: sha256:e2e8c39e0f77177381177ba8c4025421ec2d7e7d3c389a9b3d364f8de560024f
Untagged: redis:latest
Untagged: redis@sha256:2f502d27c3e9b54295f1c591b3970340d02f8a5824402c8179dcd20d4076b796
Deleted: sha256:aea9b698d7d1d2fb22fe74868e27e767334b2cc629a8c6f9db8cc1747ba299fd
Deleted: sha256:beb6c508926e807f60b6a3816068ee3e2cece7654abaff731e4a26bcfebe04d8
Deleted: sha256:a5b5ed3d7c997ffd7c58cd52569d8095a7a3729412746569cdbda0dfdd228d1f
Deleted: sha256:ee76d3703ec1ab8abc11858117233a3ac8c7c5e37682f21a0c298ad0dc09a9fe
Deleted: sha256:60abc26bc7704070b2977b748ac0fd4ca94b818ed4ba1ef59ca8803e95920161
Deleted: sha256:6a2f1dcfa7455f60a810bb7c4786d62029348f64c4fcff81c48f8625cf0d995a
Untagged: nginx:latest
Untagged: nginx@sha256:9522864dd661dcadfd9958f9e0de192a1fdda2c162a35668ab6ac42b465f0603
Deleted: sha256:f652ca386ed135a4cbe356333e08ef0816f81b2ac8d0619af01e2b256837ed3e
Deleted: sha256:a7edf84b6db27e8ef5d7368c95159120f00a74cee57368e2bc107ee713172699
Deleted: sha256:46893639b5fbc6315531cb197fb4071750508880425c0620d88aae4e483d72c1
Deleted: sha256:afa1ff13852cf0fa5d5ff8cd21c8a21a99c139fc069926cd1316d1ad3d0c7189
Deleted: sha256:831e8983bb6a65130bec4e73bed4bc641bfd6d7c6917be32a483882f70e809b0
Deleted: sha256:d213f9a0e4eef08107f70d94b36f5a41c1437fc68af82ee82eb74de80282130a
Deleted: sha256:9321ff862abbe8e1532076e5fdc932371eff562334ac86984a836d77dfb717f5
[root@VM-0-10-centos ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker images -qa 参数解释:-q 表示只查询镜像的ID,-a表示查询所有的镜像列表。
- 使用xargs
上面的删除镜像的命令等价于如下命令:
docker images -q | xargs docker rmi -f
导出与导入镜像
如果在开发中有需要将镜像文件进行导出,可以使用docker save命令,下面以导出一个nginx的镜像为例子:
## 查询nginx镜像
[root@VM-0-10-centos ~]# docker images | grep nginx
nginx latest f652ca386ed1 2 weeks ago 141MB
将这个上面镜像导出为tar文件:
docker save -o 导出的tar文件名 仓库:标签名
[root@VM-0-10-centos ~]# docker save -o nginx.tar nginx:latest
## 查看刚刚导入的nginx包
[root@VM-0-10-centos ~]# ll
total 142500
-rw------- 1 root root 145917440 Dec 23 00:45 nginx.tar
导入镜像:
docker load -i xx.tar
## 首先删除目前存在的镜像nginx,然后在导入tar包
[root@VM-0-10-centos ~]# docker rmi -f nginx
Untagged: nginx:latest
Untagged: nginx@sha256:9522864dd661dcadfd9958f9e0de192a1fdda2c162a35668ab6ac42b465f0603
## 导入tar包
[root@VM-0-10-centos ~]# docker rmi -f nginx
Untagged: nginx:latest
Untagged: nginx@sha256:9522864dd661dcadfd9958f9e0de192a1fdda2c162a35668ab6ac42b465f0603
## 导入tar包
[root@VM-0-10-centos ~]# docker load -i nginx.tar
Loaded image: nginx:latest
## 查看当前容器中的镜像发现有nginx则证明导入镜像成功
[root@VM-0-10-centos ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
galengao/my-tomcat v1 7a85731c14b2 37 minutes ago 684MB
tomcat latest 24207ccc9cce 13 days ago 680MB
nginx latest f652ca386ed1 2 weeks ago 141MB
清理镜像
使用Docker一段时间后, 系统中可能会遗留一些临时的镜像文件,我们可以通过docker image prune进行清理。
[root@VM-0-10-centos ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@VM-0-10-centos ~]# 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镜像的括查询、查看 搜索、删除、清理等命令,后面会在后续的文章中输出更多的镜像操作内容,例如 上传镜像、生成自己的镜像等。
更多推荐
所有评论(0)