Docker部署:基于Ryu的SDN環(huán)境
前言
5月份的時(shí)候,當(dāng)我還是一個(gè)大學(xué)生的時(shí)候,有個(gè)網(wǎng)友問(wèn)我,你有研究Docker嗎?當(dāng)時(shí)我連Docker是什么都不知道。谷歌之后,對(duì)Docker產(chǎn)生興趣,但是一直沒(méi)有時(shí)間去學(xué)習(xí)。這個(gè)周終于將這個(gè)學(xué)習(xí)計(jì)劃列入了Todolist。所以我花了3天時(shí)間,認(rèn)真地把這《Docker 從入門(mén)到實(shí)踐》看完并實(shí)踐了一遍,收獲頗豐。雖然我的導(dǎo)師以及我自己還是覺(jué)得我在瞎轉(zhuǎn),而且我覺(jué)得沒(méi)有方向的日子很痛苦。所以只好自己做計(jì)劃,學(xué)習(xí)點(diǎn)新知識(shí),打打基礎(chǔ)了。本篇內(nèi)容主要介紹什么是Docker、Docker簡(jiǎn)單入門(mén)以及如何使用Docker部署SDN環(huán)境,以及docker的網(wǎng)絡(luò)配置等內(nèi)容。What is Docker和Why Docker部分摘自《Docker從入門(mén)到實(shí)踐》。
Docker是什么
Docker 是一個(gè)開(kāi)源項(xiàng)目,誕生于 2013 年初,最初是 dotCloud 公司內(nèi)部的一個(gè)業(yè)余項(xiàng)目。它基于 Google 公司推出的 Go 語(yǔ)言實(shí)現(xiàn)。 項(xiàng)目后來(lái)加入了 Linux 基金會(huì),遵從了 Apache 2.0 協(xié)議,項(xiàng)目代碼在 GitHub 上進(jìn)行維護(hù)。Redhat 已經(jīng)在其 RHEL6.5 中集中支持 Docker;Google 也在其 PaaS 產(chǎn)品中廣泛應(yīng)用。
Docker 項(xiàng)目的目標(biāo)是實(shí)現(xiàn)輕量級(jí)的操作系統(tǒng)虛擬化解決方案。 Docker 的基礎(chǔ)是 Linux 容器(LXC)等技術(shù)。
下面的圖片比較了 Docker 和傳統(tǒng)虛擬化方式的不同之處,可見(jiàn)容器是在操作系統(tǒng)層面上實(shí)現(xiàn)虛擬化,直接復(fù)用本地主機(jī)的操作系統(tǒng),而傳統(tǒng)方式則是在硬件層面實(shí)現(xiàn)。
圖1:Docker和虛擬機(jī)對(duì)比
#p#
Docker的優(yōu)勢(shì)
首先,Docker 容器的啟動(dòng)可以在秒級(jí)實(shí)現(xiàn),這相比傳統(tǒng)的虛擬機(jī)方式要快得多。 其次,Docker 對(duì)系統(tǒng)資源的利用率很高,一臺(tái)主機(jī)上可以同時(shí)運(yùn)行數(shù)千個(gè) Docker 容器。
容器除了運(yùn)行其中應(yīng)用外,基本不消耗額外的系統(tǒng)資源,使得應(yīng)用的性能很高,同時(shí)系統(tǒng)的開(kāi)銷(xiāo)盡量小。傳統(tǒng)虛擬機(jī)方式運(yùn)行 10 個(gè)不同的應(yīng)用就要起 10 個(gè)虛擬機(jī),而Docker 只需要啟動(dòng) 10 個(gè)隔離的應(yīng)用即可。
具體說(shuō)來(lái),Docker 在如下幾個(gè)方面具有較大的優(yōu)勢(shì)。
更快速的交付和部署
對(duì)開(kāi)發(fā)和運(yùn)維(devop)人員來(lái)說(shuō),最希望的就是一次創(chuàng)建或配置,可以在任意地方正常運(yùn)行。
開(kāi)發(fā)者可以使用一個(gè)標(biāo)準(zhǔn)的鏡像來(lái)構(gòu)建一套開(kāi)發(fā)容器,開(kāi)發(fā)完成之后,運(yùn)維人員可以直接使用這個(gè)容器來(lái)部署代碼。 Docker 可以快速創(chuàng)建容器,快速迭代應(yīng)用程序,并讓整個(gè)過(guò)程全程可見(jiàn),使團(tuán)隊(duì)中的其他成員更容易理解應(yīng)用程序是如何創(chuàng)建和工作的。 Docker 容器很輕很快!容器的啟動(dòng)時(shí)間是秒級(jí)的,大量地節(jié)約開(kāi)發(fā)、測(cè)試、部署的時(shí)間。
更高效的虛擬化
Docker 容器的運(yùn)行不需要額外的 hypervisor 支持,它是內(nèi)核級(jí)的虛擬化,因此可以實(shí)現(xiàn)更高的性能和效率。
更輕松的遷移和擴(kuò)展
Docker 容器幾乎可以在任意的平臺(tái)上運(yùn)行,包括物理機(jī)、虛擬機(jī)、公有云、私有云、個(gè)人電腦、服務(wù)器等。 這種兼容性可以讓用戶把一個(gè)應(yīng)用程序從一個(gè)平臺(tái)直接遷移到另外一個(gè)。
更簡(jiǎn)單的管理
使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分發(fā)和更新,從而實(shí)現(xiàn)自動(dòng)化并且高效的管理。
Docker簡(jiǎn)單入門(mén)
谷歌出來(lái)的教程實(shí)在太多了。所以我也不打算太多介紹,只講一些我覺(jué)得對(duì)于網(wǎng)絡(luò)研究人員而言比較有用的命令。
基本概念
鏡像(Image):鏡像是一個(gè)只讀模板。用戶上傳制作好的鏡像供其他人下載使用。用戶可以基于鏡像去創(chuàng)建Container。 容器(Container):容器可以理解為一個(gè)隔離起來(lái)的linux環(huán)境,用于運(yùn)行應(yīng)用,Namespace可以幫助你理解。 倉(cāng)庫(kù)(Repository):如果你會(huì)使用Git/Github的話,不難理解,就是用于存放鏡像的場(chǎng)所。
Docker安裝
本文的實(shí)驗(yàn)環(huán)境是Ubuntu14.04-amd64。非常需要注意的一點(diǎn)是,目前Docker只支持64位機(jī)器。Ubuntu14.04安裝方式有兩種:1)通過(guò)系統(tǒng)自帶包安裝和2)通過(guò)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/ubuntu docker main > /etc/apt/sources.list.d/docker.list"
- sudo apt-get update
- sudo apt-get install lxc-docker
#p#
獲取鏡像
首先,推薦到Docker注冊(cè)帳號(hào),這樣可以向使用Git/Github那樣使用Docker/Dockerhub。注冊(cè)和登陸可通過(guò)如下命令完成:
- docker login
注冊(cè)之后,可以通過(guò)如下命令進(jìn)行搜索,如搜索ryu:
- docker search ryu
可以從搜索結(jié)果中的Star來(lái)確定資源的好壞,從而找到合適的images,如muzixing/ryu。然后使用如下命令,將其拉到本地:
- docker pull muzixing/ryu
下載完成后,可以通過(guò)如下命令查看已存在的images
- docker images
圖2:images
創(chuàng)建容器
創(chuàng)建容器使用示例如下,-t=tty, -i=interactive, -d=debug, -p=port, --name 可以用于命名container。 其他的命令可以通過(guò)--help來(lái)查看。
- docker run -i -t --name <name> muzixing/ryu:SDN /bin/bash
如果你需要對(duì)端口映射,或者網(wǎng)絡(luò)配置方面的設(shè)置,還需要仔細(xì)去查看手冊(cè)。舉例如下:
- docker run -i -t -p <ip>:<host port>:<container port> --name <name> muzixing/ryu:SDN /bin/bash
以上命令創(chuàng)建并運(yùn)行了一個(gè)名字叫的container,并且將容器內(nèi)部的端口port映射到主機(jī)的某個(gè)port,完成了端口映射,允許 外網(wǎng)訪問(wèn)容器。這是容器與外界通信的方式之一。如果希望***綁定到某個(gè)固定的 IP 地址,可以在 Docker 配置文件 /etc/default/docker 中指定 DOCKER_OPTS="--ip=IP_ADDRESS",之后重啟 Docker 服務(wù)即可生效。設(shè)置網(wǎng)絡(luò)訪問(wèn)的參數(shù)默認(rèn)是 --icc=ture,如果--icc=false,則禁止網(wǎng)絡(luò)訪問(wèn)。
查看容器:
- docker ps [-opt]
-a為全部容器。
查看打印信息可以通過(guò):
- dokcer logs <name>
暫停容器:
- docker stop <name>
開(kāi)啟暫停的容器:
- docker start <name>
重啟容器:
- docker restart <name>
有時(shí)候我們開(kāi)啟了容器,但是沒(méi)有開(kāi)窗口,在后臺(tái)運(yùn)行,可以通過(guò)一下命令進(jìn)入容器:
- docker attach <name>
#p#
部署SDN控制器RYU
首先獲取鏡像:
- docker pull muzixing/ryu
然后創(chuàng)建容器,并將容器的6633端口綁定到主機(jī)的6633端口。
- docker run -i -t -p 0.0.0.0:6633:6633 --name ryu3.15 muzixing/ryu:SDN /bin/bash
進(jìn)入容器之后,運(yùn)行ryu。
在另一個(gè)能ping通運(yùn)行容器主機(jī)的機(jī)器上運(yùn)行mininet,如下圖:
從上圖可以看出控制器IP是172.16.192.128。這個(gè)IP地址的主機(jī)網(wǎng)卡信息如下:
從圖上可以看出,與mininet通信的是主機(jī)(實(shí)際情況下會(huì)是某臺(tái)服務(wù)器)eth0的地址。但是從下面的圖的容器信息中,可以看出運(yùn)行的RYU地址是172.17.0.5。為什么可以通信呢?
#p#
容器信息
因?yàn)樽隽硕丝谟成?,將主機(jī)的所有接口的6633端口的地址都轉(zhuǎn)發(fā)到容器172.17.0.5的6633端口,從而完成數(shù)據(jù)通信。其實(shí)現(xiàn)的原理是:Docker在啟動(dòng)之后,會(huì)創(chuàng)建一個(gè)docker0的網(wǎng)橋,從上圖可以看到,然后還會(huì)創(chuàng)建veth pair。其中一端掛載在網(wǎng)橋上,如上圖的vethba5f9f3,另一端是容器的網(wǎng)卡eth0,此案例中是172.17.0.5的網(wǎng)卡。其實(shí)這相當(dāng)與一個(gè)link。Docker網(wǎng)絡(luò)通信原理圖如下:
在運(yùn)行容器的主機(jī)上使用iptables命令查看NAT規(guī)則:
iptables查看NAT
同理mininet,或者其他的應(yīng)用程序也可以使用容器部署,不再贅述,讀者可自行嘗試。
上傳鏡像
首先需要將部署了應(yīng)用的容器導(dǎo)出為tar文件??梢允褂胐ocker export container > file 命令。舉例如下:
- docker export ryu3.15 > ryu.tar
然后使用docker import命令將其導(dǎo)入為鏡像:
- cat ryu.tar | sudo docker import - muzixing/ryu:sdn
以上命令為讀取ryu.tar 將其導(dǎo)入成muzixing/ryu:sdn的image。完成之后可通過(guò)docker images查看。
確保無(wú)誤之后,可將其推送到Dockerhub。
- docker push muzixing/ryu
讀者也可以嘗試更好的自動(dòng)創(chuàng)建方式。
#p#
網(wǎng)絡(luò)配置
我們完全可以將Docker理解成一個(gè)獨(dú)立的主機(jī),可以對(duì)其網(wǎng)絡(luò)進(jìn)行配置,如配置DNS,iptables等??梢酝ㄟ^(guò)啟動(dòng)時(shí)配置,也可以通過(guò)修改文件的方式配置。
- -b BRIDGE or --bridge=BRIDGE --指定容器掛載的網(wǎng)橋
- --bip=CIDR --定制 docker0 的掩碼
- -H SOCKET... or --host=SOCKET... --Docker 服務(wù)端接收命令的通道
- --icc=true|false --是否支持容器之間進(jìn)行通信
- --ip-forward=true|false --請(qǐng)看下文容器之間的通信
- --iptables=true|false --禁止 Docker 添加 iptables 規(guī)則
- --mtu=BYTES --容器網(wǎng)絡(luò)中的 MTU
文件配置則如同正常的主機(jī)配置,進(jìn)入到/etc/目錄下,修改制定文件即可。同樣的,Dokcer可以配置網(wǎng)絡(luò)鏈接的網(wǎng)橋,可以不選擇docker0網(wǎng)橋,而選擇其他網(wǎng)橋,如使用brctl創(chuàng)建的網(wǎng)橋,或者使用OpenvSwitch創(chuàng)建的網(wǎng)橋,具體操作不再贅述。
后語(yǔ)
工欲善其事,必先利其器。Docker可以允許我們更靈活地使用資源,并且可以很方便地遷移環(huán)境。比如以后需要安裝Ryu的同學(xué)就不需要再去關(guān)注,為什么six版本不夠?為什么gcc報(bào)錯(cuò)這些問(wèn)題了。只需要有一臺(tái)64位的機(jī)器,然后安裝Docker,理論上是不會(huì)有錯(cuò)的。然后將鏡像下載下來(lái),創(chuàng)建并運(yùn)行容易,就可以得到Ryu控制器運(yùn)行的環(huán)境。同理Nginx,Tornado和MySQL等軟件也可以直接獲取,而不需要自己安裝配置環(huán)境。這大大加快了生產(chǎn)環(huán)境的部署,也顯著提高了資源的利用率,個(gè)人認(rèn)為將在未來(lái)對(duì)虛擬機(jī)產(chǎn)生強(qiáng)烈的沖擊。
本文出自:http://www.muzixing.com/pages/2014/12/03/dockerbu-shu-sdnhuan-jing.html