一、获取镜像
docker pull [IMAGE_NAME]:[TAG]
[IMAGE_NAME]
表示的是镜像的名称,[TAG]
表示的是镜像的标签,也就是说我们需要通过"镜像名+标签"
的方式来下载镜像。
当然,下载镜像的时候也可以不指定TAG,这时候会默认下载latest标签的镜像。但是并不推荐下载latest标签的镜像,因为该镜像的内容会跟踪镜像的最新版本,并随之变化,所以它是不稳定的。在生产环境中,可能会出现莫名的bug,所以推荐最好还是指定具体的TAG,这样也可以一目了然的看清楚版本号。
举个栗子
[root@docker ~]# docker pull mysql:5.7
二、查看镜像
1、images 命令列出镜像
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.mynexus.com/myimages/jenkins 2.213-login 0ceb3de8ca91 18 hours ago 1.19GB
<none> <none> 37a99a93d5bc 18 hours ago 1.19GB
docker.mynexus.com/myimages/jenkins 2.213 b7692f1a5dea 19 hours ago 1.12GB
docker.mynexus.com/myimages/tomcat 8.5 d7dcd3f88433 20 hours ago 1.05GB
docker.mynexus.com/myimages/jdk 1.8 1d56be97ef09 22 hours ago 1.04GB
docker.mynexus.com/myimages/centos 7.6 849ede3cd3db 22 hours ago 635MB
mysql 5.7 db39680b63ac 11 days ago 437MB
daocloud.io/library/centos centos7.6.1810 f1cb7c7d58b7 10 months ago 202MB
REPOSITORY
:来自于哪个仓库
TAG
:镜像的标签信息,比如1.8、latest表示不同的版本信息
IMAGE ID
:镜像的ID,如果看到两个ID完全相同,那么实际上,他们指向的是同一个镜像,只是标签名称不同罢了。
CREATED
:镜像最后的更新时间。
SIZE
:镜像的大小。
2、使用tag命令为镜像添加标签
为了方便后续工作,快速的找到某个镜像,我们可以使用docker tag
命令,为本地镜像添加有一个新的标签。
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 db39680b63ac 11 days ago 437MB
[root@docker ~]# docker tag mysql:5.7 docker.mynexus.com/myimages/mysql:5.7
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 db39680b63ac 11 days ago 437MB
docker.mynexus.com/myimages/mysql 5.7 db39680b63ac 11 days ago 437MB
3、使用inspect命令查看镜像详细信息
[root@docker ~]# docker inspect docker.mynexus.com/myimages/jenkins:2.213-login
[
{
"Id": "sha256:0ceb3de8ca91c9483c9dbd33b427ffab7f4a198eb2350f04903ef4390aad31f6",
"RepoTags": [
"docker.mynexus.com/myimages/jenkins:2.213-login"
],
"RepoDigests": [
"docker.mynexus.com/myimages/jenkins@sha256:a120511d7bb63b037c553bbc8c597de2b198de55dc68140101eafe556c2440db"
],
"Parent": "sha256:b7692f1a5dea408246deb245ca992d555b581676e1852a766810f020e8369bb5",
"Comment": "jenkins login",
"Created": "2020-01-08T12:50:04.45408124Z",
"Container": "1d4d28476edc698bf2e760230a876f48062669264700c2b38478942ba8657525",
"ContainerConfig": {
"Hostname": "1d4d28476edc",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"22/tcp": {},
"8080/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/jdk1.8.0_202/bin:/usr/local/jdk1.8.0_202/bin:/usr/local/apache-maven-3.6.1/bin",
"JAVA_HOME=/usr/local/jdk1.8.0_202",
"TOMCAT_HOME=/usr/local/tomcat",
"MAVEN_HOME=/usr/local/apache-maven-3.6.1",
"JENKINS_HOME=/home/.jenkins"
],
"Cmd": [
"/usr/bin/supervisord",
"-c",
"/etc/supervisord.conf"
],
"Image": "docker.mynexus.com/myimages/jenkins:2.213",
"Volumes": null,
"WorkingDir": "/etc/yum.repos.d",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"org.label-schema.build-date": "20181204",
"org.label-schema.license": "GPLv2",
"org.label-schema.name": "CentOS Base Image",
"org.label-schema.schema-version": "1.0",
"org.label-schema.vendor": "CentOS"
}
},
"DockerVersion": "19.03.5",
"Author": "",
"Config": {
"Hostname": "1d4d28476edc",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"22/tcp": {},
"8080/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/jdk1.8.0_202/bin:/usr/local/jdk1.8.0_202/bin:/usr/local/apache-maven-3.6.1/bin",
"JAVA_HOME=/usr/local/jdk1.8.0_202",
"TOMCAT_HOME=/usr/local/tomcat",
"MAVEN_HOME=/usr/local/apache-maven-3.6.1",
"JENKINS_HOME=/home/.jenkins"
],
"Cmd": [
"/usr/bin/supervisord",
"-c",
"/etc/supervisord.conf"
],
"Image": "docker.mynexus.com/myimages/jenkins:2.213",
"Volumes": null,
"WorkingDir": "/etc/yum.repos.d",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"org.label-schema.build-date": "20181204",
"org.label-schema.license": "GPLv2",
"org.label-schema.name": "CentOS Base Image",
"org.label-schema.schema-version": "1.0",
"org.label-schema.vendor": "CentOS"
}
},
"Architecture": "amd64",
"Os": "linux",
"Size": 1194720839,
"VirtualSize": 1194720839,
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/54ec8e9fd3c5295ba9284a1c54c2617e848dc45023fe6dbf3db51c125b449307/diff:/var/lib/docker/overlay2/cc8a1745d0330a40fb68bdf13d8d559627dcce6c9c4421a676aeb2757cd30ab3/diff:/var/lib/docker/overlay2/6bf246e397e90434975138d6f54be6ad4e26f8391e8fb2a0d35dc27a0e0673a4/diff:/var/lib/docker/overlay2/1dfb5f5ff0a2a682d60c4b0ec062b0f92e806e030fc8dd53c483886c9afbbbe7/diff:/var/lib/docker/overlay2/783e805d8d9c6a184fbc2ecaf297257f2cd0304596d6adf7f78777886beb06f4/diff:/var/lib/docker/overlay2/201a4983b938cad2075863e1d595dcee4b0909dfeea09b2300c98ce9185f012a/diff:/var/lib/docker/overlay2/b68d675bee27a2b751fc0e6d09eefcb44796e76bffa536bf5339a5d572f41235/diff:/var/lib/docker/overlay2/d29aeb9768ccefc6acce9b6155bfbf0251f4a3f4f1d80bc0ad4396569225e800/diff:/var/lib/docker/overlay2/f45743b8be2c5443d4b770230af82bb3a9cef7065e143cef1d0d1083e788d399/diff:/var/lib/docker/overlay2/7d9a34a8d9ba41b07657582862b620ba4cf8d7590ab964c0d8e64757fa9681b4/diff:/var/lib/docker/overlay2/b8fc6598a8d21f096c8b9049db7ceaf05f4bea8ed5aca21a11f47cf2b9a8ea84/diff:/var/lib/docker/overlay2/76fc7a630a563749f69c94d4ed6fd651c4e4d349775249862ab6f459b88bfdf6/diff:/var/lib/docker/overlay2/f8cbd0b495e93ee93a66b12db029e04e2d8159d07b338c9c6d3afda96b9146de/diff:/var/lib/docker/overlay2/d2049004a034cc5f15d1089af7cce882cb0d8b524e5f627673171a9c35efff40/diff:/var/lib/docker/overlay2/b7485ce4e67d60e7b89d39c5174542443351b8fcaf2dbbc2a5922444a50c844b/diff:/var/lib/docker/overlay2/c5caeb444834ebdedd5b476fdf719d46a0dbecd132d50948b6ef4e869e9cddb4/diff",
"MergedDir": "/var/lib/docker/overlay2/c042b5f0e1fbff362e2682020a188041fe934a73183606d063967efda09fd315/merged",
"UpperDir": "/var/lib/docker/overlay2/c042b5f0e1fbff362e2682020a188041fe934a73183606d063967efda09fd315/diff",
"WorkDir": "/var/lib/docker/overlay2/c042b5f0e1fbff362e2682020a188041fe934a73183606d063967efda09fd315/work"
},
"Name": "overlay2"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:89169d87dbe2b72ba42bfbb3579c957322baca28e03a1e558076542a1c1b2b4a",
"sha256:07c7f9d65ede75da05e2232f6371cafb46489fc96350710fa6528b158a86ab70",
"sha256:8c07108bee950e4a1cb69c2cbe83b9e744c730a78b13a2804c4ef5af1e5b8472",
"sha256:a7807f1e64d3eaa87c2a9d64c5f40b8b93962b80075864f8c4f64d942fcbefb1",
"sha256:624a70417d3cc05716ef2eb92482a6dc423795077ce676400e2162b8d48e0935",
"sha256:264b2275105553f91fb53d610819d1feb1848a1fa8ad5e878cd051b24540f29c",
"sha256:c9a4eaba70440e87e7dcee89c3c9f01b52f8f1daca0bc977d3696014500c9195",
"sha256:62a87ee164785fa438c43ce67563a5413acdc07727a7f3bd93521f8035135e40",
"sha256:873300318b33e9241f9ee66357fc8353f84feeda6ff011ff356b7c89fae0c22c",
"sha256:6e5e69de5d992a020bead1fad39959cb715e2289239a218d7d3eb57c04fc13dc",
"sha256:8bf76ff769f36a6a19043cae0fc0c20a2f538c93c4a2b27cc297252c97898927",
"sha256:c1605813b47788a1e4376c476d2ed51f92036f4d07087ae88356cc1cb6a65b2b",
"sha256:c77de2712437514cb11d32514b4e6dc6913822dda665dc4a79d81c03fc1f7639",
"sha256:145a9ac317d3e0018ddb4ff384c862eed720a974a19a5e2010d04bafd19ad2b4",
"sha256:229ee930416c8b8faaaddb1f7a823c693f215c3199c98233b59af0709f829439",
"sha256:4a0011235e69ac7f07d299aecc545abc95502f3f3e3fa670b4fcde4680ded274",
"sha256:69daafff7bb262b87b4f240078b904558099b363479ad25611ecf806b840176d"
]
},
"Metadata": {
"LastTagTime": "2020-01-08T20:50:04.457918161+08:00"
}
}
]
docker inspect
返回的是JSON格式的信息,如果想获得其中指定的一项内容可以通过-f
来指定,比如获取镜像的"Metadata"。
[root@docker ~]# docker inspect -f {{".Metadata"}} docker.mynexus.com/myimages/jenkins:2.213-login
4、使用history查看镜像历史
我们知道,一个镜像是由多层(layer)组成的,那要怎样才能知道各个层的具体内容呢?
通过docker history
命令可以查看各个层(layer)的创建信息。
[root@docker ~]# docker history docker.mynexus.com/myimages/jenkins:2.213-login
IMAGE CREATED CREATED BY SIZE COMMENT
0ceb3de8ca91 20 hours ago /usr/bin/supervisord -c /etc/supervisord.conf 74.8MB jenkins login
b7692f1a5dea 21 hours ago /bin/sh -c #(nop) CMD ["/usr/bin/supervisor… 0B
b172e0f0d1a5 21 hours ago /bin/sh -c #(nop) EXPOSE 22 8080 0B
d7c34b8860bd 21 hours ago /bin/sh -c #(nop) ENV PATH=/usr/local/sbin:… 0B
a2b3b2f20893 21 hours ago /bin/sh -c #(nop) ENV JENKINS_HOME=/home/.j… 0B
ed60c9be924e 21 hours ago /bin/sh -c #(nop) ENV MAVEN_HOME=/usr/local… 0B
91a020491882 21 hours ago /bin/sh -c #(nop) ENV JAVA_HOME=/usr/local/… 0B
5212bad652e9 21 hours ago /bin/sh -c #(nop) ADD file:9ead2d2ac6ab8e28d… 62.5MB
b49e6ba89c09 21 hours ago /bin/sh -c #(nop) ADD file:c49318ed696cf108a… 10.7MB
1ed7e1ac2563 21 hours ago /bin/sh -c #(nop) MAINTAINER wangchao xxx@1… 0B
d7dcd3f88433 22 hours ago /bin/sh -c #(nop) CMD ["/usr/bin/supervisor… 0B
71630bf7c85d 22 hours ago /bin/sh -c #(nop) EXPOSE 22 8080 0B
36c1b1987e9c 22 hours ago /bin/sh -c #(nop) ENV TOMCAT_HOME=/usr/loca… 0B
53c87afbc9b1 22 hours ago /bin/sh -c #(nop) ADD file:c335e1bd332344c60… 328B
72a5cac97409 22 hours ago /bin/sh -c #(nop) ADD file:5b8e9f5725ca73b7d… 9.06MB
f1cbe521bf98 22 hours ago /bin/sh -c #(nop) MAINTAINER wangchao xxx@1… 0B
1d56be97ef09 24 hours ago /bin/sh -c #(nop) CMD ["/usr/bin/supervisor… 0B
f5bb76dc23e0 24 hours ago /bin/sh -c #(nop) EXPOSE 22 0B
755dcc52290a 24 hours ago /bin/sh -c #(nop) ENV PATH=/usr/local/sbin:… 0B
49f097c64eec 24 hours ago /bin/sh -c #(nop) ENV JAVA_HOME=/usr/local/… 0B
2a8bfbadf841 24 hours ago /bin/sh -c #(nop) ADD file:65d2a21c343d4f40c… 403MB
88a3f6ac5457 24 hours ago /bin/sh -c #(nop) MAINTAINER wangchao xxx@1… 0B
849ede3cd3db 25 hours ago /bin/sh -c #(nop) CMD ["/usr/bin/supervisor… 0B
7520fbdc1812 25 hours ago /bin/sh -c #(nop) EXPOSE 22 0B
e9c8489855d5 25 hours ago /bin/sh -c #(nop) ADD file:3e453899cf6fcb72a… 147B
fe6f8ae0c507 25 hours ago /bin/sh -c #(nop) ADD file:e191e3c1ab4e45cc4… 9.16kB
d558a284455f 25 hours ago /bin/sh -c echo "root:wangchao123" | chpasswd 1.71kB
c61bfe2f796d 25 hours ago /bin/sh -c ssh-keygen -A -t dsa -f /etc/ssh/… 3.41kB
ede4759702d1 25 hours ago /bin/sh -c ssh-keygen -t ecdsa -f /etc/ssh/s… 406B
c01202fdef9e 25 hours ago /bin/sh -c ssh-keygen -t rsa -f /etc/ssh/ssh… 2.07kB
2d1f20ad5ab4 25 hours ago /bin/sh -c yum -y install vim screen lrzsz t… 270MB
e0aa8e731c4a 25 hours ago /bin/sh -c wget http://mirrors.aliyun.com/re… 2.52kB
1414b16ec46b 25 hours ago /bin/sh -c #(nop) WORKDIR /etc/yum.repos.d 0B
01982b98f200 25 hours ago /bin/sh -c yum -y install wget 140MB
72d4a75b066c 25 hours ago /bin/sh -c rpm -ivh http://mirrors.aliyun.co… 23.2MB
6b231eb9d9d5 25 hours ago /bin/sh -c #(nop) MAINTAINER wangchao xxx@1… 0B
f1cb7c7d58b7 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:54b004357379717df… 202MB
发现了上面过长的信息被省略了,看不到全部的内容,这时候,可以通过添加–no-trunc参数来查看。
[root@docker ~]# docker history --no-trunc docker.mynexus.com/myimages/jenkins:2.213-login
三、删除镜像
1、通过标签删除镜像
docker rmi [TAG]
支持的参数如下:
-f, --force
:强制删除镜像,即便有容器引用该镜像
--no-prune
:不要删除未带标签的父镜像
docker rmi [TAG]
会删除指定标签的镜像,但是镜像本身不会被删除,因为一个镜像的可以有多个标签 ,就像是Linux文件的硬链接,当镜像只剩下一个标签的时候,使用标签删除镜像,才会删除镜像本身。
2、通过ID删除镜像
docker rmi [ID]
使用镜像的ID删除镜像,会先删除这个镜像得所有标签,然后再删除镜像本身。
需要注意的是:如果存在镜像创建的容器,这个时候镜像是无法被删除的。不过你可以使用-f
参数强制删除镜像,但是并不建议这么做。
3、删除所有未打dangling标签的镜像
[root@docker ~]# docker rmi $(docker images -q -f dangling=true)
4、删除所有镜像
[root@docker ~]# docker rmi $(docker images -q)
5、清理镜像
在使用Docker一段时间之后,系统一般会残存一些临时的、没有被使用的镜像文件,可以通过下面这个命令你进行清理:
docker image prune
支持的参数如下:
-a, --all
:删除所有没有用的镜像,而不仅仅是临时文件
--filter filter
:添加过滤条件,只删除符合条件的
-f, --force
:强制删除惊醒文件,无需弹出提示确认
此外,执行完docker image prune
之后,还会告诉我们本次清理释放了多少存储空间。
四、创建镜像
Docker创建镜像有三种方法:
1)基于已有的镜像创建
2)基于Dokcerfile创建
3)基于本地模板创建
1、基于已有的镜像创建
通过下面命令来创建
docker container commit
支持的参数如下:
-a, --author string
="":作者信息
-c, --change list
=[]:可以在提交的时候执行Dockerfile指令。如CMD、ENTRYPOINT、ENV、EXPOSE、LABEL、ONBUILD、USER、VOLUME等
-m, --message string
="":提交信息
-p, --pause
=true:提交时,暂停容器运行
接下来就举一个实际工作中遇到的例子,这个在我的Dockerfile创建基础镜像的专篇中已经讲过了,这里再复制过来一下,哈哈。
就是在制作Jenkins镜像的时候,刚启动的jenkins镜像,是没安装过插件的,等我们安装好插件并且设置好密码之后,这时候jenkins镜像就是即开即用的了(直接运行就可以用用户名密码登录),所以我们需要提交新的镜像。
获取Container ID
[root@docker home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1d4d28476edc docker.mynexus.com/myimages/jenkins:2.213 "/usr/bin/supervisor…" 35 minutes ago Up 35 minutes 0.0.0.0:6622->22/tcp, 0.0.0.0:9080->8080/tcp jenkins
提交新的镜像
[root@docker home]# docker container commit -m "jenkins login" 1d4d28476edc docker.mynexus.com/myimages/jenkins:2.213-login
sha256:0ceb3de8ca91c9483c9dbd33b427ffab7f4a198eb2350f04903ef4390aad31f6
2、基于Dokcerfile创建
请看我的另外一篇文章《Docker学习–用Dockerfile构建常用基础镜像》
3、基于本地模板创建
这个这里就不说了。
五、镜像的导入导出
如果想把自己的镜像传给别人,那该怎么办呢?Docker提供了导入和导出的命令:
docker save
和docker load
1、导出镜像
[root@docker ~]# docker save -o jenkins-login.tar docker.mynexus.com/myimages/jenkins:2.213-login
2、导入镜像
把导出的镜像传到别的服务器上做导入
[root@docker2 ~]# docker load --input jenkins-login.tar
也可以使用重定向进行导入
[root@docker2 ~]# docker load < jenkins-login.tar
Docker镜像的导入和导出是完整的,导入导出前后的ID不会发生变化。
六、镜像的上传
制作好镜像之后,我们可以推送镜像到托管服务器上。
可以推送到Docker Hub、docker-registry、Harbor、nexus等等仓库,就看你是用什么仓库管理镜像的了。
上面这些仓库的上传操作在之前相关的文章中都有讲过:
《Docker学习–Docker仓库之Docker Hub的简单了解》
《Docker学习–Docker仓库之私有仓库docker-registry的简单了解》
《Docker学习–Docker仓库之企业级私有仓库Harbor》
《Docker学习–Docker仓库之使用nexus3作为私有仓库》
参考文章:
https://www.cnblogs.com/quanxiaoha/p/10628017.html
https://www.cnblogs.com/quanxiaoha/p/10632039.html
http://k8s.unixhot.com/docker/docker-images.html#input-output-image