Docker 镜像

本文详细介绍了Docker镜像的管理,包括如何从DockerHub获取镜像、配置国内镜像源、搜索镜像、查看镜像信息、创建镜像、启动容器、删除镜像以及镜像的导出和载入。重点讨论了基于Dockerfile创建镜像的过程,以及如何使用commit和inspect命令操作镜像。
摘要由CSDN通过智能技术生成

介绍

镜像是 Docker 中重要的概念,Docker 把应用程序及其依赖打包在 Image 文件中。然后 Docker 通过加载 Image 文件载入生成容器实例。Image 文件可以看作是容器的模板。Docker 根据 Image 文件生成实例,同一个 Image 可以生成多个同时运行的容器实例。
Image 是一个二进制文件,通常一个 Image 都是通过继承另一个父镜像,加上一些新的个性化设置之后生成的。例如,在一个 Ubuntu 的镜像上可以添加 Nginx 形成新的镜像。

父镜像

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-15dUcsbO-1654280186848)(docker-filesystems-multilayer.png)]
每个镜像都可能依赖一个或多个下层组成的另一个镜像。所依赖的下层镜像也就是上层镜像的父镜像

基础镜像

一个没有任何父镜像的镜像

镜像 ID

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v3M8V9xq-1654280186850)(docker-container.png)]
每个镜像都是通过一个 64 位的十六进制的字符串 (内部是一个 256 bit 的值) 作为唯一标识。为了简化使用,前 12 个字符可以组成一个短 ID,可以在命令行中使用。但是短 ID 还是有一定的碰撞几率,所以服务器总是返回长 ID。

获取镜像

可以使用如下命令从 Docker Hub 仓库获取仓库中的镜像。

sudo docker [image] pull image-name[:tag]

pull 镜像时,如果不显示的指定镜像 TAG,则默认会选择 latest 标签,latest 标签的镜像与最新版本镜像 ID通常相同,表示它们其实是同一个镜像文件。
从 Docker Hub 获取 Ubuntu 14.04 的镜像。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cOf9Ucl7-1654280186850)(docker-pull-image.png)]
从输出内容可以看到 Ubuntu 包含了 4 个镜像层。
该命令实际上相当于 $ sudo docker pull registry.hub.docker.com/ubuntu:14.04,指明从 registry.hub.docker.com 中下载 tag 为 14.04 的镜像。
但是由于某些大家都懂的原因,使用官方提供的 Docker Hub 注册服务器中下载比较慢,可以配置从其他仓库下载。

配置国内镜像源

编辑 /etc/docker/daemon.json 文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Tvk6ltue-1654280186851)(docker-config-china-source.png)]
我的是 Archlinux 安装之后已经配置了几个常用国内源,但是阿里云的镜像源需要将 URL 修改一下。这里需要注册阿里云账号,然后获取你自己的专用 URL。这里就不介绍了,可以自己去搜索引擎查找一下有很多介绍。其中具体的 URL 代表的源参照下面说明:

  • Docker 官方中国区 : https://registry.docker-cn.com
  • 网易镜像源 : http://hub-mirror.c.163.com
  • 中科大镜像源 : http://docker.mirrors.ustc.edu.cn
  • 阿里云镜像源 : http://<唯一ID>.mirror.aliyuncs.com

搜索镜像

官方提供的 Docker Hub 中现已有几十万个镜像,如果想要在当中找寻对自己有用的镜像文件,不可能一个一个去看。可以使用 search 子命令搜索仓库中的镜像。语法为 docker search [option] keyword。支持命令选项主要包括:

  • -f, --filter filter : 过滤输出内容。
  • –format string : 格式化输出内容。
  • –limit int : 限制输出结果个数,默认为25个。
  • –no-trunc : 不截断输出结果。
    例如搜索官方提供的带有 nginx 关键字的镜像:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j7tNjljx-1654280186851)(docker-search-image.png)]
    这里我有一个脚本,可以查看 Docker Hub 上镜像的所有标签信息,详情查看我的 Github

查看镜像信息

查看本地镜像

使用 docker images 或者 docker image ls 两个命令,可以查看所有本地镜像。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u41nhOEJ-1654280186852)(docker-show-local-images.png)]
上面就可以看到本地的镜像。其中几个字段信息:

  • REPOSITORY : 镜像的仓库名,如 nginx
  • TAG : 镜像的标签
  • IMAGE ID : 镜像的短 ID (唯一)
  • CREATE : 创建时间
  • SIZE : 镜像大小
    镜像 ID 标识了镜像的唯一性,但是可能在同一个仓库名中有相同的 ID 的镜像,这说明它们实际上是同一个镜像。
    TAG 用来标识同一仓库中的不同镜像,例如 Ubuntu 有多个镜像,通过 TAG 信息来区分发行版本,例如 12.04、14.04 等。如果不指定镜像的具体标记,则默认使用 latest 来标记。
    image 子命令主要有以下的一些选项。
  • -a, --all=true|false : 列出所有 (包括临时文件) 镜像文件,默认为否。
  • –digests=true|false : 列出镜像的数字摘要值,默认为否。
  • -f,–filter=[] : 过滤列出的镜像,如dangling=true只显示没有被使用的镜像;也可以指定带有特定标注的镜像等。
  • –format=“TEMPLATE” : 控制输出格式,如 .ID 代表 ID 信息,.Repository 代表仓库信息等。
  • –no-trunc=ture|false : 对输出结果镜像截断,默认为是。
  • -q, --quiet=ture|false : 仅输出 ID 信息,默认为否

更多命令选项可以还可以通过 man docker-images 查看。

查看镜像详细信息

使用 docker [image] inspect 命令可以获取镜像的详细信息,包括制作者、适应架构、各层数字摘要等。

$ docker inspect ubuntu-nginx:v1
[
    {
        "Id": "sha256:fd54c64ac918eb5f913d8b1b7a04fe33089fecbbdcd6959d916d090815baadfc",
        "RepoTags": [
            "ubuntu-nginx:v1"
        ],
        ...
    }
]

上面的输出内容返回的是一个 JSON 格式详细镜像信息,如果需要选取只返回其中的某一项内容时,可以使用 -f 指定,例如,获取镜像的 Architecture :

$ docker inspect -f {{".Architecture"}} ubuntu-nginx:v1
amd64

查看镜像历史信息

使用 history 子命令将列出镜像各层的创建信息。
例如,查看 ubuntu-nginx:v1镜像的创建过程:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7tzaIxVD-1654280186852)(docker-image-history.png)]
*注意,过长的命令会被自动截断,可以使用 --no-trunc 选项指定输出完整命令。

启动镜像

容器使用 docker run 启动,例如启动前面下载的 Ubuntu 14.04 版本的 Image。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O7ghDV6b-1654280186853)(docker-run-ubuntu-image.png)]

创建镜像

创建镜像的方法主要有三种,基于已有镜像容器创建、基于本地模板导入、基于 Dockerfile 创建。

基于已有镜像创建

首先启动前面下载的 Ubuntu 镜像,参照上面启动镜像。
命令的格式为 docker [container] commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]],主要选项包括:

  • -a, --author=“”: 作者信息。
  • -c, --change=[]:提交的时候执行 Dockerfile指令, 包括 CMD|ENTRYPOINT|ENV|EXPOSE|LABEL|ONBUILD|USER|VOLUME|WORKDIR等。
  • -m, --message=“”: 提交信息。
  • -p, --pause=true: 提交时暂停容器运行。
    下面使用该命令创建一个新镜像。
    更新 Ubuntu 源然后安装 Nginx:
sudo apt-get update # 更新 Ubuntu 源
sudo apt-get install nginx # 安装 Nginx

安装完成之后使用 exit 退出容器,现在镜像已被修改,之后使用 docker commit 提交修改:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eCCWMTpu-1654280186853)(docker-modify-ubuntu-add-nginx.png)]
再次使用 docker images 查看本地的镜像可以看到新镜像:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lXqQ9WAJ-1654280186854)(docker-show-new-ubuntu-image.png)]
之后可以尝试启动修改之后的镜像。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QAvosnoE-1654280186854)(docker-run-ubunt-nginx-image.png)]
可以看到该镜像当中已经安装了 Nginx。

基于本地模板导入

使用 docker import 引入镜像模板。命令格式:

docker [image] import [OPTIONS] file|URL|-[REPOSITORY[:TAG]]。

可以使用 OpenVZ 提供的模板,或者用其他已导出的镜像模板创建。
例如,从 OpenVZ 下载 CentOS 7 镜像模板并导入到本地镜像中。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hXYp6yCp-1654280186854)(docker-import-openvz-template-image.png)]

Dockerfile 创建镜像

基于 Dockerfile 创建是最常见的方式。Dockerfile 是一个文本文件,利用给定的指令描述基于某个父镜像创建新镜像的过程。
如下便是基于 ubuntu:14.04 镜像安装 nginx,构成一个新的 ubuntu-nginx 镜像。

  • 创建 Dockerfile 文件
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GkUKw0wx-1654280186855)(docker-mk-dockerfile.png)]
    Dockerfile 中每一个指令都会在镜像上创建一个新的层,所以为了镜像简洁美观,尽量把相同的指令结合使用一个 run 指令执行,毕竟你也不想在 pull 的时候看着有几十个眼花缭乱的分层。
  • 编辑 Dockerfile
# Make ubuntu-nginx image from dockerfile

# Pull base image.
FROM ubuntu:14.04

# Auth info
MAINTAINER Leor Cao <leor_cao@163.com>

# Update ubuntu and install nginx.
RUN \
    apt-get update --fix-missing && \
    apt-get install nginx -y && \
    apt-get clean && \
    apt-get autoclean

详细的后面再独立开帖子介绍。Dockerfile 也是一个比较重要的功能。
编写完成 Dockerfile 后用 docker build 指令生成镜像。

sudo docker build -t="ubuntu-nginx:v2" .

-t : 镜像的仓库名与 TAG 用 : 号分割;最后的 “.” 会在当前目录下找寻 Dockerfile。也可以替换为一个具体的 Dockerfile 的路径。

  • 注意一个镜像不能超过 127 层。
    现在可以使用新创建的镜像启动一个新的容器。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e5w8uFZt-1654280186855)(docker-run-dockerfile-build-image.png)]

移除本地镜像

使用标签删除镜像

使用 docker rmi 或者 docker image rm 命令 可以删除镜像,命令格式为:

docker rmi IMAGE [IMAGE ...]
docker image rm IMAGE [IMAGE ...]

支持的选项如下:

  • -f, --force : 强制删除镜像,即使有容器依赖它。
  • –no-prune : 不要清理未带标签的父镜像
    这里查看我本地的镜像:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dyL6SI7V-1654280186856)(docker-rm-image-show-lcoal-image.png)]
    可以看到两个 ID 完全相同的镜像,现在我要删除 ubuntu-nginx:dev 这个镜像。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gf3fQFEw-1654280186856)(docker-rm-identical-id-image.png)]
    再次使用 docker images 查看本地所有本地镜像:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cDVXpUQu-1654280186857)(docker-rm-image-show-local-images.png)]
    可以看到并没有删除 ID 相同的 ubuntu-nginx:v2 镜像,这里只删除了这个镜像的一个副本,因为镜像 ID 相同表示这两个镜像实际指向的是同一个镜像,如果此时再将 ubuntu-nginx:v2 镜像也删除的话,则会彻底移除镜像文件。

使用镜像 ID 删除镜像

当使用 docker rmi 后面跟上镜像 ID 时,则与使用标签删除不同。它的执行流程会先将所有指向这个镜像的标签删除,之后再删除镜像文件本身。
如使用 docker rmi 1061c7052755。这时,会先删除 “ubuntu-nginx:dev” 与 “ubuntu-nginx:v2” 这两个标签,然后再将 1061c7052755 镜像文件删除。
* 注意 : 默认是不可以删除一个已经运行容器的镜像。例如:leor/mysql:v1 这个镜像已经创建了一个未执行的镜像。尝试删除该镜像:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U09dAJyA-1654280186857)(docker-rmi-run-continer-image.png)]
从提示的错误信息可以看到需要使用 force 才能删除,并提示不能删除的原因为:这个镜像已经被 container 22e25e99f287 依赖不能被删除。
当然如果你实在看它不爽,非得要干掉它,从上面的提示也可以看到可以使用 -f 或者 --force 选项强制删除镜像。
但不推荐这么做。正常流程应该先使用 docker stop 发送信号停止容器,再使用 docker rm 移除容器,最后再删除镜像文件。

清理镜像

通过 docker image prune 命令清理一些无用的镜像或者临时镜像。支持的选项:

  • -a, --all : 删除所有无用镜像,不光是临时镜像。
  • –filter filter : 只清理符合给定过滤条件的镜像。
  • -f, --force : 强制删除镜像,而不进行提示确认。
    例如,如下命令会强制清除临时的遗留镜像文件层,最后会返回释放的存储空间:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7g55EtjF-1654280186858)(docker-clean-temp-image.png)]

修改镜像 TAG

可以使用 docker tag 命令修改镜像的标签。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nxmiyafP-1654280186858)(docker-change-image-tag.png)]

镜像导出与载入

镜像导出

使用 docker save 命令,可以将镜像导出到本地文件。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tEF0OJmo-1654280186858)(docker-save-image-2-local.png)]

镜像载入

使用 docker load 命令,可以将导出的镜像文件载入到本地镜像库。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CJBRgAAI-1654280186859)(docker-load-image.png)]
或者可以使用 docker load < file 载入

上传镜像

使用 docker push 命令可以将修改、创建的镜像,上传到仓库。默认上传到 Docker Hub 官方仓库 (需要登录)。命令格式为:

docker [image] push NAME[:TAG] | [REGISTRY_HOST[:REGISTRY_PORT]/] IMAGE_NAME[:TAG]

例如,用户 leor 上传本地的 leor/mysql 镜像,可以先添加标签 leor/mysql:v1, 然后用 docker push 命令上传镜像:

$ docker tag leor/mysql:v1 leor/mysql:v1
$ docker push leor/mysql:v1
The push refers to a repository [docker.io/leor/mysql]
Sending image list

please login prior to push:
Username:
Password:
Email:

第一次上传时,会提示输入登录信息或进行注册,之后登录信息会记录到本地~/.docker目录下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值