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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343