Docker 教程

Docker Hub 与镜像仓库

Docker Hub 和镜像仓库(Image Registries)是整个容器化生态系统的枢纽,它们让分享和分发 Docker 镜像变得无比顺畅。通过它们,你可以直接获取别人已经构建好的镜像,把精力集中在开发和部署应用上,而不需要每次都从零开始造轮子。

1. 什么是 Docker Hub?

Docker Hub 是 Docker 官方提供的公共镜像仓库。它是一个基于云的服务,允许你存储和分享 Docker 镜像。这里汇聚了由个人开发者、开源项目以及软件供应商贡献的海量镜像。

1.1 Docker Hub 的核心功能

  • 镜像托管 (Image Hosting): Docker Hub 托管着数量庞大的公共和私有 Docker 镜像。
  • 公共仓库 (Public Repositories): 所有人都可以看到的仓库,通常用于分享开源软件或社区镜像。
  • 私有仓库 (Private Repositories): 只有你和你的团队成员才能访问的仓库,通常用于存放公司内部的商业应用镜像。请注意,根据使用量的不同,私有仓库通常需要付费订阅。
  • 自动化构建 (Automated Builds): Docker Hub 可以监听源代码仓库(如 GitHub 或 Bitbucket),当源代码发生变化时,它会自动根据代码中的 Dockerfile 重新构建并生成新的镜像。
  • 团队与组织 (Teams and Organizations): 你可以在 Docker Hub 上创建团队和组织,方便管理访问权限并在镜像开发上进行协作。
  • Webhooks: 当有新镜像推送到仓库时,Webhooks 可以触发其他系统执行特定动作。例如,你可以配置一个 Webhook,在最新镜像就绪时自动触发应用的线上部署。

1.2 探索 Docker Hub

你可以通过网页界面或者 Docker 命令行工具(CLI)来探索 Docker Hub。

  • 网页界面: 在浏览器中访问 Docker Hub 官网。你可以通过关键词搜索镜像,筛选“官方镜像”,并查看镜像的详细信息,包括描述、版本标签(tags)以及拉取命令。
  • Docker 命令行 (CLI): 使用 docker search 命令可以直接在终端中搜索镜像:
docker search nginx

这条命令会列出所有与搜索词 "nginx" 匹配的镜像列表,并显示它们的描述、收藏星数以及是否为官方镜像。

1.3 从 Docker Hub 拉取镜像

要在本地使用 Docker Hub 上的镜像,你需要使用 docker pull 命令将它拉取(下载)到你的电脑上:

docker pull nginx:latest

这条命令会从 Docker Hub 下载 nginx 镜像的最新版本。冒号后面的 :latest 是一个标签 (tag),用来指定你要拉取的具体版本。如果你不写标签,Docker 默认会拉取带有 latest(最新)标签的镜像。

1.4 Docker Hub 命名空间

在 Docker Hub 上,镜像是按照命名空间 (namespaces) 来组织的。一个命名空间通常对应一个用户账号或组织账号。镜像的完整名称格式为 用户名/镜像名组织名/镜像名。对于官方镜像,用户名会被省略(例如,直接叫 nginx)。

举个例子,如果你的 Docker Hub 用户名是 myuser,并且你创建了一个名为 webapp 的镜像,那么这个镜像的完整名称就是 myuser/webapp

1.5 官方镜像 (Official Images)

Docker Hub 包含了一系列“官方镜像”。这些镜像是经过 Docker 官方或软件原始供应商严格审核和维护的高质量镜像。它们通常非常安全且保持最新状态。官方镜像会带有一个蓝色的认证标记。常见的官方镜像包括 nginxubuntupython 等。

1.6 实战演练:拉取并运行 Nginx 镜像

1. 拉取 Nginx 镜像:

docker pull nginx:latest

2. 运行 Nginx 容器:

docker run -d -p 80:80 nginx:latest

这条命令会在后台(独立模式 -d)运行 Nginx 容器,并将你电脑主机的 80 端口映射到容器内部的 80 端口(-p 80:80)。现在,打开浏览器访问 http://localhost,你就能看到 Nginx 的欢迎页面了。

2. 深入理解镜像仓库 (Image Registries)

镜像仓库是用于存储和分发 Docker 镜像的系统。Docker Hub 是默认的公共仓库,但你也可以使用私有仓库,将镜像安全地存储在公司自己的服务器或云平台上。

2.1 镜像仓库的类型

  • 公共仓库 (Public Registries): 像 Docker Hub 这样,对所有人开放,任何人都可以下载其中的公开镜像。
  • 私有仓库 (Private Registries): 需要进行身份验证和授权才能访问。它们通常用来存放涉及商业机密或敏感信息的私有镜像。
  • 云端仓库 (Cloud-Based Registries): 诸如 AWS、Google Cloud 和 Azure 等云服务商都提供自家的容器仓库服务。这些仓库能够与它们自家的云平台完美无缝集成。

2.2 主流的私有仓库解决方案

  • Docker Trusted Registry (DTR): Docker 官方提供的私有化部署仓库方案(目前已逐渐被 Docker Hub 的高级功能取代)。
  • Harbor: 一个非常受欢迎的开源仓库,具备基于角色的访问控制(RBAC)、镜像安全扫描和审计等高级功能。非常适合企业级生产环境。
  • JFrog Artifactory: 一个通用的制品库管理器,不仅支持 Docker 镜像,还支持管理其他各种类型的软件包。
  • Amazon Elastic Container Registry (ECR): 亚马逊 AWS 提供的全托管容器镜像仓库服务。
  • Google Container Registry (GCR): 谷歌云平台 (GCP) 提供的私有容器镜像仓库服务。
  • Azure Container Registry (ACR): 微软 Azure 提供的托管式容器镜像仓库服务。

2.3 使用私有仓库的优势

  • 安全性: 提供更严格的访问控制,防止镜像被未经授权的人员获取或恶意篡改。
  • 合规性: 帮助企业满足安全审计和合规要求,确保镜像存储在受控的环境中。
  • 性能: 将仓库部署在离你的生产服务器更近的地方(如内网或同地域云端),可以大幅提升镜像拉取速度,降低网络延迟。
  • 控制力: 让你对镜像拥有绝对的管理权,包括版本控制、标签规范以及生命周期管理。

2.4 私有仓库身份验证

想要从私有仓库拉取或推送镜像,你必须先使用 docker login 命令进行身份验证。

docker login <registry-hostname>

<registry-hostname> 替换为你私有仓库的域名地址。按下回车后,系统会提示你输入用户名和密码。Docker 会将这些凭据安全地保存在你本机的 ~/.docker/config.json 文件中。

2.5 推送镜像到私有仓库

在把镜像推送到私有仓库之前,你需要先用仓库的域名给镜像“打标签”:

docker tag <image-name> <registry-hostname>/<image-name>

例如:

docker tag myapp localhost:5000/myapp

打好标签后,就可以将它推送上去了:

docker push localhost:5000/myapp