Docker部署基于Ryu的SDN環境

jopen 10年前發布 | 32K 次閱讀 Docker

【編者按】Ryu 是由日本NTT公司負責設計研發的一款開源SDN控制器,采用Apache License開源協議標準。Ryu基于Python語言實現,使用者可以用Python語言在其上實現自己的應用。Ryu目前支持OpenFlow V1.0、V1.2、V1.3,同時支持OpenStack上的部署應用。作者通過Docker和Ryu部署了一個非常簡單的SDN網絡。

作者簡介:李呈,北郵在讀研究生,主要研究方向為SDN。個人博客: http://www.muzixing.com/

基本概念

鏡像(Image):鏡像是一個只讀模板。用戶上傳制作好的鏡像供其他人下載使用。用戶可以基于鏡像去創建Container。 

容器(Container):容器可以理解為一個隔離起來的Linux環境,用于運行應用,Namespace可以幫助你理解。 

倉庫(Repository):如果你會使用Git/Github的話,不難理解,就是用于存放鏡像的場所。

本文的實驗環境是Ubuntu14.04-amd64。非常需要注意的一點是,目前Docker只支持64位機器。Ubuntu14.04安裝方式有兩種:1)通過系統自帶包安裝和2)通過Docker源安裝。推薦第二種方式,能安裝比較新的版本。

Docker安裝

sudo apt-get install apt-transport-https
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
sudo bash -c "echo deb https://get.docker.io/ubuntudocker main > /etc/apt/sources.list.d/docker.list"
sudo apt-get update
sudo apt-get install lxc-docker

獲取鏡像

首先,推薦到 Docker注冊帳號,這樣可以向使用Git/Github那樣使用Docker/Dockerhub。注冊和登陸可通過如下命令完成:

docker login

注冊之后,可以通過如下命令進行搜索,如搜索ryu:

docker search ryu

可以從搜索結果中的Star來確定資源的好壞,從而找到合適的images,如muzixing/ryu。然后使用如下命令,將其拉到本地:

docker pull  muzixing/ryu

下載完成后,可以通過如下命令查看已存在的images

docker images

Docker部署基于Ryu的SDN環境

創建容器

創建容器使用示例如下,-t=tty, -i=interactive, -d=debug, -p=port, --name 可以用于命名container。 其他的命令可以通過--help來查看。

docker run -i -t --name <name> muzixing/ryu:SDN  /bin/bash

如果你需要對端口映射,或者網絡配置方面的設置,還需要仔細去查看手冊。舉例如下:

docker run -i -t -p  <ip>:<host port>:<container port>  --name <name> muzixing/ryu:SDN  /bin/bash

以上命令創建并運行了一個名字叫的container,并且將容器內部的端口port映射到主機的某個port,完成了端口映射,允許外網訪問容器。這是容器與外界通信的方式之一。如果希望永久綁定到某個固定的 IP 地址,可以在 Docker 配置文件 /etc/default/docker 中指定 DOCKER_OPTS="--ip=IP_ADDRESS",之后重啟 Docker 服務即可生效。設置網絡訪問的參數默認是 --icc=ture,如果--icc=false,則禁止網絡訪問。

查看容器:

docker ps [-opt]

-a為全部容器。

查看打印信息可以通過:

dokcer logs <name>

暫停容器:

docker stop <name>

開啟暫停的容器:

docker start <name>

重啟容器:

docker restart <name>

有時候我們開啟了容器,但是沒有開窗口,在后臺運行,可以通過一下命令進入容器:

docker attach <name>

部署SDN控制器RYU

首先獲取鏡像:

docker pull  muzixing/ryu

然后創建容器,并將容器的6633端口綁定到主機的6633端口。

docker run -i -t -p  0.0.0.0:6633:6633  --name ryu3.15 muzixing/ryu:SDN  /bin/bash

進入容器之后,運行ryu。

在另一個能ping通運行容器主機的機器上運行mininet,如下圖:

Docker部署基于Ryu的SDN環境

從上圖可以看出控制器IP是172.16.192.128。這個IP地址的主機網卡信息如下:

Docker部署基于Ryu的SDN環境

從圖上可以看出,與mininet通信的是主機(實際情況下會是某臺服務器)eth0的地址。但是從下面的圖的容器信息中,可以看出運行的RYU地址是172.17.0.5。為什么可以通信呢?

Docker部署基于Ryu的SDN環境

容器信息

因為做了端口映射,將主機的所有接口的6633端口的地址都轉發到容器172.17.0.5的6633端口,從而完成數據通信。其實現的原理是:Docker在啟動之后,會創建一個docker0的網橋,從上圖可以看到,然后還會創建veth pair。其中一端掛載在網橋上,如上圖的vethba5f9f3,另一端是容器的網卡eth0,此案例中是172.17.0.5的網卡。其實這相當與一個link。Docker網絡通信原理圖如下:

Docker部署基于Ryu的SDN環境

Docker網絡通信原理圖

在運行容器的主機上使用iptables命令查看NAT規則: 

Docker部署基于Ryu的SDN環境

iptables查看NAT

同理mininet,或者其他的應用程序也可以使用容器部署,不再贅述,讀者可自行嘗試。

上傳鏡像

首先需要將部署了應用的容器導出為tar文件。可以使用docker export container > file 命令。舉例如下:

docker export ryu3.15 > ryu.tar

然后使用docker import命令將其導入為鏡像:

cat ryu.tar | sudo docker import - muzixing/ryu:sdn

以上命令為讀取ryu.tar 將其導入成muzixing/ryu:sdn的image。完成之后可通過docker images查看。

確保無誤之后,可將其推送到Dockerhub。

docker push muzixing/ryu

讀者也可以嘗試更好的自動創建方式。

網絡配置

我們完全可以將Docker理解成一個獨立的主機,可以對其網絡進行配置,如配置DNS,iptables等。可以通過啟動時配置,也可以通過修改文件的方式配置。

-b BRIDGE or --bridge=BRIDGE --指定容器掛載的網橋
--bip=CIDR --定制 docker0 的掩碼
-H SOCKET... or --host=SOCKET... --Docker 服務端接收命令的通道
--icc=true|false --是否支持容器之間進行通信
--ip-forward=true|false --請看下文容器之間的通信
--iptables=true|false --禁止 Docker 添加 iptables 規則
--mtu=BYTES --容器網絡中的 MTU

文件配置則如同正常的主機配置,進入到/etc/目錄下,修改制定文件即可。同樣的,Dokcer可以配置網絡鏈接的網橋,可以不選擇docker0網橋,而選擇其他網橋,如使用brctl創建的網橋,或者使用OpenvSwitch創建的網橋,具體操作不再贅述。

后語

工欲善其事,必先利其器。Docker可以允許我們更靈活地使用資源,并且可以很方便地遷移環境。比如以后需要安裝Ryu的同學就 不需要再去關注,為什么six版本不夠?為什么gcc報錯這些問題了。只需要有一臺64位的機器,然后安裝Docker,理論上是不會有錯的。然后將鏡像 下載下來,創建并運行容易,就可以得到Ryu控制器運行的環境。同理Nginx,Tornado和MySQL等軟件也可以直接獲取,而不需要自己安裝配置 環境。這大大加快了生產環境的部署,也顯著提高了資源的利用率,個人認為將在未來對虛擬機產生強烈的沖擊。

原文鏈接:Docker部署SDN環境(責編:周小璐)

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!