從工做開始就一直作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