anyproxy的docker化

由于项目上的需要,需要抓包分析app的请求的url特征,因而就需要在手机上配置代理服务器,项目组的同事一直都是使用fiddle或者wireshark来分析app的请求url,代理服务器则是使用带有无线网卡的电脑提供热点来作为代理服务器或者监听网关。

这种模式需要每个同事都要有安装配置一套环境,会有很多的不便。经过查找资料,得知anyproxy能够满足抓取app的请求url的需求,但是目前anyproxy无法区分多台使用anyproxy代理的设备,无法多个设备使用同一个anyproxy代理服务器。

docker可以很方便的把不同的进程隔离,可以快速的启动不同的代理服务器,于是决定使用docker起多个anyproxy代理服务器的实例。

anyproxy的docker化中遇到了不少问题,这里做个记录:
首先找到一个anyproxy-docker
使用命令
docker run -d --name anyproxy -p "8001:8001" -p "8002:8002" -v $(pwd):/anyproxy jmcn/anyproxy-docker
使用后手机配置代理之后,anyproxy的web ui不能实时显示新产生的url。经过查询资料得知web ui的实时更新是通过websocket来实现的,但是该websocket的ip地址是docker container的ip地址,除了docker host之外的计算机不能连接到docker container的ip。

通过查看anyproxy的源码得知,websocket的ip是通过直接获取container的ip地址,一时不太容易找到修改的办法,通过修改源码把anyproxy的websocket的地址修改为docker host的地址。

由于只是简单的修改了,无法publish到npm上,于是就是想直接使用源码来启动anyproxy代理服务器,于是修改了anyproxy-docker的Dockerfile。

FROM node:6.9.2
MAINTAINER admin@pxene.com
EXPOSE 8001
EXPOSE 8002
EXPOSE 8103

RUN echo "#!/bin/sh" > /usr/bin/open && \
    echo "exit 0" >> /usr/bin/open &&\
    chmod +x /usr/bin/open

RUN mkdir /anyproxy
COPY anyproxy /anyproxy
RUN node /anyproxy/bin.js --root
COPY anyproxy /anyproxy
CMD node /anyproxy/bin.js --intercept --ws 8103 --file /anyproxy/anyproxy.log

anyproxy文件夹是修改后anyproxy的源码,使用docker build构建images之后,使用命令
docker run -d --ip 172.20.100.100 --net docker1 --name anyproxy -p 8100:8001 -p 8101:8002 -p 8103:8103 -v /root/docker/anyproxy/anyproxy_log:/anyproxy anyproxy:version启动的时候总是报错"can't not find module '/anyproxy/bin.js'"。

因为对docker的使用不熟悉,一直不明白为什么明明在构建的时候是copy了anyproxy的源码文件到images中的,但是启动的时候就是找不到文件。

经过把Dockerfile的CMD去掉后,直接启动生成的镜像,由于没有CMD命令,container启动后直接就退出了。
由于这个原因,添加一个直接打印echo "hello world"的命令就能够保证container启动后不会退出。然后通过
docker run -it anyproxy:version /bin/bash进入查看/anyproxy下是有bin.js的,直接在container中执行node bin.js也没问题。

后来查询得知,使用docker run启动的时候使用-v的话,就会直接把/root/docker/anyproxy/anyproxy_log挂载到/anyproxy,会覆盖在image构建的时候的copy到/anyproxy的目录中,所以才会出现找不到要执行的bin.js文件。

参考链接