欢迎访问网易云社区,了解更多网易技术产品运营经验。
2.2.2 Docker 镜像及操作
Docker 包含 3 个基本概念,分别是镜像(Image)、容器(Container)和仓库(Repository)。 镜像是 Docker 运行容器的前提,仓库是存放镜像的场所,可见镜像更是 Docker 的核心。
镜像作为 Docker 最突出的创新之一,它变革了软件交付标准。理解镜像,对理解整个 Docker 的生命周期非常重要。本节将围绕镜像这一核心概念,简明扼要地介绍镜像的各种 操作,带你玩转 Docker 镜像。
注:对镜像应用感兴趣的读者,还可以查看网易云推出的“玩转 Docker 镜像”系列图 文和视频。
1. 镜像层(Layers)
在镜像操作之前,首先了解下镜像的原理,其中最重要的概念就是镜像层(Layers)。 镜像层依赖于一系列的底层技术,比如文件系统(filesystems)、写时复制(copy-on-write)、 联合挂载(union mounts)等,如图 2-3 所示。读者可以在很多地方学习到这些技术,见 https://docs.docker.com/engine/userguide/storagedriver/imagesandcontainers/,这里就不再赘述 技术细节。
图 2-3 Docker 镜像的典型结构(图片来自 Docker 社区)
总的来说,最需要记住的一点是:在创建镜像时,每一条指令都会创建一个镜像层, 继而增加整体镜像的大小。
2. 获取镜像
可以使用 docker pull 从仓库注册中心获取所需要的镜像。
用法如下。
Usage: docker pull [OPTIONS] NAME[:TAG|@DIGEST]
举例来说
docker pull busybox
以上是从 Docker Hub(Docker 官方镜像仓库)中下载 tag 为 latest(默认)的 BusyBox (一个精简的Unix 工具集)镜像,同样你也可以从网易云的镜像中心中下载tag 为1.25 的镜像。
docker pull hub.c.163.com/library/busybox:1.25
注:想要终止 docker pull,按下 CTRL+C 组合键即可,更详细的使用方式请参考官方 说明:https://docs.docker.com/engine/reference/commandline/pull/。
3. 查看镜像
使用 docker images 可以列出主机上已有的镜像。
用法如下。
Usage: docker images [OPTIONS] [REPOSITORY[:TAG]]
举例如下。
指定仓库名和镜像。
更详细的使用方式请参考官方说明:https://docs.docker.com/engine/reference/commandline/ images/。
4. 创建镜像
有两种常用的方法来创建镜像。
基于已有镜像的容器创建,使用 docker commit 命令。
基于 Dockerfile 创建,使用 docker build 命令。
我们推荐第二种方式,因为 Dockerfile 能记录整个镜像的创建过程,后续的章节中将 重点介绍。
Dockerfile 使用细节请参考:https://docs.docker.com/engine/reference/builder/。
基于已有镜像的容器创建用法如下。
Usage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
举例如下。
更详细的使用方式请参考官方说明:https://docs.docker.com/engine/reference/commandline/ commit/。
5. 删除镜像
使用 docker rmi 来删除一个或多个镜像,可以通过“镜像名:标签名”来删除,也可 以通过“镜像 ID”来删除。
用法如下。
Usage: docker rmi [OPTIONS] IMAGE [IMAGE...]
举例如下。
注:
(1)可以通过 -f 选项来强行删除镜像,但是不推荐,因为这样往往会造成一些残 留问题,比如增加临时镜像。
(2)正确的做法是,先删除依赖该镜像的所有容器,再来删除镜像。
更详细的使用方式请参考官方说明:https://docs.docker.com/engine/reference/commandline/ images/。
6. 搜索镜像
使用 docker search 可以搜索远端仓库中共享的镜像。
用法如下。
Usage: docker search [OPTIONS] TERM
举例如下。
注:
(1)通过 --filter 选项筛选,查找更准确。
(2)通过 --limit 选项,限制展现数量。
(3)加上 -no-trunc 选项,将显示完整信息。
更详细的使用方式请参考官方说明:https://docs.docker.com/engine/reference/commandline/ search/。
7. 上传镜像
可以使用docker push来上传镜像到仓库,默认上传到DockerHub官方仓库(需要登录), 也可以上传到第三方的镜像仓库(比如网易云)。
用法如下。
Usage: docker push [OPTIONS] NAME[:TAG]
举例如下。
更详细的使用方式请参考官方说明:https://docs.docker.com/engine/reference/commandline/ push/。
8. 使用 Docker 仓库
正如前文所说,镜像集中存放在仓库(Repository)当中,仓库又可以分为公有仓库和 私有仓库。
本章我们将分别展示如何使用 Docker Hub 和网易云镜像中心进行登录、下载等基本操 作,最后还将介绍如何创建和使用私有仓库。
注:容易与仓库(Repository)混淆的概念是注册服务器(Registry),实际上注册服务 器是存放仓库的具体服务器,每个服务器上可以有多个仓库,而每个仓库下面有多个镜像, 每个镜像又可能有不同的标签(tag),和 Git 很相似。举例来说,hub.c.163.com/public/ ubuntu:16.04 中 hub.c.163.com 是注册服务器地址,public 是用户工作空间,ubuntu 是仓库 名,16.04 是标签名。
Docker Hub 公有仓库
Docker Hub 是全球最大的 Docker 共有仓库,截止到 2016 年 10 月,Docker Hub 中已 经有 40 万个公共镜像(每周 4~5 倍的增长),更关键的是累计有 60 亿次的下载数,可见 Docker Hub 的潜力。
登录
通过 docker login 来登录,默认登录 Docker Hub。
Usage: docker login [OPTIONS] [SERVER]
举例如下。
登录完成之后,将会在用户目录的 .docker 目录下,保存用户的认证信息。
基本操作
用户可以通过 docker search 来查找镜像,通过 docker pull 来拉取镜像,再通过 docker push 来推送镜像。
网易云镜像中心
网易云镜像中心分为私有镜像中心和公共镜像中心。
私有镜像中心
私有镜像中心是用户私人镜像仓库的管理中心,管理以下两类镜像仓库。
(1)自定义的镜像仓库:用户有完整操作权限的镜像仓库,镜像来源包括通过 Dockerfile 创建的自定义镜像、从网易云另存为的自定义镜像,以及 Docker 客户端创建的自定义镜像。
(2)收藏的镜像仓库:从网易云镜像中心(https://c.163.com/hub/)收藏的官方、第三 方公开镜像。
网易云私有镜像中心的层级结构如图 2-4 所示。
图 2-4 网易云私有镜像中心层级结构
每一层都支持各种操作。
(1)私有镜像中心层:支持创建镜像仓库、列出所有镜像仓库等。
(2)镜像仓库层:支持通过 Dockerfile 构建新镜像、设置镜像仓库的访问控制权限等。
(3)版本层:支持删除一个特定的版本等。
公共镜像中心
公共镜像中心为开发者提供了公共镜像仓库服务,无需登录认证就可以下载使用,登 录后即可对公开镜像进行收藏和部署,满足开发者的搜索、开发、分享镜像等需求。
使用场景
本地搭建测试环境,可以使用公有镜像中心拉取官方镜像部署。目前,网易云提供以 下 3 种类型镜像。
(1)Docker Hub 官方镜像。
(2)网易云官方镜像。
(3)网易云用户公开的镜像。
搭建和使用私有仓库
安装 Docker 后,可以通过官方提供的 registry 镜像来简单快速地搭建一套本地私有仓 库环境。
$ sudo docker run -d -p 5000:5000 registry
默认情况下,仓库被创建在容器的 /tmp/registry 下,可以通过 -v 参数来将镜像文件存 放在本地的指定路径。例如下面的例子将上传的镜像放到 /opt/data/registry 目录。
$ sudo docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry
私有仓库安装完毕,接下来就可以在私有仓库搜索、下载和上传你的镜像了。
文章节选自《云原生应用架构实践》 网易云基础服务架构团队 著
网易云计算基础服务深度整合了 IaaS、PaaS 及容器技术,提供弹性计算、DevOps 工具链及微服务基础设施等服务,帮助企业解决 IT、架构及运维等问题,使企业更聚焦于业务,是新一代的云计算平台。点击可免费试用。