从工做开始就一直作openstack的开发,期间经历了作私有云的开发,到如今在作公有云网络控制器的开发。开发调试的时候,最让我头疼的是否是调试代码和找bug。而是将本身改动的OpenStack部署到测试环境进行测试,哪怕是一个简单的业务逻辑修改。基本上60%以上的时间都花在了部署环境上。因为后面要开发的业务逻辑实在太多,时间过短。并且恰巧接触到了强大的docker,因此通过不断的摸索,我最终可以利用docker很是方便对本身的Neutron代码进行调试。方便到什么程度?只要不与数据传输层相关,neutron业务代码的调试就如本地调试python脚本同样。不再须要部署任何环境,甚至都不须要安装。因为我如今只作OpenStack neutron的开发,如下的介绍都基于neutron。可是其余的OpenStack组件应该也是适用,特别是除nova外与不依赖于特定环境的组件。python
利用docker的共享volume将本身的neutron代码库映射到容器里面,在容器内部再将这些代码软链接到python的dist-packages里面。若是这一步软链接都想省掉,则能够将本地代码库直接映射到容器的dist-packages里面。因为容器内的代码与本地主机是共享的,因此本地的修改能够自动应用容器里面。这意味着,你用pycharm修改了neutron的一个业务逻辑,只要在容器里将对应的neutron服务重启便可。mysql
目前个人开发环境是基于mac os,开发工具是pycharm。可是本套调试方案也能够基于windows和linux。linux
Dock目前支持windows,mac os和linux。其中windows server2016和linux都支持native模式。windows 10和mac os只能靠虚拟机里面的docker模式支持。如下是安装方法:git
注:windows的命令行是cmd,为了方便使用,建议下载一个方便的命令行工具,好比babun。sql
制做docker镜像能够经过dockerfile,也可使用base镜像本身根据须要安装好必要的工具后,再commit成一个新的镜像。咱们暂且先用后者作一个本身的镜像,并以调试neutron为例。docker
docker pull ubuntu:latest
docker run -it -v /your_neutron_repo:/neutron ubuntu:latest bash
cd /neutron;pip install -r requirements
docker commit container_id neutron:latest
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等可执行文件。ubuntu
cd /neutron;python setup.py install
删除dist-packages下面的neutron代码,并作好软链接:windows
rm -rf /usr/local/lib/python2.7/dist-packages/neutron ln -s /neutron/neutron /usr/local/lib/python2.7/dist-packages/neutron
上面的都完成后就能够启动neutron-server了。centos
neutron-server --config-file /confs/neutron.conf
至此,neutron-server就已经起来了。而你的代码修改只是在本地的pycharm里面作便可,修改代码后,想调试,直接将容器的服务重启下就能够了。api