Docker发布多线程telnet工具

记录小白初次使用docker的学习过程

思路梳理

  • [ ] 多线程telnet测试工具编写
  • [ ] 将python应用打包,能在其他Linux上安装卸载
  • [ ] docker container中安装卸载telnet测试工具
  • [ ] 在DockerHub上发布自己的镜像

一、多线程telnet测试工具编写

知识点

  • telnetlib
  • optparse
  • threading
  • class

完整代码:


# vim: set fileencoding=utf-8 :
# !/usr/bin/evn python
# -*- coding: utf-8 -*-

from optparse import OptionParser
from telnetlib import Telnet
import time
import sys
import threading

class jj2019():
    def __init__(self,host,username,passwd,count,cmd,cmdfile):
        self.host = host
        self.username = username
        self.passwd = passwd
        self.count = count
        self.cmd = cmd
        self.cmdfile = cmdfile

    def thread(self):
        print 'users count:',self.count[0]
        for i in range(int(self.count)):
            print 'threading %i '%(i+1)
            t = threading.Thread(target=self.telnet)
            t.start()
            time.sleep(1)

    def telnet(self):
        print 'call def telnet......'
        # telnet to DUT
        tn = Telnet(host=self.host[0], port=23, timeout=10)
        #tn.set_debuglevel(1)
        tn.read_until('login:')
        tn.write(self.username[0] + '\n')

        tn.read_until('password:')
        tn.write(self.passwd[0] + '\n')
        time.sleep(3)
        tn.write('config' + '\n')
        tn.read_until('#')
        tn.write('terminal length 0' + '\n')
        tn.read_until('#')
        time.sleep(3)

        # send cmd or file
        try:
            if self.cmd:
                print 'cmd++++++'
                cmd = self.cmd[0]
                tn.write(cmd + '\n')
                time.sleep(3)

                result = tn.read_very_eager()  # read everything that can be without blocking in I/O
                tn.close()
                #return result
                print '++++++++++++++++++++++++++++++\n',result
            else:
                print 'cmdfile++++++'
                fn = self.cmdfile
                with open(fn, 'rU') as f:
                    for line in f:
                        tn.write(line + '\n')
                    time.sleep(2)
                    result1 = tn.read_very_eager()
                    print  '++++++++++++++++++++++++++++++',result1
                tn.close()
        except Exception, e:
            print e

def main():
    usage = 'python jjliu2019.py [-i<host>][-u<username>][-w<passwd>][-n<count>][-c<cmd>][-f<cmdfile>]'
    parser = OptionParser(usage)

    parser.add_option("-i",dest = "host", action = "append",help = "input the host ip,which you want to telnet")
    parser.add_option('-u',dest = 'username', action = 'append',help = 'input your valid username')
    parser.add_option('-w',dest = 'passwd', action = 'append',help = 'input your valid password')
    parser.add_option('-n',dest = 'count',help='the numbers of user')
    parser.add_option('-c',dest = 'cmd', action = 'append',default = [],help = 'send one cmd which need to exec')
    parser.add_option('-f',dest = 'cmdfile',default = '',help = 'send more cmd in files ')

    args = sys.argv
    (options,args) = parser.parse_args()

    if options.host!=None and options.username!=None and options.passwd!=None and options.count!=None and \
        (options.cmd!=None or options.file!=None):
        print 'args:', options.host, options.username, options.passwd, options.count, options.cmd
    else:
        parser.error(usage)

    nn = jj2019(options.host,options.username,options.passwd,options.count,options.cmd,options.cmdfile)
    print 'main will start thread....'
    #nn.telnet()
    nn.thread()

if __name__ == '__main__':
    main()r

二、将python应用打包,能在其他Linux安装卸载

Python打包分发工具setuptools简介

作为Python标准的打包及分发工具,setuptools简单易用。它会随着Python一起安装在机器上。只需写一个简短的setup.py安装文件,就可以将Python应用打包。

  1. 安装setuptools
    #wget http://peak.telecommunity.com/dist/ez_setup.py
    #sudo python ez_setup.py

  2. 编写安装文件,目录结构为
    myapp-demo/
    ├ setup.py # 安装文件
    └ jj2019/ # 源代码
    init.py #空文件即可
    ...jj2019.py #代码
  3. setup.py如下
# vim: set fileencoding=utf-8 :
# !/usr/bin/evn python
# -*- coding: utf-8 -*-
from setuptools import setup

setup(
    name= 'JJ2019', #package-name
    version='1.3',
    author='jj',
    description='this is a muti-threading telnet client tool',
    packages=['jj2019'],
    include_package_data = True,
    zip_safe=True,

    entry_points={
        'console_scripts':[
            'jj2019 = jj2019.jj2019:main'
        ]
    }
)r
  1. 执行安装文件
    #python setup.py bdist_egg
    以上是在当前目录下的dist目录下创建egg文件,名为JJ2019-3.0-py2.7.egg,同时多了build和JJ2019.egg-info子目录来存放打包的中间结果。

    #python setup.py sdist --formats=gztar
    创建tar.gz安装包

    #python setup.py install(or develop)
    安装应用,用install会将当前应用安装到当前python环境的site-packages目录下,其他程序就可以像导入标准库一样导入该应用的代码;而用develop则是使用开发方式安装,代码不会真的被copy到本地site-packages目录,而是在那儿创建一个指向当前应用位置的链接。这样如果源码改动,会马上反映到那个目录下。

  2. 如果是在其他Linux下安装这个tar.gz(在dist目录下存放),可以直接用pip install xxx.tar.gz 如下
    79d9802347457e2f8f89f4ed4e2ab4b7.png

三、docker container中安装卸载telnet测试工具

  1. 编写Dockerfile
    Dockerfile是一个文本格式的配置文件,用户可以使用Dockerfile快速创建自定义镜像。
    Dockerfile由一行行的命令语句组成。一般分为四个部分:
    • 基础镜像信息
    • 维护者信息
    • 镜像操作指令
    • 容器启动时的指令
      ```
      FROM ubuntu
      MAINTAINER jj [email protected]

RUN mkdir testdir
COPY ["JJ2019-1.3.tar.gz","."]

RUN apt-get install python2.7
RUN apt-get install python-pip

CMD /bin/bash
ENV WELCOME "you are in mycontainer,welcome!"
```

  1. build,构建镜像
    docker build -t my-image .

    注意:最后有个点,表示当前目录
    775889bc96232db81c55985b42345d54.png

  2. run,基于这个镜像构建容器,并运行该容器
    docker run -it my-image
    进入容器,当前目录即为WORKDIR指定的,如果不存在会自动创建

    74a2178186562f727b7cb8a04c8b1093.png

  3. 更新并安装myapp
    apt-get update(or upgrade)
    apt-get install python-pip
    pip install JJ2019-1.3.tar.gz

    a85ae26f8b6b25d24d7ae3353f3db1bd.png

docker常用命令行梳理
Ctrl+p+q可以退出当前container,而不stop它

容器 = 镜像 + 可读层

  • docker create 为指定的image添加一个可读写层,构成了一个新的容器。注意,这个容器并没有运行。
  • docker start 为容器创建了一个进程隔离空间。注意,每个容器只能有一个进程隔离空间。

  • docker run 是上面两条的组合,它首先利用image创建了一个container,然后运行这个container。

  • docker ps 列出所有运行中的container,隐藏了非运行状态的container,加-a 会列出所有container

  • docker images 列出所有顶层top-level镜像(image),只有创建container时使用的image或直接pull下来的image能被称为顶层镜像,并且每个顶层镜像下面都隐藏了多个镜像层。加-a 列出所有image,即所有可读层。如果想查看某个image-id下的所有层,可以使用docker history来查看。

  • docker stop 会向容器发送一个SIGTERM的信号,然后停止所有的进程。

  • docker kill 会向容器发送一个不友好的SIGTERM的信号。

  • docker rm 会移除构成container的可读写层,只能对不在运行的container执行。

  • docker build xxxx 会根据Dockerfile文件中的FROM指令获取到image,然后重复的①run,②修改,③commit。在循环中每一步都会生成一个新的层,因此许多层会被创建。

image是文件,container是进程。container是基于image创建的,也即container中的进程依赖于image中的文件(库文件、配置文件等)

四、在DockerHub上发布自己的镜像

  1. 登录https://cloud.docker.com

  2. 注册,用户名密码及邮箱
  3. 在Linux登录到我的Docker Hub,docker login -u username
    e7d07b004fbebdf8cd30b7cbbbbc1f8e.png

  4. 现在运行docker images来获取之前创建的镜像ID
  5. 假设要将my-image推送到DockerHub,首先我们标记该镜像docker tag <image-id> username/仓库名:testing
    92c95e2235661ac15ecbd26ca60c5468.png
    标记完后,会多一个image显示
    a5e4f0283162ecbd175b17cb0bac9dae.png

  6. 现在推送镜像,如下,正在上传,docker push username/my_repo
    2f22cf41e16177068ed2d3dfc8cef329.png

  7. 完成上传的结果,如下
    f567c66f4dab8d00031a015ebc5a007b.png

  8. 此时打开dockerHub,登录你的账户,就能看到我的第一个docker镜像啦。现在任何人都可以部署这个镜像
    037b09c2f24d1a8fea9ee3d36ed1b7de.png

  9. 无论何时更新镜像,用户都可以简单地运行docker run my_repo/my_repo

.

猜你喜欢

转载自www.cnblogs.com/river-1212/p/10317165.html
今日推荐