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一起安装在机器上。只需写一个简短的setup.py安装文件,就可以将Python应用打包。
- 安装setuptools
#wget http://peak.telecommunity.com/dist/ez_setup.py
#sudo python ez_setup.py
- 编写安装文件,目录结构为
myapp-demo/
├ setup.py # 安装文件
└ jj2019/ # 源代码
├ init.py #空文件即可
...jj2019.py #代码 - 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
- 执行安装文件
#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目录,而是在那儿创建一个指向当前应用位置的链接。这样如果源码改动,会马上反映到那个目录下。 - 如果是在其他Linux下安装这个tar.gz(在dist目录下存放),可以直接用
pip install xxx.tar.gz
如下
三、docker container中安装卸载telnet测试工具
- 编写Dockerfile
Dockerfile是一个文本格式的配置文件,用户可以使用Dockerfile快速创建自定义镜像。
Dockerfile由一行行的命令语句组成。一般分为四个部分:
- 基础镜像信息
- 维护者信息
- 镜像操作指令
- 容器启动时的指令
FROM ubuntu
MAINTAINER jj <jj@hi.com>
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!"
- build,构建镜像
docker build -t my-image .
注意:最后有个点,表示当前目录
- run,基于这个镜像构建容器,并运行该容器
docker run -it my-image
- 进入容器,当前目录即为WORKDIR指定的,如果不存在会自动创建
- 更新并安装myapp
4. apt-get update(or upgrade)apt-get install python-pippip install JJ2019-1.3.tar.gz
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上发布自己的镜像
- 登录https://cloud.docker.com
- 注册,用户名密码及邮箱
- 在Linux登录到我的Docker Hub,docker login -u username
- 现在运行
docker images
来获取之前创建的镜像ID - 假设要将my-image推送到DockerHub,首先我们标记该镜像
docker tag <image-id> username/仓库名:testing
标记完后,会多一个image显示 - 现在推送镜像,如下,正在上传,docker push username/my_repo
- 完成上传的结果,如下
- 此时打开dockerHub,登录你的账户,就能看到我的第一个docker镜像啦。现在任何人都可以部署这个镜像
- 无论何时更新镜像,用户都可以简单地运行
docker run my_repo/my_repo
.