GCE 未正确部署 GCR 映像
Posted
技术标签:
【中文标题】GCE 未正确部署 GCR 映像【英文标题】:GCE doesn't deploy GCR image correctly 【发布时间】:2019-01-04 16:17:54 【问题描述】:我已关注 Google 文档中的 this guide,以便能够将自定义 Docker 映像推送到 Google Container Registry,然后能够使用该映像启动新的 GCE 实例。起初我想尝试使用来自 docker hub 的 anaconda3 public image 而不做任何修改(为了测试)。
所以这是我安装 gcloud 和 docker 后到目前为止所做的步骤:
gcloud auth configure-docker
-> 使用我的 gcloud 凭据配置 docker
docker pull continuumio/anaconda3
-> 拉取公众图片
docker tag continuumio/anaconda3 eu.gcr.io/my-project-id/anaconda3
-> 使用文档中指定的注册表名称标记本地图像
docker push eu.gcr.io/my-project-id/anaconda3
-> 将图片推送到 GCR
好!我现在可以通过 GCR 界面查看我的图像,并且还可以使用 GCE 部署它。我选择使用 f1-micro 实例、Container-Optimized OS 67-10575.62.0 stable、10 Go 启动盘、允许 HTTP 流量等来部署它。 p>
但是当我用ssh
连接到新创建的VM 实例时,我找不到anaconda3 库(应该在/opt/conda
中创建)。相反,我可以看到一个/opt/google
目录,这让我认为图像没有正确部署,GCE 正在使用默认图像...
所以我尝试检查图像是否在 GCR 中正确推送,因此我决定删除我的本地图像并再次从 GCR 中拉取它:
docker rmi -f eu.gcr.io/my-project-id/anaconda3
docker pull eu.gcr.io/my-project-id/anaconda3:latest
我运行图像
docker run -t -i eu.gcr.io/my-project-id/anaconda3
我可以看到一切都很好,我在 /opt/conda
中正确安装了 anaconda3 以及所需的所有工具(Pandas、Numpy、Jupyter notebook 等)
我试图找到和我有同样问题的人但没有成功……也许我在我的过程中做错了什么? 谢谢!
TL;DR 我的问题是我在 Google GCR 上推送了 anaconda3 图像,但是当我使用此图像启动虚拟实例时,我没有 anaconda
【问题讨论】:
【参考方案1】:在GCE实例上找不到直接安装的anaconda库是正常的。
实际上,当您选择在 GCE 虚拟机实例上部署容器镜像时,Docker 容器将从您提供的镜像启动(在您的示例中,eu.gcr.io/my-project-id/anaconda3
)。这些库未安装在主机上,而是在该容器中(运行docker ps
以查看它,但通常它与您的VM 实例具有相同的名称)。如果你运行类似的东西:
docker exec -it <docker_container_name> ls /opt/conda
然后您应该会看到 anaconda 库,仅存在于容器中。
当您运行docker run -t -i eu.gcr.io/my-project-id/anaconda3
时,您实际上是在启动容器并在该容器内运行交互式 bash 会话(请参阅CMD
here)。这就是为什么您可以找到 anaconda 库的原因:您在容器中!
容器化软件(此处为docker
)提供主机和容器之间的隔离。我建议您阅读有关 containerization、Docker 和 how to run containers on Container-Optimized OS 的文档。
【讨论】:
所以如果我理解正确的话,将 GCR 容器镜像部署到 GCE 就像在经典的 linux 发行版上使用 docker,然后从 docker hub 拉取并运行我想要的镜像,是这样吗?但是当我运行docker ps
时,我可以使用gcr.io/gce-containers/konlet:v.0.8-latest
图像找到一个容器,而当我运行docker exec -it <container_id> ls /opt
时,没有打印任何内容。如果我运行docker images
我只能看到 konlet 图像,似乎我找不到 anaconda3 图像。无论如何感谢您的澄清,它非常有用!不幸的是,我还没有足够的声誉来投票,哈哈
@Sewake 你说得对,使用这种方法可以避免你自己安装Docker;此外,Container-Optimized OS 有很多benefits。 Konlet 容器应该只在 VM 启动时出现,它的目标只是启动你自己的容器,基于你在 gce-container-declaration
(或在 Web UI 中)设置的内容。一旦您自己的容器启动,它就会停止。但奇怪的是你自己的容器没有出现。也许f1-micro
太小了?以上是关于GCE 未正确部署 GCR 映像的主要内容,如果未能解决你的问题,请参考以下文章
是否可以在不实际部署映像的情况下在 GCE 上配置容器优化的 OS VM?
无法 RDP 或 ping 从自定义映像创建的 GCE 实例
Google App Engine Docker容器502错误网关