谷歌云上的Docker图像
如果你使用docker,并将docker镜像推送到hub.docker.com,默认情况下,docker镜像会被推送到一个公共仓库。这意味着,每个人都可以访问你的docker镜像。然而,我们需要确保我们的docker镜像是非常安全的,只有特定项目中存在的应用程序才能访问docker镜像。
谷歌为此提供了一个解决方案,使用谷歌云,你可以在那里存储私有的docker镜像。
目标
本文重点介绍了创建docker镜像并使用Google Container Registry将其推送到Google的私有仓库。它解释了如何确保一个给定的docker镜像只能被给定仓库中的项目访问。我们将创建一个flask应用程序,创建其docker镜像,然后将创建的镜像部署到谷歌云。
谷歌容器注册中心
谷歌容器注册中心是管理谷歌云平台上Docker镜像的空间。它通过决定谁可以在任何时候访问什么Docker镜像,来确保对托管在注册表上的Docker镜像的访问许可。大多数人使用Docker Hub作为中央登记处,但在GCR中,也考虑了隐私因素。
在谷歌云壳上工作
Google Cloud Shelly是一个免费的环境,在云开发过程中提供命令行访问资源。它提供了一个基于Linux的虚拟机。
我们不在本地工作,而是使用谷歌云shell。要打开shell,请点击下图所示的右上方的图标。
创建一个应用程序
要创建应用程序,我们需要一个文件夹来存放模板,一个dockerfile ,requirement.txt 文件用于构建docker镜像,以及应用程序的主要入口点,即app.py 。
下面是应用程序的所有文件和文件夹的表格,以及在Google Cloud Shell中创建它们的命令。
| 文件/文件夹 | 目录 | 命令 |
|---|---|---|
| flask-app | 根 | mkdir flask-app |
| 模板 | flask-app | mkdir templates |
| app.py | 许可证 | touch app.py |
| Dockerfile | 脚本 | touch Dockerfile |
| index.html | 模板 | touch index.html |
使用命令nano filename 来打开任何文件。
在app.py 文件中,添加下面的代码,按CTRL + X ,然后按Y ,保存。
import os
from flask import Flask, render_template
import flask
app = Flask(__name__)
# Index
@app.route('/')
def index():
return render_template('index.html')
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=int(os.environ.get('PORT', 8080)))
在index.html 文件中,添加下面的代码。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Docker | Google Cloud</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<br><br><br><br><br>
<div class="jumbotron text-center">
<h2>Google Cloud Deployed!!!</h4>
</div>
</div>
</div>
</body>
</html>
创建Docker文件
在Dockerfile ,添加下面的代码。
FROM python:3.8
# working directory
WORKDIR /user/src/app
# copy all files to the container
COPY . .
# Install pip requirements
RUN python -m pip install --no-cache-dir -r requirements.txt
# port number to expose
EXPOSE 5000
# run the web service on the container using gunicorn
CMD exec gunicorn --build :$PORT --worker 1 --threads 8 --timeout 0 app:app
在requirements.txt文件中,添加下面的代码。
# flask
flask==1.1.2
# gunicorn
gunicorn==20.0.4
接下来,我们需要使Dockerfile 可执行。运行下面的命令。
chmod +x Dockerfile
创建一个Docker镜像
当使用docker hub时,我们会使用命令docker build --tag app . 来生成docker镜像。然而,在这里,谷歌容器注册中心的情况就不同了。
在使用GCR创建docker镜像时,你应该指定项目名称、项目ID和docker镜像的标签名称。在我们的案例中,我们将运行下面的命令来建立镜像。
gcloud builds submit --tag gcr.io/your-project-id/flask-app
上传并验证上传情况
要验证镜像是否成功部署,请前往左侧边栏菜单上的谷歌云存储。你应该看到你的应用程序已经部署,如下图所示。你会看到两条记录;一条是图像,另一条是实际的应用程序。

部署镜像
运行下面的命令来部署docker镜像。在区域下,选择与你想要的位置相对应的数字。对任何进一步给出的提示点击回车。
gcloud run deploy --image gcr.io/project-id/flask-app

你应该看到容器的部署,如下图。
点击部署服务的URL链接,看到你的应用程序正在运行
如果我们进入谷歌容器注册页面,我们会发现一个我们的容器列表,其可见性被设置为私有。
这表明我们的docker镜像只能被在谷歌控制台项目中创建的应用程序访问。现在我们可以确定,我们的镜像有访问控制。
总结
在本教程中,我们学习了如何将docker镜像部署到Google Container Registry,创建了一个简单的flask应用,将其docker化,并部署到GCR。在这个过程中,我们还学习了如何使用谷歌云外壳。