3.1 获取镜像
镜像是运行容器的前提。可以使用docker pull 命令直接从Docker Hub镜像来下载镜像。该命令的格式为docker pull NAME[:TAG]。其中,NAME是镜像仓库的名称(用来区分镜像),TAG是镜像的标签(往往用来表示版本信息)。通常情况下,描述一个镜像需要包括“名称+标签”信息。
获取一个Ubuntu 14.04的系统镜像
# docker pull ubuntu:14.04
对于Docker镜像来说,如果不显示指定TAG,则默认会选择latest标签,这会下载仓库中最新版本的镜像。
# docker pull ubuntu
一般来说,镜像的latest标签意味着该镜像的内容会跟踪最新的非稳定版本而发布,内容是不稳定的。
下载过程中,可以看出,镜像文件一般由若干层(layer)组成,db9476e6d963ed这样的串是层的唯一ID(实际上完整的ID包括256比特,由64个十六进制字符组成)。使用docker pull命令下载时会获取并输出镜像的各层信息。当不同的镜像包括相同的层时,本地仅存储的一份内容,减小了需要的存储空间。
3.2 查看镜像信息
3.2.1 使用images命令列出镜像
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu1404 nginx 0818f7ecaaa4 6 days ago 266 MB
ubuntu nginx 0818f7ecaaa4 6 days ago 266 MB
docker.io/httpd.v2 latest 86beaa6619c8 6 days ago 199 MB
docker.io/ubuntu 14.04 578c3e61a98c 13 days ago 223 MB
docker.io/ubuntu latest 113a43faa138 13 days ago 81.2 MB
docker.io/httpd latest fb2f3851a971 7 weeks ago 178 MB
docker.io/hello-world latest e38bc07ac18e 2 months ago 1.85 kB
docker.io/ubuntu 15.10 9b9cb95443b5 23 months ago 137 MB
docker.io/training/webapp latest 6fae60ef3446 3 years ago 349 MB
仓库---标签---镜像唯一ID---镜像最后更新时间----镜像大小
其中镜像的ID信息十分重要,它唯一标识了镜像。在使用镜像ID的时候,一般可以使用该ID的前诺干个组成的可区分串来代替完整的ID。
镜像大小信息只是表示该镜像的逻辑体积大小,实际上由于相同的镜像层本地只会 一份,物理上占用的存储空间会小于各镜像的逻辑体积之和。
3.2.2 使用tag命令添加镜像标签
为了方便在后续工作中使用特定的镜像,还可用使用docker tag 命令来为本地镜像任意添加新的标签。
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/ubuntu latest 113a43faa138 13 days ago 81.2 MB
[root@docker ~]# docker tag ubuntu:latest myubuntu:latest
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/ubuntu latest 113a43faa138 13 days ago 81.2 MB
myubuntu latest 113a43faa138 13 days ago 81.2 MB
它们实际上指向同一个镜像文件,只是别名不同而已。Docker tag命令添加的标签实际上起到了类似链接的作用。
3.2.3 使用inspect命令查看详细信息
使用docker inspect 命令可以获取该镜像的详细信息,包括制作者、适应架构、各层的数字摘要等。
[root@docker ~]# docker inspect ubuntu:nginx
[
{
"Id": "sha256:0818f7ecaaa4fca4d2e5e5ed624fec9af79ceee33645c9632fad11dcdc012cbb",
"RepoTags": [
"ubuntu1404:nginx",
"ubuntu:nginx"
],
"RepoDigests": [],
"Parent": "sha256:d336958b792f16df44b4ae6075e6f55ab117ea6ddaefeb08c4f74bda8f87d6fa",
"Comment": "",
"Created": "2018-06-12T09:19:54.80279903Z",
"Container": "a776e4cbbe2ea565df696a51cbfa9e322e45d3a28377420d50050ee417509941",
"ContainerConfig": {
"Hostname": "18469ba8622a",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"80/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/sh",
"-c",
"#(nop) ",
"EXPOSE 80/tcp"
],
"ArgsEscaped": true,
"Image": "sha256:d336958b792f16df44b4ae6075e6f55ab117ea6ddaefeb08c4f74bda8f87d6fa",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": [],
"Labels": {}
},
"DockerVersion": "1.13.1",
"Author": "lxldoudou \"[email protected]\"",
"Config": {
"Hostname": "18469ba8622a",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"80/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/bash"
],
"ArgsEscaped": true,
"Image": "sha256:d336958b792f16df44b4ae6075e6f55ab117ea6ddaefeb08c4f74bda8f87d6fa",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": [],
"Labels": {}
},
"Architecture": "amd64",
"Os": "linux",
"Size": 265532235,
"VirtualSize": 265532235,
"GraphDriver": {
"Name": "overlay2",
"Data": {
"LowerDir": "/var/lib/docker/overlay2/8993e0b1ebd18bb827abc3e18dd68e96d257572f07259f9c580aa06b09259bf3/diff:/var/lib/docker/overlay2/f33e06d355741adb5558c60fdac7adef4cd9a6e2d5f86b2f6f3eaf7586f59d1f/diff:/var/lib/docker/overlay2/4c802e2f96c851c1a951489d76b8499d7456f6d4b8458fa16333b8320397dd6e/diff:/var/lib/docker/overlay2/02b543fdd42c8ecd5bb1825bb0876775ed45423b644ae3e6332f930fba653fb8/diff:/var/lib/docker/overlay2/392a73552eda4ed7e529cac6ec72bc6764da8b8591fd5bf9dc209a24b9093ff3/diff:/var/lib/docker/overlay2/0a74838d6f4b494224f1c98a3b2dfecf9390e30b5fb36ae564b595ce8f70ed22/diff",
"MergedDir": "/var/lib/docker/overlay2/8df78e6b77c0b6097417e3d42b0bb98ae378e68222c885b7333c7824790ccefe/merged",
"UpperDir": "/var/lib/docker/overlay2/8df78e6b77c0b6097417e3d42b0bb98ae378e68222c885b7333c7824790ccefe/diff",
"WorkDir": "/var/lib/docker/overlay2/8df78e6b77c0b6097417e3d42b0bb98ae378e68222c885b7333c7824790ccefe/work"
}
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:04964fddc9461e6657e6fb372f96ca77e671871829ed453d933a03c491e70803",
"sha256:a4aaef726d022d0d7e49c09bebf4a619d6db41bb05cc21d2f6b86d510e2cf3b3",
"sha256:705419d10b1391753cc659618c6c76deae49e55513714025007440a65d4ed3fd",
"sha256:6ec525dfd0603634b8e0e7eec752e43f9ab72460f0e3cf29beeba822d708851b",
"sha256:70d93396f87f34c5b8fa4080bbf22d06cce8c05341a6b11c2e03c6d4d3959747",
"sha256:ee843aa4be8f416db2245acf2ffad090a87af23d57e1dc10d3aba0dce9e26dcc",
"sha256:6e0a7ef55614ad230341b4f6c0bafaae8b512ce76b0f363e5468cb60c4a9cd48"
]
}
}
]
返回的是一个JSON格式的消息,如果我们只要其中一项内容时,可以使用参数-f来指定
[root@docker ~]# docker inspect -f {{".Architecture"}} ubuntu:nginx
amd64
[root@docker ~]# docker inspect -f {{".Author"}} ubuntu:nginx
lxldoudou "[email protected]"
3.2.4 使用history命令查看镜像历史
既然镜像文件是由多个层 组成,那么咱们知道各个层的内容具体是什么呢?这个时候使用history子命令,该命令将列出各层的创建信息。
[root@docker ~]# docker history ubuntu:nginx
IMAGE CREATED CREATED BY SIZE COMMENT
0818f7ecaaa4 6 days ago /bin/sh -c #(nop) EXPOSE 80/tcp 0 B
d336958b792f 6 days ago /bin/sh -c apt-get install -y nginx 20.8 MB
9ae6b6a79fb3 6 days ago /bin/sh -c apt-get update 21.3 MB
8499baac2a18 6 days ago /bin/sh -c #(nop) MAINTAINER lxldoudou "3... 0 B
578c3e61a98c 13 days ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0 B
<missing> 13 days ago /bin/sh -c mkdir -p /run/systemd && echo '... 7 B
<missing> 13 days ago /bin/sh -c sed -i 's/^#\s*\(deb.*universe\... 2.76 kB
<missing> 13 days ago /bin/sh -c rm -rf /var/lib/apt/lists/* 0 B
<missing> 13 days ago /bin/sh -c set -xe && echo '#!/bin/sh' >... 195 kB
<missing> 13 days ago /bin/sh -c #(nop) ADD file:3c65bdbcf131852... 223 MB
可以使用--no-trunc选项来输出完整命令
[root@docker ~]# docker history ubuntu:nginx --no-trunc
3.3 搜寻镜像
使用docker search 命令可以搜索远端仓库中共享的镜像,默认搜索官方仓库中的镜像。
-s 指定仅显示评价为指定星级以上的镜像,默认为0,即输出所有镜像。
[root@docker ~]# docker search -s 4 nginx
Flag --stars has been deprecated, use --filter=stars=3 instead
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/nginx Official build of Nginx. 8828 [OK]
docker.io docker.io/jwilder/nginx-proxy Automated Nginx reverse proxy for docker c... 1348 [OK]
docker.io docker.io/richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable ... 579 [OK]
3.4 删除镜像
3.4.1 使用标签删除镜像
使用docker rmi 命令可以删除镜像,命令格式:Docker rmi IMAGE [IMAGE…],其中IMAGE可以为标签ID。
[root@docker ~]# docker rmi myubuntu:latest
Untagged: myubuntu:latest
当同一个镜像拥有多个标签的时候,docker rmi 命令只是删除该镜像多个标签中的指定标签而已,并不影响镜像文件。
当镜像只剩下一个标签的时候,此时再使用docker rmi命令会彻底删除镜像。
3.4.2 使用镜像ID删除镜像
当使用docker rmi 命令,并且后面跟上镜像ID时,会先尝试删除所有指向该镜像的标签,然后删除该镜像文件本身。
当有该镜像创建的容器存在时,镜像文件默认时无法被删除的。
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu1404 nginx 0818f7ecaaa4 6 days ago 266 MB
ubuntu nginx 0818f7ecaaa4 6 days ago 266 MB
docker.io/httpd.v2 latest 86beaa6619c8 6 days ago 199 MB
docker.io/ubuntu 14.04 578c3e61a98c 13 days ago 223 MB
注意前两行内容,两个标签,一个镜像ID。
[root@docker ~]# docker rmi ubuntu1404:nginx
Untagged: ubuntu1404:nginx
[root@docker ~]# docker rmi 0818f7ecaaa4
Untagged: ubuntu:nginx
Deleted: sha256:0818f7ecaaa4fca4d2e5e5ed624fec9af79ceee33645c9632fad11dcdc012cbb
Deleted: sha256:d336958b792f16df44b4ae6075e6f55ab117ea6ddaefeb08c4f74bda8f87d6fa
Deleted: sha256:96cc7cea02bd1c3b376fe9d9870bfaf41515b4e4473fc5434e5573732f835a6d
Deleted: sha256:9ae6b6a79fb3096e1f1857494786152ba23034184cb9a2fbca8dfdcbafc91a25
Deleted: sha256:4356847edaeeb0528bf50bdfb2d54d01a2095dcb0915564ca9ab54d1f9f15973
Deleted: sha256:8499baac2a18fb6c8d99ff3405bbd9c5be3f2f30a13b2d7b11e59fd97ac7762d
3.5 创建镜像
创建镜像的方法主要有三种:基于已有镜像的容器创建、基于本地模板导入、基于Dockerfile创建。
3.5.1 基于已有镜像的容器创建
主要使用docker commit 命令:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
-a,--author=“”:作者信息;
-c,--change=“”:提交的时候执行Dockerfile指令,包括 CMD | ENTRYPOINT | ENV | EXPOSE | LABEL | ONBUILD | USER | VOLUME | WORKDIR等;
-m,--message=“”:提交信息;
-p,--pause=true:提交时暂停容器运行。
[root@docker ~]# docker run -it ubuntu:14.04 /bin/bash
root@21af72f41ef0:/# mkdir test
root@21af72f41ef0:/# touch ./test/test.txt
root@21af72f41ef0:/# exit
记住容器的ID为21af72f41ef0
[root@docker ~]# docker commit -m "Added a new file" -a "lxldoudou [email protected]" 21af72f41ef0 test:01
sha256:c00e0901125e50c5865987c40f9ed12489076d3083ae2fcce413c0d6bc404cc1
查看新建立的镜像
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test 01 c00e0901125e 24 seconds ago 223 MB
测试
[root@docker ~]# docker run -it test:01 /bin/bash
root@ad69de7c1892:/# ls -l test/test.txt
-rw-r--r-- 1 root root 0 Jun 19 06:12 test/test.txt
3.5.2 基于本地模板导入
用户也可以直接从一个操作系统模板文件导入一个镜像,主要使用docker import命令。命令格式为:docker import [OPTIONS] file | url - [REPOSITORY[:TAG]]
要直接导入一个镜像,可以使用OpenVZ提供的模板来创建,或者用其他已导出来的镜像模板来创建。
OpenVZ模板的下载地址:https://openvz.org/Download/template/precreated
下载一个centos7的模板压缩包,之后使用以下命令导入
[root@docker ~]# wget https://download.openvz.org/template/precreated/centos-7-x86_64.tar.gz
--2018-06-19 14:28:27-- https://download.openvz.org/template/precreated/centos-7-x86_64.tar.gz
正在解析主机 download.openvz.org (download.openvz.org)... 185.231.241.69
正在连接 download.openvz.org (download.openvz.org)|185.231.241.69|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:221597800 (211M) [application/x-gzip]
正在保存至: “centos-7-x86_64.tar.gz”
100%[================================================================================================================>] 221,597,800 234KB/s 用时 16m 41s
2018-06-19 14:45:14 (216 KB/s) - 已保存 “centos-7-x86_64.tar.gz” [221597800/221597800])
[root@docker ~]# cat centos-7-x86_64.tar.gz | docker import - centos:7.0
sha256:7eb9ad8c57acf6fd6743584a3e07170cd903abdf39fd37512cebdb58db01b802
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 7.0 7eb9ad8c57ac 5 seconds ago 589 MB
3.6 存出和载入镜像
3.6.1 存出镜像
如果要导出镜像到本地文件,可以使用docker save 命令。
[root@docker ~]# docker save -o ubuntu_14.04.tar ubuntu:14.04
之后,就可以通过复制ubuntu_14.04.tar文件将该镜像分享给他人。
3.6.2 载入镜像
使用docker load 将导出的tar文件再导入到本地镜像库,例如将本地的ubuntu_14.04.tar导入镜像到本地镜像列表
[root@docker ~]# ls -l
总用量 489212
……………………………………
-rw------- 1 root root 232536576 6月 19 14:41 ubuntu_14.04.tar
………………………………………
[root@docker ~]# docker load --input ubuntu_14.04.tar
Loaded image: ubuntu:14.04
或者
[root@docker ~]# docker load < ubuntu_14.04.tar
Loaded image: ubuntu:14.04
3.7 上传镜像
可以使用docker push 命令上传镜像到仓库,默认上次到Docker Hub官方仓库(需要登录)。命令格式:
docker push NAME[:TAG] | [REGISTRY_HOST[:REGISTRY_PORT] / ] NAME[:TAG]]
[root@docker ~]# docker tag test:01 lxldoudou/test:01
[root@docker ~]# docker push lxldoudou/test:01
The push refers to a repository [docker.io/lxldoudou/test]
64fa89924107: Preparing
70d93396f87f: Preparing
6ec525dfd060: Preparing
705419d10b13: Preparing
a4aaef726d02: Preparing
04964fddc946: Waiting
第一次上传时,提提示输入登陆信息或进行注册