1.3 Docker镜像操作
运行Docker容器前需要在本地存在对应的镜像。如果不存在本地镜像,Docker就会尝试从默认镜像仓库下载。镜像仓库是由Docker官方维护的一个公共仓库,可以满足用户的绝大部分需求。用户也可以通过配置来使用自定义的镜像仓库。
下面具体介绍如何操作Docker镜像。
1.3.1 搜索镜像
在下载镜像前,可以使用docker search命令搜索远端官方仓库中的共享镜像。
命令格式:
docker search 关键字
例如,搜索关键字为lamp的镜像的命令和结果如下:
[root@localhost ~]# docker search lamp
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
linode/lamp LAMPon Ubuntu14.04.1LTSContainer 142
tutum/lamp Out-of-the-box LAMPimage(PHP+MySQL) 90
greyltc/lamp asupersecure,up-to-dateandlightweight L… 76 [OK]
fauria/lamp Modern,developerfriendly LAMPstack.Inclu… 34 [OK]
janes/alpine-lamp lampbaseonalpinelinux 31 [OK]
nickistre/ubuntu-lamp LAMPserveron Ubuntu 25 [OK]
执行docker search lamp命令后,会返回很多包含lamp关键字的镜像,其中,返回信息包括镜像名称(NAME)、描述(DESCRIPTION)、星级(STARS)、是否官方创建(OFFICIAL)、是否主动创建(AUTOMATED)。默认的返回结果会按照星级评价进行排序,表示该镜像的受欢迎程度。在下载镜像时,可以参考星级。在搜索时,还可以使用-s或者--stars=x显示指定星级的镜像,星级越高表示越受欢迎。是否官方创建是指是否由官方项目组创建和维护的镜像。一般官方项目组维护的镜像使用单个单词作为镜像名称,称为基础镜像或者根镜像。如reinblau/lamp这种命名方式的镜像,表示是由docker Hub的用户reinblau创建并维护的镜像,带有用户名作为前缀。是否主动创建是指是否允许用户验证镜像的来源和内容。
使用docker search命令只能查找镜像,不能查找镜像的标签。因此若要查找Docker标签,则需要从网页上访问镜像仓库进行查找。
1.3.2 获取镜像
搜索到符合需求的镜像后,可以使用docker pull命令从网络中下载镜像到本地来使用。
命令格式:
docker pull 仓库名称[:标签]
对于Docker镜像来说,如果下载镜像时不指定标签,默认会下载仓库中最新版本的镜像,即选择标签latest;也可通过指定标签来下载特定版本的某一镜像。这里的标签就是用来区分镜像版本的。
例如,下载镜像nickistre/centos-lamp的命令和结果如下:
[root@localhost ~]# docker pull nickistre/centos-lamp
Using default tag: latest
latest: Pulling from nickistre/centos-lamp
f9f73d801f05: Pull complete
31a920671517: Pull complete
21c34a1a7bde: Pull complete
dc05bf237fc1: Pull complete
001edf96df50: Pull complete
273de3312284: Pull complete
09e0c479c5d6: Pull complete
3274b3252b64: Pull complete
8affd66070d7: Pull complete
b3d0f4e847ac: Pull complete
1b0c18851735: Pull complete
557b86c40b14: Pull complete
bdf3abef29b4: Pull complete
8fab0cd5d21a: Pull complete
4f198432c128: Pull complete
Digest: sha256:6012dff0d5f805342d65e8eb3cae4e83e75bce16980915b165ef55d64866e91d
Status: Downloaded newer image for nickistre/centos-lamp:latest
从整个下载过程可以看出,镜像文件是由若干层(Layer)组成的,称之为AUFS(联合文件系统),它是实现增量保存与更新的基础,下载过程中会输出镜像的各层信息。镜像下载到本地之后就可以随时使用了。
用户也可以选择从其他仓库注册服务器下载镜像,这时需要在仓库名称前指定完整的仓库注册服务器地址。
1.3.3 查看镜像信息
用户可以使用docker images命令查看下载到本地的所有镜像。
命令语法:
docker images 仓库名称:[标签]
例如,查看本地所有镜像的命令和结果如下:
[root@localhost ~]#dockerimages
REPOSITORY TAG IMAGEID CREATED SIZE
nickistre/centos-lamp latest 0b8d572d1c7d 9daysago 547MB
从显示结果可以读出以下信息。
REPOSITORY:镜像所属的仓库。
TAG:镜像的标签信息,用于标记同一个仓库中的不同镜像。
IMAGE ID:镜像的唯一ID号,用于唯一标识一个镜像。
CREATED:镜像的创建时间。
SIZE:镜像大小。
用户还可以根据镜像的唯一标识ID号来获取镜像的详细信息。
命令格式:
docker inspect 镜像ID号
例如,获取镜像nickistre/centos-lamp详细信息的命令和结果如下:
[root@localhost ~]#dockerinspect0b8d572d1c7d
[
{
"Id":"sha256:0b8d572d1c7d20f8b2e86bb92517dd3a9e8f935194c7f48af5dc84984e7c5f44",
"Repo Tags": [
"nickistre/centos-lamp:latest"
],
"Repo Digests": [
"nickistre/centos-lamp@sha256:6012dff0d5f805342d65e8eb3cae4e83e75bce1 6980915b165ef55d64866e91d"
],
"Parent":"",
"Comment":"",
"Created":"2018-04-13T21:01:31.472818372Z",
"Container":"25f7679db9909e1a5f63456ad2297c5eaaa8ca4c4f02991e678fc38af39e8762",
"Container Config":{
"Hostname":"25f7679db990",
"Domainname":"",
"User":"",
"Attach Stdin": false,
"Attach Stdout": false,
"Attach Stderr": false,
"Exposed Ports":{
"22/tcp":{},
"443/tcp":{},
"80/tcp":{}
},
"Tty": false,
"Open Stdin": false,
"Stdin Once": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/sh",
"-c",
"#(nop) ",
"CMD [\"supervisord\"\"-n\"]"
],
"Args Escaped": true,
"Image":"sha256:23865469389846bddf3e091a0484f8e28cad879295c6f8e3a839b05137c079fc",
"Volumes": null,
"Working Dir":"",
"Entrypoint": null,
"On Build": [],
"Labels":{}
},
"Docker Version":"17.06.1-ce",
"Author":"Nicholas Istre <nicholas.istre@e-hps.com>",
"Config":{
"Hostname":"",
"Domainname":"",
"User":"",
"Attach Stdin": false,
"Attach Stdout": false,
"Attach Stderr": false,
"Exposed Ports":{
"22/tcp":{},
"443/tcp":{},
"80/tcp":{}
},
"Tty": false,
"Open Stdin": false,
"Stdin Once": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"supervisord",
"-n"
],
"Args Escaped": true,
"Image":"sha256:23865469389846bddf3e091a0484f8e28cad879295c6f8e3a839b05137c079fc",
"Volumes": null,
"Working Dir":"",
"Entrypoint": null,
"On Build": [],
"Labels": null
},
"Architecture":"amd64",
"Os":"linux",
"Size": 546989824,
"Virtual Size": 546989824,
"Graph Driver":{
"Data":{
"Lower Dir":"/var/lib/Docker/overlay2/3190349f14dfb00484b3df2b583c1ff3cbbe1 0f28b3bf2e3205f97eeca97a2d2/diff:/var/lib/Docker/overlay2/3b92a5d95ab961b46a1f64d1c3e2d6cbb4f2f48c 53492257120507cb5a9184c0/diff:/var/lib/Docker/overlay2/c6a04e6ab18808354f8f1181a9688f6244a5262720 adbcb37bdab787577238a0/diff:/var/lib/Docker/overlay2/df2e479e8390d6b62f9990a624e42fe5f057141e70d3 ab61a1693f810776a511/diff:/var/lib/Docker/overlay2/0121cf919feb549e69315bfc52de3a597b693695a57956 43f6ee4c4a33e2920b/diff:/var/lib/Docker/overlay2/d44724d69cb7ef57bbd5e9f2e485ffbdc925e15b7655c2725 c8c755274c579f7/diff:/var/lib/Docker/overlay2/eb1508dd09067180df68a715a1a3a2d7f0c7747d2198d4498e3 a5bcb92a127ce/diff:/var/lib/Docker/overlay2/faf5653c7540e133652bf1fa9201a274c5b1fb800eaf0c42f4b2e76 de5691e16/diff:/var/lib/Docker/overlay2/8d9dab12d8e3075659d2c304cbefc827f3deb78d7c9ca01710ada2f35
4eebd9c/diff:/var/lib/Docker/overlay2/fc838efeff1c48a239d3850768463000d987ab41a6afb847a83282303472 8790/diff:/var/lib/Docker/overlay2/dbcbc7340caddb26a047117c3921302b596017368c19ea2dc894cd9c397de 126/diff:/var/lib/Docker/overlay2/c6e5f57fdf3438d8254bb987230131aa9c67217e6dc6b075cc5a3a9f235948fc/diff:/var/lib/Docker/overlay2/b960ca6c2ba19fd80417642637ed13c23008c327cd4c3f626a9e765d3090dc09/di ff:/var/lib/Docker/overlay2/38415952835b717d0e9c8653e7e4c36a0d755e9ed769fef172cff683d466d2f1/diff",
"Merged Dir":"/var/lib/Docker/overlay2/
1160863e39056f595d399ca9e645d69c9e5e9164fbc051814be7d65802079e2e/merged",
"Upper Dir":"/var/lib/Docker/overlay2/
1160863e39056f595d399ca9e645d69c9e5e9164fbc051814be7d65802079e2e/diff",
"Work Dir":"/var/lib/Docker/overlay2/
1160863e39056f595d399ca9e645d69c9e5e9164fbc051814be7d65802079e2e/work"
},
"Name":"overlay2"
},
"Root FS":{
"Type":"layers",
"Layers": [
"sha256:da6517724f67fd4133a5bf508f7c79e20d8e2741c5b3264790d49db5e97c0e2e",
"sha256:244de8069fbc70a188607a8dddab80ad8866a4e0bcb0b24f12aef0130ba307f2",
"sha256:988e3cb5a27b1efc0c85c3d9b34b25322de3ce13267d647a869f9150cd3c3f7f",
"sha256:38556f5b76216ba7518d1da1f2ea0c7ac147203833976c5a701fb36d71e17ec6",
"sha256:e6eea089f108513a9af6006efe53cff5ef762bc4be503ce8eaa1c6c726cae2ed",
"sha256:07d45adf0b976b610bfbbc6f9cc30a133d18f69262a9446bc280f542bd17d743",
"sha256:a0753067e202b570fa8c70f86ae2e0510f82f2271a0d5c1db5cbb4f9a9210cc3",
"sha256:9b9518d71f0ef4b967d786f7f40943658362af00b5e9f91f43053619b75bf07b",
"sha256:11ed4ddf1f28ad2857c7b3f17eee8c349fd9011042cf563807493bbddb2f3f46",
"sha256:fa3e2c4d1489e48588c4a08443edb471234a481dd52b341b211909d35e5787ca",
"sha256:f874a4141753cd042dbdcfc0acb48c8239de9a1d42b4902defe79ea6042cfc62",
"sha256:fabd844fa786a84bcd481f617becfbc31b85e927b4b24a56acc5283c1ad5ea76",
"sha256:d31fcd4e52cffcbf6c8ff68a19609d4a7ae56e43f7ad41865dd7b1341ca70977",
"sha256:2ccc0c68e26e5ac575aa7f7822638d547b5a3c703c73c004a40b19388f582bda",
"sha256:385f382ed46ca3e95842ce6074deb140cc11784744882adea64e27a24eeddaa8"
]
},
"Metadata":{
"Last Tag Time":"0001-01-01T00:00:00Z"
}
}
]
为了方便后续工作中使用镜像,可以用docker tag命令为本地的镜像添加新的标签。
命令格式:
docker tag 名称:[标签] 新名称:[新标签]
例如,为本地镜像nickistre/centos-lamp添加新的名称lamp,新的标签lamp:
[root@localhost ~]#dockerimages|greplamp
lamp lamp 0b8d572d1c7d 4weeksago 547MB
nickistre/centos-lamp latest 0b8d572d1c7d 4weeksago 547MB
1.3.4 删除镜像
可以使用docker rmi命令删除多余的镜像。删除镜像有两种方法:使用镜像的标签删除镜像、使用镜像的ID删除镜像。
命令格式:
docker rmi 仓库名称:标签
或者
docker rmi 镜像ID号
例如,要删除lamp:lamp镜像,可以使用如下命令:
[root@localhost ~]# docker rmi lamp:lamp
Untagged: lamp:lamp
[root@localhost ~]# docker images |grep lamp
Docker.io/nickistre/centos-lamp latest a0760f3391932weeksago 534.5MB
当一个镜像有多个标签的时候,docker rmi命令只是删除该镜像多个标签中的指定标签,不会影响镜像文件,相当于只删除了镜像a0760f339193的一个标签。但当该镜像只剩下一个标签的时候,再使用删除命令就会彻底删除该镜像。
例如,删除nickistre/centos-lamp镜像,就会删除整个镜像文件的所有层:
[root@localhost ~]# docker rmi nickistre/centos-lamp
Untagged: nickistre/centos-lamp:latest
Deleted: a0760f339193fa6d729f929e3ef4ab70fa8739b1c2673a8ecb320cbccba7b653
Deleted: 99f6ac576e493ee80a693f1d601bed4e1ea2db7b580def7dbb4e11ed31bde08c
Deleted: 7355fe68d1b010c0bf924be5427f15bcff8c70f3fd1b1836963d5ef8cfefa000
Deleted: 55e4df068ef2ad511aa2ea2c3245c72779dbf7f9de256e17181892ea177d530e
Deleted: 2bbbdf835f5deec4d659c76220cd430911f4dccc965345655ea9209556084167
Deleted: 260c4960574a6494548d7d87b8adcbcb4d299385c84b1ff8566e050ffe7a1ecf
Deleted: 86790c619b926a0aad364fc9039f6907a9c1277087a8f34fc974e0d9ec847641
Deleted: 2f273da79ca4a810f17949e7ce914aa2daaa336b75794c610782092da9db1e0b
Deleted: 216d9f381671da8d9e538ca0e1695f273bfe26291446252131737347cca3f3d0
Deleted: 4cf451dbc8ecadbd39e7788f5ac9b5ff061b7d0367940f14c91b4e2fa861cb98
Deleted: 8c36a62c2a3026dd4b1a8ca4254678e908ca62dfdf3ed91e8b95f8760d0e3a5b
Deleted: 7082a71623775020c408bbd2447f94a8ad68611d501169bbda3109fdec31c3f0
Deleted: 443e5f15ee41608700f10d8dfb7cf11268225c7fab9acdb1b8756212853657c0
Deleted: 257e8200e69ac587c2d30e8eeaa3d84b3308c6c1beff7d9d616b72ab22544b5c
Deleted: 955bc15cf08550407bcdfbc293f51a7a096a5754e81f9e0c428e7a9eb9750ffb
Deleted: e5b4a3cbd39bad5ee55a715e9e50635e9d33f67f7a59cde1267e66b051c6382d
Deleted: 4a98883d437e364a6d103abdebfcb88c026af9c09aa43e8cb83c2e6b1a2e746a
Deleted: d65a92bab695a23057d02823b5d718822faaa413641f719764dc82bd47e6ea61
Deleted: 3690474eb5b4b26fdfbd89c6e159e8cc376ca76ef48032a30fa6aafd56337880
当在docker rmi命令后指定了某个镜像ID时,必须确保该镜像当前没有被任一容器使用。删除时系统会先删除指向该镜像的所有标签,然后删除该镜像本身。如果该镜像已经被容器使用,正确的做法是先删除依赖该镜像的所有容器,再去删除镜像。
1.3.5 存出镜像和载入镜像
当需要把一台机器上的镜像迁移到另一台机器上的时候,需要将镜像保存成本地文件,这一过程叫作存出镜像。使用docker save命令进行存出操作,之后就可以复制该文件到其他机器。
命令格式:
docker save -o 存出文件名 存出的镜像
例如,存出本地的nickistre/centos-lamp镜像为文件lamp:
[root@localhost ~]# docker save -o lamp nickistre/centos-lamp
[root@localhost ~]# ls -l lamp
-rw-r--r--. 1 root root 550497792Apr 19 18:54 lamp
将存出的镜像从机器A复制到机器B后,若需要在机器B上使用该镜像,就可以将该镜像导入到机器B的镜像库中,这一过程叫作载入镜像。使用docker load或者docker load -i进行载入操作。
命令格式:
docker load <存出的文件
或者
dockerload-i 存出的文件
例如,从文件lamp中载入镜像到本地镜像库中:
[root@localhost ~]#dockerload<lamp
或
[root@localhost ~]#dockerload-ilamp
[root@localhost ~]#dockerimages|greplamp
Docker.io/nickistre/centos-lamp latesta0760f339193 2weeksago 534.5MB
1.3.6 上传镜像
当本地存储的镜像越来越多时,就需要指定一个专门存放这些镜像的地方——仓库。比较方便的就是使用公共仓库,默认上传到docker Hub官方仓库。需要注册访问公共仓库的账号,可以使用docker login命令输入用户名、密码和邮箱来完成注册和登录。在上传镜像之前,还需要先对本地镜像添加新的标签,然后使用docker push命令进行上传。
命令格式:
docker push 仓库名称:标签
例如,在公共仓库上已经成功注册了一个账号,账号是daoke,新增nickistre/centos-lamp镜像的标签为daoke/lamp:centos7:
[root@localhost ~]# docker tag nickistre/centos-lamp daoke/lamp:centos7
[root@localhost ~]# docker login
Username: Docker
Password:
Email: xxx@xxx.com
成功登录后就可以上传镜像:
[root@localhost ~]# docker push daoke/lamp:centos7