在谷歌计算引擎上运行Docker容器
Google Compute Engine(GCE)是一种高端计算服务,它允许开发者在Google底层安全可靠的基础设施上创建和运行虚拟机。使用GCE可以利用复杂的计算能力和繁重的工作负荷,而不需要在物理上获得它们。
Docker允许将一个应用程序及其模块封装成一个独立的包。这种做法使你能够在任何平台上运行应用程序,而不需要对部署环境进行进一步配置。
项目目标
在本文中,我们将引导读者创建一个Flask应用程序,从该应用程序创建一个基于Docker的容器,并将该容器部署到谷歌的虚拟机上。
在文章结束时,读者应该了解这些程序和技能,以便有效地执行它们。
先决条件
读者需要以下条件才能跟上本教程的进度。
- 一个合适的文本编辑器。我更喜欢[VS Code]。
- 基本的Python技能。
- 对Flask框架的理解。
- 运行[Docker]软件。
创建Flask应用程序
最初的步骤是创建项目要使用的Flask应用程序。我选择Flask是因为它很容易理解,很简单,而且不需要任何特殊的工具来工作。
接下来,通过运行这个安装Flask的命令,启动创建应用程序的过程。
pip install Flask
在接下来的步骤中,创建两个文件。第一个文件被命名为requirements.txt 和app.py ,以保存项目的库和依赖性。app.py 是应用程序的驱动代码。
在app.py 文件中添加以下代码。
from Flask import Flask, render_template
import Flask
app = Flask(__name__)
# Index route
@app.route('/')
def index():
return render_template('index.html')
if __name__ == '__main__':
app.run(debug=True)
创建一个新的目录并将其称为templates 。这个目录将包含在网页用户界面上渲染的视图文件。在该文件夹中,创建一个名为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>RUNNING DOCKER CONTAINERS ON GCE</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<div class="jumbotron text-center">
<h2>RUNNING DOCKER CONTAINERS ON GCE</h4>
<p>TIn this article, the reader will be walked through creating a Flask application, creating a docker based container out of the article and deploying the Docker container to Google Compute Engine. By the end of the article, the reder should have an understanding of the procedure and the skills to execute them effecinstly.</p>
</div>
</div>
</div>
</body>
</html>
Dockerizing the application
Docker化包括将应用程序和它所需的模块封装成一个单元。新创建的单元现在可以被配置为在任何地方运行,而不需要运行新的安装。
为了设置我们的容器,我们首先要创建一个新的文件,名为dockerfile 。该文件指定了应用程序上传到平台后要执行的命令。首先,将下面的片段添加到Docker文件中。
FROM python:3.8
# specify the current wd
WORKDIR /user/src/app
# migrate all local files in the computer to the remote container
ENV APP /app
WORKDIR $APP_HOME
COPY . ./
# Use pip to install the project requirements
RUN python-pip install Flask gunicorn
# Run the web server upon startup with eight threads
CMD exe gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 app:app
现在我们已经成功地创建了我们的Dockerfile,我们需要通过在终端运行下面的命令使该文件可执行。
chmod +x Dockerfile
构建容器镜像
我们将构建并发布我们的容器镜像到谷歌容器注册中心(GCR)。容器镜像将应用程序和它的要求掩盖在一个单一的容器中,以便在GCE上运行。
由于我们打算使用gcloud command-line tool ,我们需要打开控制台,在提示下,我们允许云外壳应用程序访问API密钥。

要创建容器,运行下面的命令。
gcloud builds submit --tag gcr.io/PROJECT-ID/sectionapp
你需要提供一个标签来与容器图像相关联。在我们的案例中,我把我的叫做
sectionapp。

配置一个防火墙规则
我们将设置一个防火墙,允许流量通过一个特定的端口。在我们的例子中,这个端口是8080。
在侧边栏,前往网络标签⇾ VPC网络⇾选择防火墙。然后,点击CREATE FIREWALL BUTTON 。
- 名称:
allow-http-8080 - 目标。
Specified target tags - 目标标签。
http-server-8080 - 来源-ip。
0.0.0.0/0 - TCP。
8080

创建GCE VM实例。
从控制台的侧边栏菜单,进入COMPUTE ⇾ Compute Engine ⇾ VM实例,然后点击CREATE INSTANCE 。

- 名称: section-instance
- 机器配置(系列)。N1
- 机器配置(机器类型): f1-micro
- 启动盘。蝶变GNU/Linux 10 (buster)
- 点击
Management, security, disks, networking, sole tenancy链接,扩大可用选项。 - 点击
Networking标签。 - 对于
Network tags,输入我们在创建防火墙时设置的HTTP-server-8080。
要检查与该项目相关的运行实例,执行下面的命令。
gcloud compute instances list

在谷歌虚拟机中工作
接下来,我们需要登录虚拟机来安装我们的应用程序及其模块。因此,我们将使用另一个gcloud 命令,如下所示。
gcloud compute ssh section-instance --zone us-central1-a
注意,我们也要指定实例名称和区域。然后,当提示创建一个ssh密钥时,敲击
enter密钥,与默认值一致。
接下来,我们将通过运行该命令更新系统软件包列表。
sudo apt-update
接下来,由于这个项目是在Flask上运行的,我们将需要pip使用命令来安装Flask。
apt install python3-pip
将容器上传到虚拟机中
使用CTRL+D 来注销虚拟机。接下来,我们需要使用secure copy 命令将我们的应用程序文件复制到虚拟机中。
gcloud computer scp --recursive section section-instance: --zone us-central1-a
将容器部署到GCE
我更喜欢使用gcloud 命令行工具,从谷歌云平台控制台将我的容器部署到虚拟机实例上。
gcloud compute instances create-with-container section-instance --container-image gcr.io/PROJECT-ID/sectionapp
在上面的命令中,确保你把PROJECT-ID替换成你的项目ID。
测试应用程序
- 在运行的实例中,我们将选择我们创建的实例
section instance。 - 该实例有两个IP地址;一个是internal IP,一个是external IP。 - 复制外部IP地址,然后在8080端口运行应用程序。
- 我们的应用程序运行如下图所示。
现在,如果我们用http://your-external-ip-address/8080 链接导航浏览器,我们将看到我们的容器在下面运行。

总结
在这篇文章中,我们使用Flask从头开始构建了一个网络应用。然后,我们在谷歌命令行中使用Docker对该应用程序进行了容器化。最后,我们更进一步,使用计算引擎将容器部署到虚拟机上。这样一来,我们就利用了谷歌的基础设施来运行我们的应用程序。
请注意,如果你要在谷歌平台上运行一个应用程序,你必须提供计费细节,一旦应用程序完成,就关闭正在运行的实例,以避免产生额外费用。