type
status
slug
summary
tags
category
icon
password
new update day
Property
Oct 22, 2023 01:31 PM
created days
Last edited time
Oct 22, 2023 01:31 PM
1 先决条件
- 您已经安装了 1.13 或者版本更高的 Docker 应用程序
- 你已经将 Docker 学习第一部分 阅读完毕
- 为您的环境提供快速测试运行,以确保您已全部设置:
2 介绍
现在该开始以Docker方式构建应用程序了。我们将从这样一个应用程序的层次结构的底部开始,该应用程序是一个容器,我们将在此页面中进行介绍。在该级别之上是服务,该服务定义了容器在生产中的行为方式,在第3部分中进行了介绍。最后,在顶层是堆栈,定义了第5部分中介绍的所有服务的交互。
- Stack
- Services
- Container (you are here)
3 您的新开发环境
过去,如果您要开始编写Python应用程序,那么首先要做的就是将Python运行时安装到计算机上。但是,这会造成一种情况,您的计算机上的环境必须如此,以便您的应用程序按预期运行;运行您的应用程序的服务器的同上。
使用Docker,您只需获取一个可移植的Python运行时作为映像,而无需安装。然后,您的构建可以在应用程序代码的旁边包含基本的Python映像,以确保您的应用程序,其依赖项和运行时都一起运行。
这些可移植映像由称为
Dockerfile
的东西定义。4 用Dockerfile定义一个容器
Dockerfile
将定义容器内部环境中发生的事情。在这种环境内虚拟化了对网络接口和磁盘驱动器等资源的访问,该环境与系统的其余部分隔离,因此您必须将端口映射到外部环境,并具体说明那个环境中要“复制”的文件。但是,这样做之后,您可以期望在此 Dockerfile
中定义的应用程序构建无论在任何地方运行都将表现完全相同。4.1 Dockerfile
创建一个空目录。并进入到新目录,创建一个名为
Dockerfile
的文件,将以下内容复制并粘贴到该文件中,然后保存。请注意理解你的新 Dockerfile
中每个语句的注释。Are you behind a proxy server? 代理服务器可以在您的网络应用启动并运行后立即阻止其连接。如果您位于代理服务器后面,请使用ENV命令为您的Dockerfile添加以下行,以指定代理服务器的主机和端口:在调用pip之前添加这些行,以使安装成功。
这个
Dockerfile
指向了我们尚未创建的几个文件,即 app.py
和 requirements.txt
。接下来创建这些。5 应用本身
再创建两个文件
requirements.txt
和 app.py
,并将它们与 Dockerfile
放在同一文件夹中。这样就完成了我们的应用程序,您可以看到它非常简单。当上述 Dockerfile
内置到映像中时,由于该 Dockerfile
的 ADD
命令,将显示 app.py
和 requirements.txt
,并且借助 EXPOSE
命令,可以通过 HTTP
访问 app.py
的输出。5.1 requirements.txt
5.2 app.py
现在,我们看到
pip install -r requirements.txt
安装了Python的Flask和Redis库,并且该应用程序打印了环境变量 NAME
以及对 socket.gethostname()
的调用的输出。最后,由于Redis没有运行(因为我们仅安装了Python库,而没有安装Redis本身),因此我们应该期望在此处使用它的尝试会失败并产生错误消息。注意:在容器内访问主机名将检索容器ID,这类似于正在运行的可执行文件的进程ID。
这就是神奇的地方!您无需在系统上使用Python或Requirements.txt中的任何内容,也无需构建或运行此映像即可在系统上安装它们。似乎您并没有真正使用Python和Flask设置环境,但是已经有了。
5.3 Build the app
我们准备构建该应用程序。确保您仍在新目录的顶层。 使用 ls 命令应该显示以下内容:
现在运行build命令。这将创建一个Docker映像,我们将使用 -t 对其进行标记,给他起一个友好的名字。
你构建的 images 在哪里呢?它位于计算机的本地 Docker 映像注册表中:
5.4 Run the app
运行应用,使用 -p 将计算机的端口 4000 映射到容器的已发布端口 80:
您应该在
http://0.0.0.0:80
看到一条消息,指出Python正在为您的应用提供服务。但是该消息是从容器内部发出的,它不知道您已将该容器的端口80映射到4000,从而生成了正确的URL http://localhost:4000
。在网络浏览器中转到该URL,以查看网页上提供的显示内容。
注意:如果您在Windows 7上使用Docker Toolbox,请使用 Docker Machine IP 代替 localhost。例如,http://192.168.99.100:4000/。要找到IP地址,请使用命令 docker-machine ip。
您也可以在 shell 程序中使用curl命令查看相同的内容。
此端口重新映射为4000:80,目的是演示
Dockerfile
中的 EXPOSE
内容与使用 docker run -p
发布的内容之间的区别。在后面的步骤中,我们将主机上的端口80映射到容器中的端口80,并使用 http:// localhost
。在终端中按
CTRL + C
退出。在Windows上,明确停止容器在Windows系统上,CTRL + C不会停止容器。因此,首先键入CTRL + C以返回提示(或打开另一个shell),然后键入 docker container ls 列出正在运行的容器,然后键入 docker container stop 容器名称或ID来停止容器。否则,当您尝试在下一步中重新运行容器时,将从守护程序中收到错误响应。
现在,让我们以分离模式在后台运行该应用:
您将获得应用程序的长容器ID,然后将其踢回终端。您的容器在后台运行。您还可以看到带有
docker container ls
的缩写容器ID(并且在运行命令时两者可以互换使用):您会看到CONTAINER ID与
http:// localhost:4000
上的内容匹配。现在使用docker container stop
通过容器ID结束进程,如下所示:5.5 Share your image
为了演示我们刚刚创建的图像的可移植性,让我们上传构建的图像并在其他地方运行它。毕竟,当您要将容器部署到生产环境时,您将需要学习如何推送到注册表。
注册表是存储库的集合,而存储库是图像的集合,类似于GitHub存储库,只是已经构建了代码。注册表上的帐户可以创建许多存储库。 Docker CLI默认使用Docker的公共注册表。
注意:我们将在这里使用Docker的公共注册表是因为它是免费的且已预先配置,但有许多公共选项可供选择,您甚至可以使用Docker Trusted Registry设置自己的私有注册表。
5.5.1 Log in with your Docker ID
如果您没有Docker帐户,请在https://cloud.docker.com/上注册一个。记下您的用户名。
登录到本地计算机上的Docker公共注册表。
5.5.2 Tag the image
用于将本地映像与注册表上的存储库关联的表示法是
username/repository:tag
。该标签是可选的,但值得推荐,因为它是注册管理机构用来给Docker映像提供版本的机制。给存储库命名并为上下文标记有意义的名称,例如 get-started:part2
。这会将 get-started
存储库中,并将其标记为 part2
。现在,将它们放在一起以标记图像。使用您的用户名,存储库和标签名称运行
docker tag image
,以便该图像将上传到您所需的目的地。该命令的语法为:For example:
运行 docker images 以查看新标记的图像。(您也可以使用 docker images ls)。
5.5.3 Publish the image
将您标记的图像上传到存储库:
完成后,此上载的结果将公开提供。如果登录到 Docker 中心,您将看到新映像及其拉取命令。
5.5.4 从远程存储库中提取并运行映像
从现在开始,您可以使用docker run并通过以下命令在任何计算机上运行您的应用程序:
如果该映像在计算机上本地不可用,则Docker将从存储库中提取该映像。
无论docker run在何处执行,它都会将您的映像以及Python和所有来自requirements.txt的依赖项拉出,并运行您的代码。所有这些都以整齐的小包装一起运送,并且主机无需安装任何东西即可运行,Docker除外。
6 第二部分总结
仅此页而已。在下一节中,我们将学习如何通过在服务中运行此容器来扩展应用程序。
仅此页而已。在下一节中,我们将学习如何通过在服务中运行此容器来扩展应用程序。
7 总结和备忘单(可选)
这是此页面上的基本Docker命令的列表,以及一些相关的命令(如果您想在继续之前进行一些探索)。
- 作者:tangcuyu
- 链接:https://expoli.tech/articles/2019/09/22/1569142374417
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章