docker 镜像相关指令
1. 获取镜像
docker [image] pull NAME[:TAG]
例子 docker pull ubuntu
其中
image
关键字可以省略-
TAG
省略则会拉取最新版本
在生产环境中不推荐省略TAG
标签,因为镜像的latest
标签意味着镜像的内容会跟踪最新版本的变更而变化,内容是不稳定的。 -
NAME
是指镜像的名称
严格的讲,这里的名称是指官方 Docker Hub 中的镜像名称,若要使用其他仓库的镜像,需要指定其他仓库的仓库名称,比如docker pull docker.elastic.co/elasticsearch/elasticsearch:6.5.4
即是拉取 elastic 官方自己仓库中的 elasticsearch 镜像。
2. 查看镜像信息
2.1 使用 images 命令列出镜像
使用 docker images
或者 docker image ls
可以列出本地主机上已有镜像的基本信息,例如:
PS C:\Users\刘跃群\Desktop> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
python 3 20daf30b695a 3 hours ago 95.1MB
ubuntu 18.04 9d799195e757 3 hours ago 0B
test 0.1 1063aff97a5c 3 hours ago 86.7MB
wean2018/test latest 1063aff97a5c 3 hours ago 86.7MB
postgres 9.6 ed34a2d5eb79 2 weeks ago 230MB
mysql latest 102816b1ee7d 3 weeks ago 486MB
cassandra 3 8dd9c5333d40 3 weeks ago 323MB
debian stretch-slim bd04d03c4529 3 weeks ago 55.3MB
ubuntu <none> 1d9c17228a9e 3 weeks ago 86.7MB
kong latest 2d06586eb1a8 4 weeks ago 92.3MB
docker.elastic.co/elasticsearch/elasticsearch 6.5.4 93109ce1d590 4 weeks ago 774MB
mcr.microsoft.com/mssql/server 2017-latest 314918ddaedf 4 weeks ago 1.35GB
pgbi/kong-dashboard latest 4c8dedf31b76 2 months ago 96.3MB
redis 3.2 87856cc39862 3 months ago 76MB
kepkin/kong-react-admin latest 914eb70b4fea 4 months ago 33.2MB
node 4.3.0 ce67537dc510 2 years ago 643MB
在列出的信息中,可以看到几个字段信息:
- 来自于哪个仓库, 比如 ubuntu 表示 ubuntu 系列的基础镜像
- 镜像的标签信息,比如 18.04、latest 表示不同的版本信息。标签只是标记,并不能标识镜像内容;
- 镜像的 ID(唯一标识镜像),如果两个镜像的 ID 相同,说明它们实际上指向了同一个镜像,只是具有不同的标签名称而已;
- 创建时间,说明镜像最后的更新时间;
- 镜像大小,优秀的镜像往往体积都比较小。
其中镜像的 ID 十分重要,它唯一地表示了镜像。在使用镜像 ID 的时候,一般可以使用该 ID 的前若干哥字符组成的可区分串来替代完整的 ID,这点和 git 是一样的。
另外镜像的大小信息只是表示了该镜像的逻辑体积的大小,实际上由于相同的镜像层本地只会存储一份,物理上占用的存储空间会小于各镜像逻辑体积之和。
2.2 使用 tag 命令添加镜像标签
为了方便后续工作中使用特定镜像,还可以使用 docker tag 命令来为本地镜像任意添加新的标签。例如,给本地的 test:0.1 镜像添加一个 wean2018/test:latest 标签:
docker tag test:0.1 wean2018/test:latest
2.3 使用inspect 命令查看详细信息
docker [image] inpspect NAME[:TAG]
命令可以用来获取该镜像的详细信息,包括制作者、适应架构、各层的数字摘要等:
PS C:\Users\刘跃群\Desktop> docker inspect test:0.1
[
{
"Id": "sha256:1063aff97a5ce7a1b972b955ffac6c2118c7b1912a3a52573abda4899e3c50da",
"RepoTags": [
"test:0.1",
"user/test:latest",
"wean2018/test:latest"
],
"RepoDigests": [
"wean2018/test@sha256:c8545bacc81ccf460a5ae1c94cc39afcb91df6e006f63550b1c89f8d6d3d0608"
],
"Parent": "sha256:1d9c17228a9e80a0a23927f24f3cf17d012cf0bb3eae5e3541a8c6987ab9bd5a",
"Comment": "Added a new file",
"Created": "2019-01-20T08:57:42.2839236Z",
"Container": "3ae5d17d8db5f6715bd92da8a06639ddbd11cc311bd881ff90176880953328b7",
"ContainerConfig": {
"Hostname": "3ae5d17d8db5",
"Domainname": "",
"User": "",
"AttachStdin": true,
"AttachStdout": true,
"AttachStderr": true,
"Tty": true,
"OpenStdin": true,
"StdinOnce": true,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/bash"
],
"Image": "ubuntu:18.04",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {}
},
"DockerVersion": "18.09.0",
"Author": "Docker Newbee",
"Config": {
"Hostname": "3ae5d17d8db5",
"Domainname": "",
"User": "",
"AttachStdin": true,
"AttachStdout": true,
"AttachStderr": true,
"Tty": true,
"OpenStdin": true,
"StdinOnce": true,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/bash"
],
"Image": "ubuntu:18.04",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {}
},
"Architecture": "amd64",
"Os": "linux",
"Size": 86702353,
"VirtualSize": 86702353,
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/729aa0baf4f534ca8824321f9368e72919c74c161ffda1ccc1eeb64d6af01531/diff:/var/lib/docker/overlay2/501ebf44d7dbc1762b69c269b20a75bab85607a462df6a4a87227da5156f5fbd/diff:/var/lib/docker/overlay2/668f7b37f582b9cbd544dd82dde1725487f53da7d2adfd4de1ec8dd3c1db7fb8/diff:/var/lib/docker/overlay2/259d69ed5e10906f7b08bf38421a258f1a1962b23e0cfc7b5e629ef63a0cdda2/diff",
"MergedDir": "/var/lib/docker/overlay2/b1c544330b75e70ffaf457839acd662491e3bf1bc31d33403d8c4faa51ae805f/merged",
"UpperDir": "/var/lib/docker/overlay2/b1c544330b75e70ffaf457839acd662491e3bf1bc31d33403d8c4faa51ae805f/diff",
"WorkDir": "/var/lib/docker/overlay2/b1c544330b75e70ffaf457839acd662491e3bf1bc31d33403d8c4faa51ae805f/work"
},
"Name": "overlay2"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:2fb7bfc6145d0ad40334f1802707c2e2390bdcfc16ca636d9ed8a56c1101f5b9",
"sha256:c8dbbe73b68c96e3252f8191226b700d4f4b284154624fa40a2e6a0c42712a0d",
"sha256:1f6b6c7dc482cab1c16d3af058c5fa1782e231cac9aab4d9e06b3f7d77bb1a58",
"sha256:2c77720cf318a4c7eaee757162e6bfc364c3ed83a96a525bc20c548e0f75f1af",
"sha256:3d3290f7b3d08bc0a09d9c86cb1a9d4fa051e37382644cd1932761fc51a20445"
]
},
"Metadata": {
"LastTagTime": "2019-01-20T11:43:46.6549711Z"
}
}
]
2.4 使用 history 命令查看镜像历史
既然镜像文件是由多个层组成,那么怎么知道各个层的具体内容是什么呢?这时候可以使用 history 子命令,该命令将列出各层的创建信息
例如查看 test:0.1 镜像的创建过程:
PS C:\Users\刘跃群\Desktop> docker history test:0.1
IMAGE CREATED CREATED BY SIZE COMMENT
1063aff97a5c 3 hours ago /bin/bash 16B Added a new file
1d9c17228a9e 3 weeks ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 3 weeks ago /bin/sh -c mkdir -p /run/systemd && echo 'do… 7B
<missing> 3 weeks ago /bin/sh -c rm -rf /var/lib/apt/lists/* 0B
<missing> 3 weeks ago /bin/sh -c set -xe && echo '#!/bin/sh' > /… 745B
<missing> 3 weeks ago /bin/sh -c #(nop) ADD file:c0f17c7189fc11b6a… 86.7MB
其中过长的命令被自动截断了,可以使用 --no-trunc
选项来输出完整的命令。
3. 搜寻镜像
使用 docker search 命令可以搜索 Docker Hub 官方仓库中的镜像。语法为 docker search [option] keyword。支持的命令选项主要包括:
- -f ,--filter filter:过滤输出的内容
- --format string:格式化输出内容
- -limit int:限制输出结果个数,默认为 25 个
- --no-trunc:不截断输出结果。
例如,搜索官方提供的 nginx 关键字的镜像,如下所示
PS C:\Users\刘跃群\Desktop> docker search -f is-official=true nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 10744 [OK]
4. 删除和清理镜像
4.1 使用标签删除镜像
使用 docker rmi 或 docker image rm 命令可以删除镜像,命令格式为 docker rmi IMAGE [IMAGE...],其中 IMAGE 可以是标签或镜像的 ID(也可以是能进行区分的部分 ID 串前缀)。
需要注意的是,当有该镜像创建的容器存在时,镜像文件默认是无法被删除的,如果要强行删除,则使用 -f 参数。但是通常并不推荐使用 -f 参数来强制删除一个存在容器依赖的镜像。正确的做法时先删除依赖该镜像的所有容器,再来删除镜像。
4.2 清理镜像
使用 Docker 一段时间后,系统中可以会遗留一些临时的镜像文件,以及一些没有被使用的镜像,可以通过 docker image prune
命令来清理。
5. 创建镜像
创建镜像的方法主要有三种:基于已有镜像的容器创建、基于本地模板导入、基于 Dockerfile 创建。
本节主要介绍 Docker 的 commit、import 和 build 子命令。
5.1 基于已有容器创建
该方法主要是使用 docker [container] commit 命令。
命令格式为 docker [container] commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
,主要选项包括
- -a, --author="" : 作者信息
- -c, --change=[] : 提交的时候执行 Dockerfile 指令,包括 CMD|ENTRYPOINT|ENV|EXPOSE|LABLE|ONBUILD|USER|VOLUME|WORKDIR 等
- -m, --message="" : 提交消息
- -p, --pause=true: 提交时暂停容器运行。
例如
docker commit -m "test" -a "wean" a925 test:0.1
这行命令就是把本地一个容器 ID 开头为 a925 的容器打包成镜像,命名为 test,tag 为 0.1。
5.2 基于本地模板导入
用户也可以直接从一个操作系统模板文件导入一个镜像,主要使用 docker [container] import 命令。命令格式为 docker [image] import [OPTIONS] file|URL|-[REPOSITORY[:TAG]]
要直接导入一个镜像,可以使用 OpenVZ 提供的模板来创建,或者用其他已经导出的镜像模板来创建。 OPENVZ 模板的下载地址为 https://wiki.openvz.org/Download/template/precreated
例如,下载了 unbuntu-18.04 的模板压缩包,之后使用一下命令导入即可:
cat ubuntu-18.04-x86_64-minimal.tar.gz | docker import - ubuntu:18.04
5.3 基于 Dockerfile 创建
基于 Dockerfile 创建时最常见的方式。Dockerfile 是一个文本文件,利用给定的指令描述基于某个父镜像创建新镜像的过程。
下面给出一个简单的 Dockerfile 示例,基于 debian:streatch-slim 镜像安装 Python 3 环境,构建一个新的 python:3 镜像:
FROM debian:stretch-slim
LABEL version="1.0" maintainer="docker user <docker_user@github>"
RUN apt-get update && \
apt-get install -y python3 && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
创建镜像的过程可以使用 docker [image] build 命令,编译成功后本地将多出一个 python:3 镜像:docker build -t python:3 .
6. 存出和载入镜像
6.1 存出镜像
如果要导出镜像到本地文件,可以使用 docker [image] save 命令。该命令支持 -o、-output string 参数,导出镜像到指定的文件中。例如:
docker save -o ubuntu_18.04.tar ubuntu:18.04
之后就可以通过复制 ubuntu_18.04.tar 文件将该镜像分享给他人。
6.2 载入镜像
使用 docker [image] load 可以将导出的镜像文件导入到本地镜像库。支持 -i、-input string 选项,从指定的文件中读入镜像内容。例如
PS C:\Users\刘跃群\Desktop> docker load -i .\ubuntu_18.04
Loaded image: ubuntu:18.04
这将导入镜像机器相关的元数据信息(包括标签等)。
7. 上传镜像
docker 上传镜像到仓库的命令为 docker [image] push [REGISTRY_HOST[:REGISTER_PORT]/]NAME[:TAG]。
例如
docker push wean2018/test:0.1