38

使用docker-compose创建一个包含客户端与服务端的应用

 4 years ago
source link: https://www.tuicool.com/articles/uEZZbei
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

【编者的话】这篇教程会对Docker-Compose进行简短的介绍,之后您会使用Docker创建第一个客户端/服务器端应用程序。

本文考虑到您了解Docker的基础知识。如果没有,我建议你阅读我的第一篇文章来学习Docker并创建你的第一个应用程序。

什么是Docker-Compose?

Docker-Compose是Docker提供的工具。简而言之,这个工具是用于解决项目中的架构问题。

正如您在上一篇文章中可能已经注意到,我们创建了一个简单的程序,它在启动时显示“Docker is magic!”。

实际上,当您真正开发时,您很少会只创建一个独立程序(一个不依赖于任何其他服务的程序,例如数据库)。

但是,您如何得知是否需要Docker-Compose?这非常简单 - 如果您的应用程序需要运行多个服务,那么您就需要docker-compose。例如,如果您创建的网站需要连接到您的数据库以对用户进行身份验证(此处为2个服务,网站和数据库)。

Docker-compose可以让您使用单个命令来启动所有服务。

Docker和Docker-Compose之间的区别

Docker用于管理应用程序的单个容器(服务)。

Docker-Compose用于同时管理同一个应用程序下的多个容器。这个工具提供与Docker相同的功能,但允许您管理更复杂的应用程序。

AFrQfeR.png!web

Docker(单个容器)VS Docker-Compose(多个容器)

一个典型的用例

这个工具可以变得非常强大,并允许您非常快速地部署拥有复杂架构的应用程序。接下来我会给你一个具体的案例,来证明你需要它。

想象一下,您需要创建一个应用。

这个应用包含两个网站,第一个允许商店只需点击几下就可以创建他们的在线商店。第二个是用于客户售后支持。这两个站点与同一个数据库进行交互。

随着业务增长,您的服务器不够用了。因此,您决定将整个软件迁移到另一台计算机。

不幸的是,你没有使用docker-compose。因此,您将不得不一个接一个地迁移和重新配置您的服务。

如果您使用过docker-compose,只需几个命令就可以在新服务器上部署整个架构。您现在要做的就是进行一些配置并进行数据库的备份以完成迁移。

现在开始使用Docker-Compose创建你的第一个客户端/服务器端应用程序

您已经知道docker-compose是用来干什么了,现在是时候创建您的第一个客户端/服务器端应用程序了!

本教程的目的是用Python创建一个显示一句话的小型网站(服务器)。再由Python创建的程序(客户端)请求服务端,最终这个程序将会显示这句话。

注意:您需要在计算机上安装Docker并且已经掌握了基础知识。如果不是这种情况,请您阅读我之前的文章。

1.创建项目 在计算机上创建一个文件夹。它必须根目录下需包含以下文件和文件夹:

  • 一个'docker-compose.yml'文件(docker-compose文件,其中包含创建不同服务的必要指令)。
  • 'server'文件夹(此文件夹将包含服务器的配置文件)。
  • 'client'文件夹(此文件夹将包含客户端的配置文件)。
.

├── client/

├── docker-compose.yml

└── server/

2 directories, 1 file

2.创建您的服务器 为了开始提醒Docker的基础知识,我们将从创建服务器开始。

2a. 创建文件

进入server文件夹,并创建以下文件:

  • 一个'server.py'文件(包含服务器代码的python文件)。
  • 'index.html'文件(包含要显示的句子的html文件)。
  • “Dockerfile”文件(docker文件,包含创建服务器环境的必要指令)。

'server /'文件夹下应包含下列文件:

.├── Dockerfile

├── index.html

└── server.py

0 directories, 3 files

2b. 编辑Python文件

将以下代码添加到'server.py'文件中:

!/usr/bin/env python3

导入Python系统库

这些库用来创建网页服务器

你无需安装任何特殊的包,这些库是python自带的

import http.server

import socketserver

这个变量用于处理客户端发来的请求

handler = http.server.SimpleHTTPRequestHandler

这里我们定义了将服务端运行在端口1234

记住这些信息,我们之后将在docker-compose中用到

with socketserver.TCPServer(("", 1234), handler) as httpd:

# 这个指令将会使服务端长久运行以接受客户端的请求

httpd.serve_forever()

2c. 编辑Html文件

你可以把下面这句话添加到‘index.html’文件中:

Docker-Compose is magic!

服务器启动时将共享此文件,并显示这句话。

2d. 编辑Docker文件

在这里,我们将创建一个基本的Dockerfile,负责执行Python文件。我们将使用官方镜像的python环境。

dockerfile必须以import基础镜像开头

我们使用关键词 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/

3. 创建客户端

3a. 创建文件

进入‘client’ 文件夹,创建以下文件:

  • 一个'client.py'文件(将包含客户端代码的python文件)。
  • 一个 “Dockerfile”文件(docker文件,其中包含创建客户端环境的必要指令)。

'client /'文件夹结构如下:

.

├── client.py

└── Dockerfile

0 directories, 2 files

3b. 编辑Python文件

将以下代码添加到 ‘client.py’ 文件

!/usr/bin/env python3

引入python库

这个库用于从服务器端下载index.html

无需下载特殊的python库,这个库包含于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()

此代码将允许您获取服务器网页的内容并显示它。

3c. 编辑Docker文件

与server的dockerfile一样

FROM python:latest

与server的dockerfile一样

将主机文件 'client.py' 移到镜像中的 '/client/' 文件夹下.

ADD client.py /client/

这里我们将'/client/' 作为工作目录

WORKDIR /client/

4. 回到Docker-Compose

您可能已经注意到,我们创建了两个不同的项目,服务器和客户端,都使用Dockerfile。

现在编辑根目录底下的'docker-compose.yml'文件。

docker-compose文件必须以版本号开始

我们使用3作为最新版本

version: "3"

你需要知道docker-compose是用来管理服务的

1 服务 = 1 容器.

例如,一个服务可能是服务端,客户端,或者数据库...

我们使用关键词service来定义服务

services:

# 我们需要创建两个服务:客户端,服务端

# 第一个服务 (容器): 服务端

# 这里你可以使用任意关键词

# 你可以定义这个服务对应于什么业务

# 我们使用关键词 server 来定义服务端

server:

# 关键词 build 是用来定义用于创建镜像的dockerfile的位置

# 这里的 'server/' 对用于server目录,它包含了需要使用的dockefile

build: server/

# command用于定义镜像被创建后运行的指令

# 这个指令将会运行 "python ./server.py".

command: python ./server.py

# 记得我们在 'server/server.py' 将服务端运行在1234 端口.

# 如果我们想从电脑上访问这个端口(容器之外)

# 我们需要将这个端口映射到容器之外

# 使用关键词 ports 可以实现这个目标

# 它的语法如下 [我们机器上的端口]:[容器的端口]

# 以下配置会把容器的端口1234映射到主机的端口1234上

ports:

- 1234:1234

# 第二个服务 (容器): 客户端.

# 我们使用关键词 'client' 作为客户端

client:

# 这里 'client/' 对应于容器内的包含dockerfile的路径

build: client/

# 容器镜像创建之后会执行 "python ./client.py".

command: python ./client.py

# 关键词 'network_mode'用于定义网络模式

# 这里我们定义容器可以访问主机的localhost

network_mode: host

# 关键词 'depends_on' 这个服务是否需要依赖于其他服务创建以后再开始创建

# 这里我们希望服务端的服务先运行起来之后在运行客户端

depends_on:

- server

5. 构建Docker-Compose

设置docker-compose后,需要构建客户端/服务器应用程序。此步骤对应于“docker build”命令,但应用于多个不同的服务。

$ docker-compose build

6. 运行Docker-Compose

你的docker-compose已经构建成功!现在是时候开始吧!这个步骤对应于“docker run”命令,但应用于不同的服务。

$ docker-compose up

您会在终端中看到“Docker-Compose is magic!”

注意:如教程中所示,您的“服务器”服务使用计算机的端口1234来分发其内容。如果您打开计算机上的“http:// localhost:1234/”页面,您应该会看到‘Docker-Compose is magic!’。

代码地址

github

Docker一些常用的命令

  • 停止并删除由“docker-compose up”创建的容器以及镜像
$ docker-compose down
  • 显示服务输出的日志(例如:'docker-compose logs -f client')
$ docker-compose logs -f [service name]
  • 列出所有的容器
$ docker-compose ps
  • 对正在运行的容器执行指令(例如:'docker-compose exec server ls'会在server服务的容器中执行ls操作)。
$ docker-compose exec [service name] [command]
  • 列出所有的镜像
$ docker-compose images

原文链接: A beginner’s guide to Docker — how to create a client/server side with docker-compose

==============================================================================

译者介绍:Grace,程序员,研究生毕业于SUNY at Stony Brook,目前供职于Linktime Cloud Company,对大数据技术以及数据可视化技术感兴趣。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK