分享应用程序
现在你已经构建了一个镜像,你可以分享它了。要分享 Docker 镜像,你必须使用 Docker 注册表。默认注册表是 Docker Hub,你使用过的所有镜像都来自这里。
Docker ID
Docker ID 让你能够访问 Docker Hub,它是世界上最大的容器镜像库和社区。如果你还没有,可以免费创建一个Docker ID。
创建仓库
要推送镜像,首先需要在 Docker Hub 上创建一个仓库。
注册 或登录 Docker Hub。
选择 创建仓库 按钮。
对于仓库名称,使用
getting-started
。确保 可见性 为 公共。选择 创建。
在下图中,你可以看到一个来自 Docker Hub 的 Docker 命令示例。这个命令将推送到这个仓库。


推送镜像
在命令行中,运行你在 Docker Hub 上看到的
docker push
命令。注意,你的命令中会包含你的 Docker ID,而不是 "docker"。例如,docker push YOUR-USER-NAME/getting-started
。$ docker push docker/getting-started The push refers to repository [docker.io/docker/getting-started] An image does not exist locally with the tag: docker/getting-started
为什么失败了?推送命令正在查找名为
docker/getting-started
的镜像,但没有找到。如果你运行docker image ls
,也看不到。要解决这个问题,你需要为你已构建的现有镜像打上标签,给它一个新名称。
使用命令
docker login -u YOUR-USER-NAME
登录 Docker Hub。使用
docker tag
命令为getting-started
镜像指定新名称。将YOUR-USER-NAME
替换为你的 Docker ID。$ docker tag getting-started YOUR-USER-NAME/getting-started
现在再次运行
docker push
命令。如果你是从 Docker Hub 复制的值,可以删除tagname
部分,因为你没有给镜像名称添加标签。如果你不指定标签,Docker 会使用一个名为latest
的标签。$ docker push YOUR-USER-NAME/getting-started
在新实例上运行镜像
既然你的镜像已经构建并推送到注册表,尝试在一个从未见过此容器镜像的全新实例上运行你的应用程序。为此,你将使用 Play with Docker。
注意
Play with Docker 使用 amd64 平台。如果你使用的是基于 ARM 架构且配备 Apple 芯片的 Mac,你需要重建镜像以兼容 Play with Docker,并将新镜像推送到你的仓库。
要为 amd64 平台构建镜像,使用
--platform
标志。$ docker build --platform linux/amd64 -t YOUR-USER-NAME/getting-started .
Docker buildx 也支持构建多平台镜像。要了解更多信息,请参阅多平台镜像。
在浏览器中打开Play with Docker。
选择 登录,然后从下拉列表中选择 docker。
使用你的 Docker Hub 账户登录,然后选择 开始。
选择左侧边栏上的 添加新实例 选项。如果你看不到,请稍微调整浏览器窗口宽度。几秒钟后,你的浏览器中会打开一个终端窗口。
在终端中,启动你刚刚推送的应用程序。
$ docker run -dp 0.0.0.0:3000:3000 YOUR-USER-NAME/getting-started
你应该看到镜像被拉取下来并最终启动。
提示
你可能注意到这个命令将端口映射绑定到了不同的 IP 地址。之前的
docker run
命令将端口发布到主机的127.0.0.1:3000
。这次,你使用的是0.0.0.0
。绑定到
127.0.0.1
只会把容器的端口暴露给回环接口。然而,绑定到0.0.0.0
会将容器的端口暴露给主机的所有接口,使其可供外部访问。有关端口映射工作原理的更多信息,请参阅网络。
当 3000 徽章出现时,选择它。
如果 3000 徽章没有出现,你可以选择 打开端口 并指定
3000
。
总结
在本节中,你学习了如何通过将镜像推送到注册表来分享你的镜像。然后你前往一个全新的实例,并在其上成功运行了刚刚推送的镜像。这在 CI 流水线中非常常见,流水线会创建镜像并将其推送到注册表,然后生产环境就可以使用最新版本的镜像了。
相关信息
下一步
在下一节中,你将学习如何在容器化应用程序中持久化数据。