背景
从工作开始就一直做openstack的开发,期间经历了做私有云的开发,到现在在做公有云网络控制器的开发。开发调试的时候,最让我头疼的是不是调试代码和找bug。而是将自己改动的OpenStack部署到测试环境进行测试,哪怕是一个简单的业务逻辑修改。基本上60%以上的时间都花在了部署环境上。由于后面要开发的业务逻辑实在太多,时间太短。而且恰巧接触到了强大的docker,所以经过不断的摸索,我最终能够利用docker非常方便对自己的Neutron代码进行调试。方便到什么程度?只要不与数据传输层相关,neutron业务代码的调试就如本地调试python脚本一样。再也不需要部署任何环境,甚至都不需要安装。由于我现在只做OpenStack neutron的开发,以下的介绍都基于neutron。但是其他的OpenStack组件应该也是适用,特别是除nova外与不依赖于特定环境的组件。
基本思路
利用docker的共享volume将自己的neutron代码库映射到容器里面,在容器内部再将这些代码软连接到python的dist-packages里面。如果这一步软连接都想省掉,则可以将本地代码库直接映射到容器的dist-packages里面。由于容器内的代码与本地主机是共享的,所以本地的修改可以自动应用容器里面。这意味着,你用pycharm修改了neutron的一个业务逻辑,只要在容器里将对应的neutron服务重启即可。
开发环境
目前我的开发环境是基于mac os,开发工具是pycharm。但是本套调试方案也可以基于windows和linux。
安装docker
Dock目前支持windows,mac os和linux。其中windows server2016和linux都支持native模式。windows 10和mac os只能靠虚拟机里面的docker模式支持。以下是安装方法:
注:windows的命令行是cmd,为了方便使用,建议下载一个方便的命令行工具,比如babun。
制作镜像
制作docker镜像可以通过dockerfile,也可以使用base镜像自己根据需要安装好必要的工具后,再commit成一个新的镜像。我们暂且先用后者做一个自己的镜像,并以调试neutron为例。
- 下载镜像
docker pull ubuntu:latest
- 运行容器
docker run -it -v /your_neutron_repo:/neutron ubuntu:latest bash
- 安装必要的软件
运行容器后,我们安装一些必要的软件.比如pip,git,telnet等等你后面觉得你会在debug code用的上的一些工具。但是最重要的是要把neutron的依赖包给装上。
cd /neutron;pip install -r requirements
- 保存镜像
docker commit container_id neutron:latest
在容器里运行neutron-server
启动容器
docker run -it -v /your_neutron/repo:/neutron/ -v /your_neutron_confs:/confs/ -p 9696:9696 --hostname server --name neutron_server neutron:lastest bash
- -v选项是docker volume共享功能,可以将本地的文件夹映射到容器内部,前面本地文件夹,后面是容器内部的路径.”your_neutron_confs”是neutron的配置文件(neutron库里的etc/*.conf文件和*.ini文件),包含了mq的连接信息,mysql的连接信息等。之所把这个映射进去是为了方便在外面修改这些配置文件,并将这些配置文件共享给其他的容器(比如dhcp-agent),
- -p选项是docker的端口映射功能,由于neutron的api使用的9696端口,所以我们必须把容器内部的9696端口映射出来。和-v一样,前面的port是本地的port,后面的port是容器内部的port
- –hostname是指定容器的honstname
- –name是指定容器的名称
配置
进入容器后,我们先用install一下neutron的代码,这样的话可以在bin下生成neutron-server等可执行文件。
cd /neutron;python setup.py install
删除dist-packages下面的neutron代码,并做好软连接:
rm -rf /usr/local/lib/python2.7/dist-packages/neutron
ln -s /neutron/neutron /usr/local/lib/python2.7/dist-packages/neutron
启动服务
上面的都完成后就可以启动neutron-server了。
neutron-server --config-file /confs/neutron.conf
至此,neutron-server就已经起来了。而你的代码修改只是在本地的pycharm里面做即可,修改代码后,想调试,直接将容器的服务重启下就可以了。
Tips
- 每次用完容器,可以不用删除容器,下次直接start,再attach即可。这样速度快,而且不用重新开启容器。