利用docker调试OpenStack服务

背景

从工作开始就一直做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为例。

  1. 下载镜像
docker pull ubuntu:latest
  1. 运行容器
docker run -it -v /your_neutron_repo:/neutron ubuntu:latest bash
  1. 安装必要的软件
    运行容器后,我们安装一些必要的软件.比如pip,git,telnet等等你后面觉得你会在debug code用的上的一些工具。但是最重要的是要把neutron的依赖包给装上。
cd /neutron;pip install -r requirements
  1. 保存镜像
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即可。这样速度快,而且不用重新开启容器。
    原文作者:bad_cat
    原文地址: https://segmentfault.com/a/1190000011351908
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞