赞
踩
您是一名开发人员并且想探索 docker-compose?这篇文章是为你而写的。在对 Docker-Compose 进行简短介绍后,您将能够使用 Docker 创建您的第一个客户端/服务器端应用程序。
注意:本文考虑到您了解 Docker 的基础知识。如果没有,请不要惊慌!我建议您阅读我的第一篇文章来了解 Docker 并学习如何创建您的第一个应用程序。
Docker 初学者指南 — 如何创建您的第一个 Docker 应用程序:如果您是开发人员并且想从 Docker 开始?这篇文章是为你而写的。
Docker-Compose 是 Docker 提供的一个工具。为简单起见,实施此工具是为了解决项目中的架构问题。
您可能已经在我之前的文章中注意到,我们创建了一个显示“Docker is magic!”的简单程序。当它推出时。
不幸的是,当您是一名开发人员时,您很少会创建一个独立的程序(一个不需要任何其他服务即可运行的程序,例如数据库)。
但是,您如何知道是否需要 Docker-Compose?它非常简单——如果您的应用程序需要运行多个服务,您就需要这个工具。例如,如果您创建一个需要连接到您的数据库以验证用户身份的网站(这里有 2 个服务,网站和数据库)。
Docker-compose 为您提供了在单个命令中启动所有这些服务的可能性。
Docker 用于管理应用程序的单个容器(服务)。
Docker-Compose 用于为同一个应用程序同时管理多个容器。此工具提供与 Docker 相同的功能,但允许您拥有更复杂的应用程序。
Docker(单个容器)VS Docker-Compose(多个容器)
该工具可以变得非常强大,并允许您非常快速地部署具有复杂架构的应用程序。我会给你一个具体的案例研究,证明你需要它。
想象一下,您是您的网络软件的骄傲创造者。
您的解决方案提供了两个网站。第一个允许商店只需点击几下就可以创建他们的在线商店。第二个致力于客户支持。这两个站点与同一个数据库交互。
你开始成功了,你的服务器已经不够用了。因此,您决定将整个软件迁移到另一台机器上。
不幸的是,您没有使用 docker-compose。因此,您将不得不一个接一个地迁移和重新配置您的服务,希望没有遗漏任何内容。
如果您使用了 docker-compose,只需几个命令,您就可以在新服务器上部署整个架构。您现在要做的就是进行一些配置并加载数据库备份以完成迁移。
现在您知道 docker-compose 的用途了,是时候创建您的第一个客户端/服务器端应用程序了!
本教程的目的是用 Python 创建一个包含句子的小型网站(服务器)。这句话必须由将显示该句子的 Python 程序(客户端)检索。
注意:本教程考虑到您已经在计算机上安装了 Docker 并且具备基础知识。如果不是这种情况,请您参考我之前的文章。
要创建您的第一个客户端/服务器应用程序,我邀请您在您的计算机上创建一个文件夹。它必须在根目录中包含以下文件和文件夹:
一个docker-compose.yml文件(包含创建不同服务的必要说明的 docker-compose 文件)。
一个server文件夹(此文件夹将包含设置服务器所需的文件)。
一个client文件夹(此文件夹将包含设置客户端所需的文件)。
通常你应该有这个文件夹架构:
- .
- ├── client/
- ├── docker-compose.yml
- └── server/2 directories, 1file
为了开始提醒 Docker 的基础知识,我们将从创建服务器开始。
移动到您的server文件夹并创建以下文件:
一个server.py文件(将包含服务器代码的 python 文件)。
一个index.html文件(包含要显示的句子的 html 文件)。
一个Dockerfile文件(包含创建服务器环境的必要指令的 docker 文件)。
通常,您应该在以下路径中拥有此文件夹架构server/:
- .
- ├── Dockerfile
- ├── index.html
- └── server.py0 directories, 3 files
您可以将以下代码添加到文件中server.py:
- #!/usr/bin/env python3
-
- # 导入python系统库。
- # 这些库将用于创建 Web 服务器。
- # 你不需要安装任何特别的东西,这些库是用 Python 安装的。
- import http.server
- import socketserver
-
- # 这个变量将处理我们客户端在服务器上的请求。
- handler = http.server.SimpleHTTPRequestHandler
-
- # 这里我们定义我们要在端口 1234 上启动服务器。
- # 尽量记住这些信息,这对我们以后使用 docker-compose 非常有用。
- with socketserver.TCPServer(("", 1234), handler) as httpd:
- # 该指令将使服务器保持运行,等待来自客户端的请求。
- httpd.serve_forever()
此代码将允许您在此文件夹中创建一个简单的 Web 服务器。它将检索index.html文件的内容以在网页上共享它。
您可以在文件中添加以下语句index.html:
Docker-Compose is magic!
服务器启动时会共享这个文件,并显示这句话。
在这里,我们将创建一个基本的 Dockerfile,它将负责执行我们的 Python 文件。我们将使用创建的官方镜像来执行 Python。
- # 请记住,dockerfile 必须始终从导入基础映像开始。
- # 我们使用关键字“FROM”来做到这一点。
- # 在我们的示例中,我们要导入 python 映像(来自 DockerHub)。
- # 所以,我们为图像名称写'python',为版本写'latest'。
- FROM python:latest
-
- # 为了启动我们的 python 代码,我们必须导入“server.py”和“index.html”文件。
- # 我们使用关键字“ADD”来做到这一点。
- # 请记住,第一个参数 'server.py' 是主机上文件的名称。
- # 第二个参数'/server/'是将文件放在图像上的路径。
- # 这里我们将文件放在图像“/server/”文件夹中。
- ADD server.py /server/
- ADD index.html /server/
-
- # 我想介绍一些新的东西,'WORKDIR' 命令。
- # 此命令更改图像的基本目录。
- # 这里我们定义'/server/'作为基目录(所有命令都将在这里执行)。
- WORKDIR /server/
为了继续提醒 Docker 的基础知识,我们将创建客户端。
移动到您的client文件夹并创建以下文件:
一个client.py文件(将包含客户端代码的 python 文件)。
一个Dockerfile文件(包含创建客户端环境的必要说明的 docker 文件)。
通常,您应该在以下路径“ _client / _ ”中拥有此文件夹架构:
- .
- ├── client.py
- └── Dockerfile0 directories, 2 files
您可以将以下代码添加到文件中client.py:
- #!/usr/bin/env python3
-
- # 导入python系统库。
- # 该库用于从服务器下载“index.html”。
- # 你不需要安装任何特别的东西,这个库是用 Python 安装的。
- import urllib.request
-
- # 此变量包含对“http://localhost:1234/”的请求。
- # 你一定想知道 'http://localhost:1234' 是什么?
- # localhost:这意味着服务器是本地的。
- # 1234:记住我们将 1234 定义为服务器端口。
- fp = urllib.request.urlopen("http://localhost:1234/")
-
- # 'encodedContent' 对应于服务器响应编码('index.html')。
- # 'decodedContent' 对应解码后的服务器响应(我们想要显示的内容)。
- encodedContent = fp.read()
- decodedContent = encodedContent.decode("utf8")
-
- # 显示服务器文件:'index.html'。
- print(decodedContent)
-
- # 关闭服务器连接。
- fp.close()
此代码将允许您获取服务器网页的内容并显示它。
至于服务器,我们将创建一个基本的 Dockerfile 来负责执行我们的 Python 文件。
- # 与 *server* Dockerfile 相同。
- FROM python:latest
-
- # 与 *server* Dockerfile 相同。
- # 我们在 */client/* 文件夹中导入 *client.py*。
- ADD client.py /client/
-
- # 我想介绍一些新的东西,*WORKDIR* 命令。
- # 此命令更改图像的基本目录。
- # 这里我们定义 */client/* 为基础目录。
- WORKDIR /client/
您可能已经注意到,我们创建了两个不同的项目,即服务器和客户端,它们都使用 Dockerfile。
到目前为止,您已经了解的基础知识没有任何变化。
现在我们要编辑docker-compose.yml存储库的根目录。
注意:Docker-Compose非常完善,本文旨在给大家一个具体的典型例子。这就是为什么您不会看到所有关键字的原因。
- # docker-compose 必须始终以版本标签开头。
- # 我们使用 '3' 因为它是此时的最后一个版本。
- version: '3'
-
- # 你应该知道 docker-composes 与服务一起工作。
- # 1 service = 1 container.
- # 比如一个服务可能,一个服务器,一个客户端,一个数据库...
- # 我们使用关键字 'services' 开始创建服务。
- services:
- # 正如我们一开始所说,我们要创建:一个服务器和一个客户端。
- # 那是两个服务。
-
- # 第一个服务(容器):服务器。
- # 这里你可以自由选择关键字。
- # 它将允许您定义服务对应的内容。
- # 我们为服务器使用关键字'server'。
- server:
- # 关键字“build”将允许您定义
- # 用于创建图像的 Dockerfile 的路径
- # 这将允许您执行该服务。
- # 这里'server/'对应的是server文件夹的路径
- # 包含要使用的 Dockerfile。
- build: server/
-
- # 创建图像后要执行的命令。
- # 以下命令将执行“python ./server.py”。
- command: python ./server.py
-
- # 记住我们在'server/server.py'中定义了1234作为端口。
- # 如果我们想从我们的计算机(容器外)访问服务器,
- # 我们必须与我们的计算机端口共享内容端口。
- # 为此,关键字 'ports' 将帮助我们。
- # 它的语法如下:[我们想要在我们机器上使用的端口]:[我们想要在容器中检索的端口]
- # 在我们的例子中,我们想在我们的机器上使用端口 1234 并且
- # 从容器中检索端口 1234(因为它在这个端口上
- # 我们广播服务器)。
- ports:
- - 1234:1234
-
- # 第二个服务(容器):客户端。
- # 我们为服务器使用关键字“client”。
- client:
- # 这里的'client/对应client文件夹的路径
- # 包含要使用的 Dockerfile。
- build: client/
-
- # 创建图像后要执行的命令。
- # 以下命令将执行“python ./client.py”。
- command: python ./client.py
-
- # 关键字'network_mode'用于定义网络类型。
- # 这里我们定义容器可以访问计算机的'localhost'。
- network_mode: host
-
- #关键字'depends_on'允许您定义服务是否
- # 应等到其他服务准备就绪后再启动。
- # 在这里,我们希望“client”服务等待“server”服务准备就绪。
- depends_on:
- - server
设置 docker-compose 后,需要构建您的客户端/服务器应用程序。此步骤对应于“docker build”命令,但适用于不同的服务。
docker-compose build
您的 docker-compose 已构建!现在是时候开始了!此步骤对应于“docker run”命令,但适用于不同的服务。
docker-compose up
给你,就是这样。您通常应该看到“Docker-Compose 很神奇!” 显示在您的终端中。
注意:如教程中所述,您的“服务器”服务使用计算机的端口 1234 来分发其内容。如果您在计算机上打开http://localhost:1234/页面,您应该会看到“Docker-Compose is magic!”。
如果您想检索完整代码以更简单地发现它或执行它,在 Github 上供您使用。
GitHub:客户端服务器 Docker-Compose 示例
像往常一样,我准备了一个可能对您使用 docker-compose 有用的命令列表。
停止容器并删除容器、图像……创建者docker-compose up。
docker-compose down
显示服务的日志输出(例如docker-compose logs -f client:)。
docker-compose logs -f[service name]
列出容器。
docker-composeps
在正在运行的容器中执行命令(例如docker-compose exec server ls:)。
docker-composeexec[service name][command]
列出图像。
docker-compose images
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。