在docker容器中部署网络程序进行通信实验

语言:python

1.实验目的:

这次试验是在docker容器中部署网络程序,初定为写一个简单的web服务器并部署到docker上,然后让其他主机访问。开发语言使用python语言。

2.实验过程:

(1)搭建python开发环境

注意,实验是要在docker容器中进行的,所以是在docker容器内安装环境的。首先新打开一个ubuntu容器,并进入

这里写图片描述

然后输入以下命令安装python3.6

sudo apt-get update 
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:jonathonf/python-3.6 
sudo apt-get update
sudo apt-get install python3.6

下载安装好后要修改系统默认python版本,这个ubuntu镜像自带的有一个python3.4.3,不好用,用管他。执行以下命令,建立软链接:

cd /usr/bin
rm python
ln -s python3.6m python

进一步检查是否安装成功:

这里写图片描述

(2) 在linux环境下,使用python3.6写一个web简单服务器

新建一个文件夹,把相应文件放入:

这里写图片描述

然后新建一个.html文件和.py文件,分别输入以下代码:

test.html

<html>
<body>
<h1>test</h1>
</body>
</html>
webtest.py

import http.server as hs
import sys, os

class ServerException(Exception):
    #空语句什么都不做,保证结构完整性
    pass
#设计BaseHTTPRequestHandler子类RequestHandler
class RequestHandler(hs.BaseHTTPRequestHandler):
    #重写BaseHTTPRequestHandler类里的方法

    def send_content(self, page, status = 200):

        self.send_response(status)
        self.send_header("Content-type", "text/html")
        self.send_header("Content-Length", str(len(page)))
        self.end_headers()
        self.wfile.write(bytes(page, encoding = 'utf-8'))

    def do_GET(self):
    #这里要处理两个异常,一个是读入路径时可能出现的异常,
    #一个是读入路径后若不是文件,要作为异常处理
        try:
            #os.getcwd()获取当前工作目录,self.path是Handler得到的路径
            full_path = os.getcwd() + self.path

            # 如果路径不存在
            if not os.path.exists(full_path):
                #触发异常
                raise ServerException("'{0}' not found".format(self.path))

            #如果该路径是一个文件
            elif os.path.isfile(full_path):

                self.handle_file(full_path)

            #如果该路径不是一个文件
            else:
                #触发异常
                raise ServerException("Unknown object '{0}'".format(self.path))

        except Exception as msg:

            self.handle_error(msg)


    def handle_file(self, full_path):

        try:
            #读取文件
            with open(full_path, 'r') as file:

                content = file.read()

            self.send_content(content,200)

        except IOError as msg:
            #处理文件时出错
            msg = "'{0}' cannot be read: {1}".format(self.path, msg)

            self.handle_error(msg)

    Error_Page = """\
    <html>
    <body>
    <h1>Error accessing {path}</h1>
    <p>{msg}</p>
    </body>
    </html>
    """#这个地方不是注释,而是一段字符串

    def handle_error(self, msg):

        #错误界面文本
        content = self.Error_Page.format(path= self.path,msg= msg)

        self.send_content(content, 404)


if __name__ == '__main__':

    httpAddress = ('', 8030)#ip地址省略代表本机

    httpd = hs.HTTPServer(httpAddress, RequestHandler)

    httpd.serve_forever()

(3)测试:

输入python webdemo.py 运行该服务器,之后程序处于等待用户访问阶段。

在本虚拟机上另开一个终端,由于这个docker容器是采用的桥接模式,因此,本虚拟机和docker容器之间是可以互通的。利用curl命令进行访问。容器ip为172.17.0.2

这里写图片描述

访问成功得到结果。

同时服务器端也有响应:

这里写图片描述

打开浏览器访问也是可以的:

这里写图片描述

注:以上所有操作均在作者在网上搜集资料后,在个人电脑上实验成功,若读者实验时失败,可能由一些未知因素导致,可与作者联系。编写的教程可能由于疏忽出错,请与作者联系。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐