十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
本章将围绕镜像这一核心概念介绍具体操作, 包括:
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:域名注册、雅安服务器托管、营销软件、网站建设、陇南网站维护、网站推广。2.1 docker image 获取如何使用pull命令从 Docker Hub 仓库中下载镜像到本地;
如何查看本地已有的镜像信息和管理镜像标签;
如何在远端仓库使 用 search 命令进行搜索和过滤;
如何删除镜像标签和镜像文件;
如何创建用户定制的镜像并且保存为外部文件。
最后,还将介绍如何往DockerHub仓库中推送自己的镜像。
镜像是运行容器的前提, 官方的 Docker Hub 网站已经提供了数十万个镜像供大家开放下载。 可以使用docker [image] pull
命令直接从 Docker Hub 镜像源来下载镜像。
该命令的格式:
docker [image] pull NAME [ :TAG]
参数:
- NAME是镜像仓库名称(用来区分镜像),
- TAG是镜像的标签(往往用来表示版本 信息)。
通常情况下, 描述一个镜像需要包括 “名称+标签“ 信息。
例如, 获取一个Ubuntu 18.04系统精简的基础镜像可以使用如下的命令:
[root@dbc-server-554 ansible]# docker image pull ubuntu:18.04
18.04: Pulling from library/ubuntu
a055bf07b5b0: Pull complete
Digest: sha256:c1d0baf2425ecef88a2f0c3543ec43690dc16cc80d3c4e593bb95e4f45390e45
Status: Downloaded newer image for ubuntu:18.04
docker.io/library/ubuntu:18.04
对于Docker镜像来说, 如果不显式指定TAG, 则默认会选择latest
标签,这会下载仓库中最新版本的镜像,例如
docker pull ubuntu
等价于
docker pull ubuntu:latest
一般来说, 镜像的latest 标签意味着该镜像的内容会跟踪最新版本的变更而变化,内容是不稳定的。因此,从稳定性上考虑,不要在生产环境中忽略镜像的标签信息或使用默认的latest标记的镜像
2.1.2 层(layer)下载过程中可以看出 ,镜像文件一般由若干层(layer
)组成 ,a055bf07b5b0这样的字符串是层的唯一id(实际上完整的id包括256比特,64个十六进制字符组成)。使用docker pull命令下载中会获取并输出镜像的各层信息。当不同的镜像包括相同的层时,本地仅存储了层的 一份内容,减小了存储空间。
读者可能会想到, 在不同的镜像仓库服务器的情况下,可能会出现镜像重名的情况。 严格地讲,镜像的仓库名称中还应该添加仓库地址(即registry, 注册服务器)作为前缀,只是默认使用的是官方DockerHub服务 ,该前缀可以忽略。 例如,docker pull ubuntu:18.04相当于docker pull registory.hub. docker.com/ubuntu:18.04
即从默认的注册服务器DcoekrHub Registry中的 ubuntu 仓库来下载标记为18.04的镜像。
如果从非官方的仓库下载,则 需要在仓库 名称前指定完整的仓库地址。例如从网易蜂巢的镜像源来下载ubuntu:18.04镜像,可以使用如下命令,此时下载的镜像名称为hub. c.163.com/public/ubuntu:18.04
$ docker pull hub.c.163.com/public/ubuntu:18.04 pull
子命令支持的选项主要包括:
- -a, --all-tags=true/false:是否获取仓库中的所有镜像,默认为否;
- –disable-content-trust:取消镜像的内容校验,默认为真。
- –regisotry-mirror=proxy_URL 使用镜像代理服务来加速Docker镜像获取过程,来指定镜像代理服务地址(如https:// registry.docker-en.com)
尝试运行镜像
[root@dbc-server-554 ansible]# docker run -it ubuntu:18.04 bash
root@69c9479cfafd:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
2.2 查看镜像信息(ls,tag,inspect,history)
2.2.1 使用images命令列出镜像(ls)使用docker images或docker image ls 命令可以列出本地主机上已有镜像的基本信息。格式:
docker images [ls]
例如, 下面的命令列出了上一小节中下载的镜像信息:
[root@dbc-server-554 ansible]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 18.04 e28a50f651f9 7 days ago 63.1MB
在列出信息中, 可以看到几个字段信息:
- REPOSITORY 来自于哪个仓库, 比如ubuntu表示ubuntu系列的基础镜像;
- TAG 镜像的标记信息, 比如 18.04、 latest表示不同的版本信息。 标签只是标记, 并不能标识镜像内容;
- IMAGE ID 镜像的ID(唯一标识镜像),如果两个镜像的ID相同,说明它们实际上指向了同一 个镜像, 只是具有不同标签名称而已;
- CREATED 创建时间, 说明镜像最后的更新时间;
- SIZE 镜像大小, 优秀的镜像往往体积都较小。
其中镜像的ID信息十分重要, 它唯一标识了镜像。在使用镜像ID的时候, 一般可以使 用该ID的前若干个字符组成的可区分串来替代完整的ID。
TAG 信息用于标记来自同一个仓库的不同镜像。 例如ubuntu 仓库中有多个镜像, 通过 TAG 信息来区分发行版本, 如18.04、 18.10 等。
镜像大小信息只是表示了该镜像的逻辑体积大小, 实际上由于相同的镜像层本地只会存储一份, 物理上占用的存储空间会小于各镜像逻辑体积之和。
images子命令主要支持如下选项, 用户可以自行进行尝试:
- -a, --all=true/false: 列出所有(包括临时文件)镜像文件,默认为否;
- –digests=true/false: 列出镜像的数字摘要值,默认为否;
- -f, --filter=[] : 过滤列出的镜像,如dangling =true 只显示没有被使用的镜像;也可指定带有特定标注的镜像等;
- –format=“TEMPLATE” : 控制输出格式,如. ID代表ID信息,.Repository 代表仓库信息等;
- –no-trunc=true/false: 对输出结果中太长的部分是否进行截断,如镜像的ID 信息,默认为是否;
- -q, --quiet=true/false: 仅输出ID信息, 默认为否。
[root@dbc-server-554 ansible]# docker images --digests=true
REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE
ubuntu 18.04 sha256:c1d0baf2425ecef88a2f0c3543ec43690dc16cc80d3c4e593bb95e4f45390e45 e28a50f651f9 7 days ago 63.1MB
[root@dbc-server-554 ansible]# docker images --no-trunc=true
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 18.04 sha256:e28a50f651f9eefbc8883ddc64704d609f3d95bf1ea9e41f873a8da68ea5ec98 7 days ago 63.1MB
[root@dbc-server-554 ansible]# docker images -f dangling=true
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@dbc-server-554 ansible]# docker images -q
e28a50f651f9
更多子命令选项还可以通过man docker-images
来查看。
为了方便在后续工作中使用特定镜像,还可以使用docker tag命令来为本地镜像任意添加新的标签。
格式:
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
例如,添加一个新的myubuntu: latest镜像标签:
[root@dbc-server-554 ansible]# docker tag ubuntu:18.04 myubuntu:latest
[root@dbc-server-554 ansible]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myubuntu latest e28a50f651f9 7 days ago 63.1MB
ubuntu 18.04 e28a50f651f9 7 days ago 63.1MB
再次使用docker images列出本地主机上镜像信息, 可以看到多了一个myubuntu:latest
标签的镜像,之后,用户就可以直接使用myubuntu:latest来表示这个镜像了。
细心的读者可能注意到, 这些myubuntu:latest镜像的ID跟ubuntu:latest是完全一致的,它们实际上指向了同一个镜像文件,只是别名不同而已。docker tag命令添加的标签实际上起到了类似链接的作用。
2.2.3 使用inspect命令查看详细信息(inspect)使用docker [image] inspect
命令可以获取该镜像的详细信息,包括制作者、适应架构、各层的数字摘要等,格式
docker inspect [OPTIONS] NAME|ID [NAME|ID...]
-f, --format="" Format the output using the given Go template
-h, --help[=false] help for inspect
-s, --size[=false] Display total file sizes if the type is container
[root@dbc-server-554 ansible]# docker inspect e28
[
{"Id": "sha256:e28a50f651f9eefbc8883ddc64704d609f3d95bf1ea9e41f873a8da68ea5ec98",
"RepoTags": [
"myubuntu:latest",
"ubuntu:18.04"
],
"RepoDigests": [
"ubuntu@sha256:c1d0baf2425ecef88a2f0c3543ec43690dc16cc80d3c4e593bb95e4f45390e45"
],
"Parent": "",
"Comment": "",
"Created": "2023-01-02T18:48:56.081327405Z",
...
此处以及后续使用IMAGE ID参数,只要能确定ID,只写前几位即可
上面代码返回的是一个 JSON 格式的消息, 如果我们只要其中一项内容时, 可以使 用-f
来指定, 例如, 获取镜像的Architecture:
[root@dbc-server-554 ansible]# docker image inspect -f {{.Architecture}} e28
amd64
[root@dbc-server-554 ansible]# docker image inspect -f {{.Os}} e28
linux
2.2.4 使用history命令查看镜像历史(history)既然镜像文件由多个层组成,那么怎么知道各个层的内容具体是什么呢?这时候可以使用history子命令,该命令将列出各层的创建信息。
格式:
docker history [OPTIONS] IMAGE
--format="" Pretty-print images using a Go template
-h, --help[=false] help for history
-H, --human[=true] Print sizes and dates in human readable format
--no-trunc[=false] Don't truncate output
-q, --quiet[=false] Only show image IDs
例如,查看ubuntu:18.04镜像的创建过程,可以使用如下命令:
[root@dbc-server-554 ansible]# docker image history e28
IMAGE CREATED CREATED BY SIZE COMMENT
e28a50f651f9 7 days ago /bin/sh -c #(nop) CMD ["bash"] 0B 7 days ago /bin/sh -c #(nop) ADD file:132da97f77ddc534d… 63.1MB
使用--no-trunc=true
显示长信息
[root@dbc-server-554 ansible]# docker image history --no-trunc=true e28
IMAGE CREATED CREATED BY SIZE COMMENT
sha256:e28a50f651f9eefbc8883ddc64704d609f3d95bf1ea9e41f873a8da68ea5ec98 7 days ago /bin/sh -c #(nop) CMD ["bash"] 0B 7 days ago /bin/sh -c #(nop) ADD file:132da97f77ddc534ddb931a461d83ac2aa601dd4481360c874eac33b6c3470d9 in / 63.1MB
2.3 搜索镜像(search)使用docker search命令可以搜索Docker Hub官方仓库中的镜像。格式:
docker search [OPTIONS] TERM
OPTIONS
-f, --filter= Filter output based on conditions provided
--format="" Pretty-print search using a Go template
-h, --help[=false] help for search
--limit=25 Max number of search results
--no-trunc[=false] Don't truncate output
例如, 搜索官方提供的带 nginx关键字的镜像
[root@dbc-server-554 ansible]# docker search -f=is-official=true nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 17920 [OK]
再比如, 搜索所有收藏数超过 4 的关键词包括httpd的镜像:
[root@dbc-server-554 ansible]# docker search --filter=stars=4 httpd
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
httpd The Apache HTTP Server Project 4291 [OK]
centos/httpd-24-centos7 Platform for running Apache httpd 2.4 or bui… 45
centos/httpd 36 [OK]
可以看到返回了很多包含关键字的镜像, 其中包括镜像名字、 描述、 收藏数(表示该镜像 的受欢迎程度)、 是否官方创建、 是否自动创建等。默认的输出结果将按照星级评价进行排序。
2.4 删除和清理镜像(rmi,prune) 2.4.1 使用标签删除镜像(rmi/rm)使用docker rmi
或docker image rm
命令可以删除镜像, 命令格式为
docker rmi [OPTIONS] IMAGE [IMAGE...]
其中 IMAGE可以为标签或 ID。 支持选项包括:
- -f, -force: 强制删除镜像, 即使有容器依赖它;
- -no-prune: 不要清理未带标签的父镜像。
[root@dbc-server-554 ansible]# docker rmi myubuntu
Untagged: myubuntu:latest
[root@dbc-server-554 ansible]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 18.04 e28a50f651f9 7 days ago 63.1MB
读者可能会想到, 本地的ubuntu:latest 镜像是否会受到此命令的影响。 无须担心, 当同一个镜像拥有多个标签的时候, docker rmi 命令只是删除了该镜像多个标签中的指定 标签而巳, 并不影响镜像文件。 因此上述操作相当于只是删除了镜像 0458a4468cbc的一 个标签副本而已。如果按指定ID删除,则会删除镜像本身。
2.4.2 使用镜像ID来删除镜像当使用 docker rmi 命令, 并且后面跟上镜像的 ID(也可以是能进行区分的部分 ID 串前缀)时, 会先尝试删除所有指向该镜像的标签, 然后删除该镜像文件本身。
注意,当有该镜像创建的容器存在时,镜像文件默认是无法被删除的,例如: 先利用 ubuntu:18.04镜像创建一个简单的容器来输出一段话:
[root@dbc-server-554 ansible]# docker run -it e28 echo "hello world"
hello world
使用docker ps -a命令可以看到本机上存在的所有容器:
[root@dbc-server-554 ansible]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fe01b86f100c e28 "echo 'hello world'" 14 seconds ago Exited (0) 13 seconds ago interesting_lumiere
69c9479cfafd ubuntu:18.04 "bash" 3 hours ago Exited (0) 3 hours ago angry_hofstadter
可以看到,后台存在一个退出状态的容器,是刚基于ubuntu:18.04镜像创建的。试图删除该镜像,Docker会提示有容器正在运行,无法删除:
[root@dbc-server-554 ansible]# docker rmi ubuntu:18.04
Error response from daemon: conflict: unable to remove repository reference "ubuntu:18.04" (must force) - container fe01b86f100c is using its referenced image e28a50f651f9
如果要想强行删除镜像, 可以使用-f
参数:
$ docker rmi -f ubuntu:18.04
注意, 通常并不推荐使用-f参数来强制删除一个存在容器依赖的镜像。 正确的做法是, 先删除依赖该镜像的所有容器, 再来删除镜像。
首先删除容器e28a50f651f9:
$ docker rm e28a50f651f9
然后使用ID来删除镜像, 此时会正常打印出删除的各层信息
2.4.3 清理镜像(prune)使用Docker一段时间后, 系统中可能会遗留一些临时的镜像文件, 以及一些没有被使用的镜像, 可以通过docker image prune
命令来进行清理(prune:消减 )。格式:
docker image prune [OPTIONS]
支待选项包括:
-a, -all: 删除所有无用镜像, 不光是临时镜像;
-filter FILTER: 只清理符合给定过滤器的镜像;
-f, -force: 强制删除镜像, 而不进行提示确认。
例如, 如下命令会自动清理临时的遗留镜像文件层, 最后会提示释放的存储空间:
$ docker image prune -f
...
Total reclaimed space: 1.4 GB
2.5 *创建镜像 (commit,import,build)创建镜像的方法主要有三种: 基于已有镜像的容器创建、 基于本地模板导入、 基于Dockerfile创建。
2.5.1 基于已有容器创建(commit)该方法主要是使用docker [container] commit
命令。格式:
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
OPTIONS
-a, --author="" Author (e.g., "John Hannibal Smith hannibal@a-team.com ⟨mailto:hannibal@a-
team.com⟩")
-c, --change= 提交的时候执行Dockerfile指令, 包括CMD,ENTRYPOINT,ENV,EXPOSE,LABEL,ONBUILD,USER,VOLUME,WORKDIR等;
-m, --message="" Commit message
-p, --pause[=true] Pause container during commit
下面将演示如何使用该命令创建一个新镜像:
[root@dbc-server-554 ansible]# docker run -it e28 bash
root@944742a90200:/# touch hello
root@944742a90200:/# ls
bin boot dev etc hello home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
docker [container] commit
命令来提交为一个新的镜像。提交时可以使用 ID 或名称来指定容器:[root@dbc-server-554 ansible]# docker commit -m "add a new file [hello]" -a "yurq" 944742a90200 hello:0.1
sha256:faae2335ff33a81fe1c3c305a0296002556af1506db9a986bc9c69426e059955
[root@dbc-server-554 ansible]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello 0.1 faae2335ff33 7 seconds ago 63.1MB
ubuntu 18.04 e28a50f651f9 7 days ago 63.1MB
2.5.2 基于本地模板导入(import)用户也可以直接从一个操作系统模板文件导人一个镜像,主要使用 docker [container] import 命令。 命令格式为
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
要直接导人一个镜像,可以使用 OpenVZ 提供的模板来创建,或者用其他已导出的镜像 模板来创建。
OPENVZ 模板的下载地址为http://openvz.org/Download/templates/precreated
。
[root@dbc-server-554 docker]# cat centos-7-x86_64-minimal.tar.gz |docker import - centos:7
sha256:2d8840b29c99c35ff00ef66b2e4707ea22d61b513736df406f4987a46d0aa57f
[root@dbc-server-554 docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 7 2d8840b29c99 3 seconds ago 435MB
hello 0.1 faae2335ff33 38 minutes ago 63.1MB
ubuntu 18.04 e28a50f651f9 7 days ago 63.1MB
2.5.3 基于 Dockerfile 创建(build)基于 Dockerfile 创建是最常见的方式。 Dockerfile 是一个文本文件,利用给定的指令描述基于某个父镜像创建新镜像的过程。
下面给出 Dockerfile 的一个简单示例,基于centos7镜像构建一个新的centos镜像:
[root@dbc-server-554 docker]# cat dockerfile
FROM centos:7
LABEL version="1.0" maintainer="newbee"
[root@dbc-server-554 docker]# docker build -t centos:test .
Sending build context to Docker daemon 145.6MB
Step 1/2 : FROM centos:7
--->2d8840b29c99
Step 2/2 : LABEL version="1.0" maintainer="newbee"
--->Running in b61ec2c18c24
Removing intermediate container b61ec2c18c24
--->286c9503509f
Successfully built 286c9503509f
Successfully tagged centos:test
Dockerfile强大的构建功能远远不止于此,而且非常关键。更多使用 Dockerfile 的技巧将将在后面进行介绍。
2.6 存出和载入镜像(save,load)本节主要介绍 Docker 镜像的 save 和 load 子命令。 用户可以使用docker [image] save
和docker [image] load
命令来存出和载入镜像。
要导出镜像到本地文件,可以使用docker [image] save
命令。该命令支持-o、--output string
参数,导出镜像到指定的文件中。 格式:
docker save [OPTIONS] IMAGE [IMAGE...]
OPTIONS
-h, --help[=false] help for save
-o, --output="" Write to a file, instead of STDOUT
示例:
[root@dbc-server-554 docker]# docker save -o centos7.tar centos:test
[root@dbc-server-554 docker]# ls
centos7.tar centos-7-x86_64-minimal.tar.gz dockerfile
存出的tar文件可以分享给其他人,通过下面load命令载入使用
2.6.2 载入镜像(load)可以使用docker [image] load
将导出的 tar 文件再导人到本地镜像库。支持-i、--input string
选项,从指定文件中读入镜像内容。 格式:
docker load [OPTIONS] IMAGE.tar
OPTIONS
-h, --help[=false] help for load
-i, --input="" Read from tar archive file, instead of STDIN
-q, --quiet[=false] Suppress(删除) the load output
示例:
Loaded image: centos:test
[root@dbc-server-554 docker]# docker rmi 286
Untagged: centos:test
Deleted: sha256:286c9503509fe18eb2d48c9eef585ee6bb8571c116781bad6f7956a33e05520d
[root@dbc-server-554 docker]# docker load -i centos7.tar
Loaded image: centos:test
[root@dbc-server-554 docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos test 286c9503509f 13 minutes ago 435MB
centos 7 2d8840b29c99 23 minutes ago 435MB
hello 0.1 faae2335ff33 About an hour ago 63.1MB
ubuntu 18.04 e28a50f651f9 7 days ago 63.1MB
不使用-i
,也可以使用重定向<
,结果相同,例如:
docker load< centos7.tar
2.7 上传镜像(push)本节主要介绍 Docker 镜像的 push 子命令。 可以使用docker [image] push
命令上 传镜像到仓库,默认上传到 Docker Hub 官方仓库(需要登录)。 命令格式为
docker [image] push NAME[:TAG] | [REGISTRY_HOST[:REGISTRY_PORT]/]NAME[:TAG]
OPTIONS
-a, --all-tags[=false] Push all tagged images in the repository
--disable-content-trust[=true] Skip image signing
-h, --help[=false] help for push
-q, --quiet[=false] Suppress verbose output
用户在 Docker Hub 网站注册后可以上传自制的镜像。
[root@dbc-server-554 docker]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: yurq
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
[root@dbc-server-554 docker]# docker tag hello:0.1 yurq/hello:0.1
[root@dbc-server-554 docker]# docker push yurq/hello:0.1
The push refers to repository [docker.io/yurq/hello]
2f8d78308466: Pushed
101b05ef38e1: Mounted from library/ubuntu
0.1: digest: sha256:6aa6a023469f4e2710f516aed3a9950902d8f03c21360a4b50f930202d58d2f0 size: 736
第一次上传时,会提示输入登录信息或进行注册,之后登录信息会记录到本地~/ . docker 目录下。
以后可以通过docker pull yurq/hello:0.1
下载镜像进行使用
命令 | 说明 |
---|---|
docker [image] pull NAME [ :TAG] | 获取镜像 |
docker images [ls] | 列出镜像 |
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG] | 添加标签 |
docker inspect [OPTIONS] NAME | ID [NAME |
docker history [OPTIONS] IMAGE | 镜像构建历史 |
docker search [OPTIONS] TERM | 查找镜像 |
docker rmi [OPTIONS] IMAGE [IMAGE…] | 删除镜像 |
docker image prune [OPTIONS] | 清理镜像 |
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] | 创建镜像(基于已有容器创建) |
docker import [OPTIONS] file | URL |
docker build -t centos:test. | 创建镜像(基于 Dockerfile 创建). 指当前路径 |
docker save [OPTIONS] IMAGE [IMAGE…] | 存出镜像 |
docker load [OPTIONS] IMAGE.tar | 载入镜像 |
docker [image] push NAME[:TAG] | [REGISTRY_HOST[:REGISTRY_PORT]/]NAME[:TAG] |
docker login | 登录https://hub.docker.com |
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧