自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

使用 Docker 構(gòu)建你自己的 PaaS 平臺(tái)

云計(jì)算 PaaS
我認(rèn)為 docker 用來(lái)做 PaaS 組件是非常棒的,對(duì)我來(lái)說(shuō),它簡(jiǎn)化了將自己的小型平臺(tái)改造成服務(wù)提供者的過(guò)程。你所需要做的就是 web 路由、 dockerfile 、 docker 主機(jī)、將應(yīng)用放到容器內(nèi)的方法,準(zhǔn)備好之后你就能夠做自己的 PaaS 了……

首先,我要澄清一點(diǎn),Docker 自身并不是“平臺(tái)即服務(wù)”(PaaS),而是其中重要的組件,使得部署 PaaS 更為簡(jiǎn)單。

其次,從我個(gè)人觀點(diǎn)出發(fā),我在這里談到的所謂構(gòu)建“屬于自己的 PaaS ”是指像我這樣運(yùn)行一些博客或是 Wordpress 站點(diǎn)。這些站點(diǎn)并非為了商業(yè)或盈利目的,單純用于朋友間交流,并且我有一臺(tái)聯(lián)網(wǎng)的服務(wù)器硬件設(shè)備來(lái)運(yùn)行這些網(wǎng)站。我覺得這臺(tái)服務(wù)器如果提供一個(gè) Wordpress 的 PaaS 服務(wù),能夠在需要的時(shí)候自動(dòng)進(jìn)行橫向擴(kuò)展那該是很有意思的實(shí)情。

從某種程度上來(lái)說(shuō),我所做的不過(guò)是為證明 wordpress 可以作為服務(wù)來(lái)提供,對(duì)于單個(gè)主機(jī)而言可以支持幾乎所有的應(yīng)用,并且有可以自動(dòng)擴(kuò)展到多主機(jī)的能力。

為什么不直接用 Dokku

Dokku 是一個(gè)由 Jeff Lindsay 寫的在單主機(jī)環(huán)境下構(gòu)建 PaaS 的軟件。

注: Dokku 是由 Docker 支持的迷你版 Heroku ,最小的 PaaS 實(shí)現(xiàn)工具。

雖說(shuō) Dokku 可能是最好的實(shí)現(xiàn)工具,但我不會(huì)用它,而是自己設(shè)計(jì)最小的系統(tǒng)以及創(chuàng)建 low-fi PaaS 所需的組建。而諸如 Deis 、Flynn 和 其它 的容器管理系統(tǒng)也都各具特色。

組件

以下是一些你在構(gòu)建自己的 PaaS 時(shí)可能會(huì)用到的組件。

  1. 泛域名解析( Wildcard DNS entry )
  2. Web 路由器(例如 Hipache
  3. Docker - 應(yīng)用服務(wù)器/容器,創(chuàng)建鏡像
  4. 應(yīng)用源碼
  5. 環(huán)境變量
  6. 數(shù)據(jù)存儲(chǔ),例如 MySQL 、NoSQL 、對(duì)象存儲(chǔ)等
  7. 把上邊的組件組合在一起的東西

泛域名解析

首先,你需要的是對(duì)一個(gè)域名的泛域名解析。 這篇文檔 介紹了如何使用 Namecheap 相關(guān)配置。 Namecheap 是我的注冊(cè)服務(wù)商(其他一些注冊(cè)管理服務(wù)商也有類似服務(wù),支持雙因子認(rèn)證),我購(gòu)買了一個(gè)類似于“ somedomainapp.com ”這么一個(gè)域名來(lái)運(yùn)行我的應(yīng)用,并且使用一個(gè) Namecheap 提供的泛域名解析服務(wù)。

很顯然,在一個(gè)大型的生產(chǎn)環(huán)境中,你必須管理自己的域名服務(wù)或是使用諸如 Google的DNS服務(wù)(我喜歡),或是其他一些諸如負(fù)載均衡的設(shè)備。

至此,你有了一個(gè)泛域名解析到你指定的服務(wù)IP地址,例如 *.yourdomainapp.com

Web路由

alt

(上圖為 hipache 的 non-existent domain 頁(yè)面)

我不知道改如何稱呼這一層, Heroku 稱它為 HTTP 路由 ,我想這個(gè)名字合適。

本質(zhì)上講,它的工作就是將輸入請(qǐng)求路由到正確的 web 服務(wù)器,在我們的例子中也就是 docker 容器。一個(gè)請(qǐng)求了 someapp.somedomainapp.com 的請(qǐng)求可能被送到 127.0.0.1:49899 或是 172.17.0.3:80 或其它,這背后都是docker 容器。

在我們的案例中,我使用 hipache ,它后臺(tái)使用 redis 。這也就是說(shuō)你在 hipache 中添加路由也就是把這些規(guī)則添加到 redis 里邊,并且 hipache 不需要重啟,因?yàn)樗梢圆樵?redis 以獲取域配置。默認(rèn)情況下 hipache 允許使用通配符域名,所以它可以路由任何請(qǐng)求并且如果目標(biāo)不存在則發(fā)送到默認(rèn)頁(yè)面。

我的 PoC Python 腳本被稱為“ wpd ”,它能夠輸出在 redis 中存儲(chǔ)的 hipache 鍵配置。以下的輸出意味著 hipache 隨機(jī)將對(duì) someapp.yourdomainapp.com 的請(qǐng)求平均分布到兩個(gè)容器之中,如下:

 

  1. $ wpd listkeys  
  2. someapp.yourdomainapp.com    
  3. ===> http://127.0.0.1:49156  
  4. ===> http://127.0.0.1:49157  
  5. $ redis-cli lrange someapp.yourdomainapp.com 0 -1  
  6. 1) "someapp.yourdomainapp.com"    
  7. 2) "http://127.0.0.1:49156"    
  8. 3) "http://127.0.0.1:49157"    

 

有其他很多可以做 web 路由的方法。 Dokku 使用 nginx ,還有使用 etcdvulcand ,這個(gè)新東西著實(shí)讓人興奮。 Hipache 支持 SSL ,不過(guò)幾周前 Vulcand 還不支持,但我想這肯定是在計(jì)劃內(nèi)的,因?yàn)槲沂?golang 的粉絲,所以相對(duì)有些偏心 ;) 。

Docker!

再來(lái)比較一下 Heroku 和我們正在做的實(shí)情,我認(rèn)為 Docker 能夠扮演 buildpackdyno 的角色,雖然也許嚴(yán)格說(shuō)來(lái) buildpack 不包含應(yīng)用代碼,或者更確切的說(shuō)只有應(yīng)用運(yùn)行所需的環(huán)境。把 Dockerfile 看作是一種 buildpack 也許更容易理解。

以我的 wordpress 為例,Dockerfile 文件可以創(chuàng)建 docker 鏡像以用來(lái)生成一個(gè)運(yùn)行 wordpress 應(yīng)用的容器,比如使用 apache2 + php。

Docker 管理容器,并且提供網(wǎng)絡(luò)以及網(wǎng)絡(luò)地址轉(zhuǎn)換以將 apache2 的端口暴露給 web 路由。

所以 docker 為我們做了很多事情。沒有 docker 的話,我們可能需要寫代碼以實(shí)現(xiàn)一個(gè)創(chuàng)建虛擬機(jī)鏡像的方法,并且還得管理啟動(dòng)、網(wǎng)絡(luò)、實(shí)例化等諸多的實(shí)情,這就跟寫一個(gè)簡(jiǎn)單的 packer 或 libvirtd ( kvm 或 lxc ) 一樣了,就像 openstack 做的那樣。毫無(wú)疑問(wèn)那將耗費(fèi)更多的資源。(有意思的是 packer 也能夠創(chuàng)建 docker 鏡像)

Application source code

應(yīng)用源代碼

在 Dokku 中,代碼是被 push 到一個(gè) git 容器中,并啟動(dòng)其他的進(jìn)程,這也是 Heroku 的做法。這些進(jìn)程將代碼放置到應(yīng)用容器之中。

然而,在我的 wordpress 案例中, wordpress 的代碼是可通過(guò)起始腳本下載的。一旦容器從 wordpress 鏡像啟動(dòng),起始腳本就開始運(yùn)行:

 

  1. if [ ! -e /app/wp-settings.php ]; then    
  2.         cd /app  
  3.         curl -O http://wordpress.org/latest.tar.gz  
  4.         tar zxvf latest.tar.gz  
  5.         mv wordpress/* /app  
  6.         rm -f /app/wordpress  
  7.         chown -R www-data:www-data /app  
  8.         rm -f latest.tar.gz  
  9. fi    

 

看看代碼吐吐槽,用來(lái)下載的 url 應(yīng)該從環(huán)境變量中獲取而不是如上例直接寫在代碼里邊。

git 的 push/receive 風(fēng)格可能在 PaaS 中更有效,但是我還沒有深入去研究那是怎么做到的。 Jeff Lindsay 有一個(gè)工具 gitreceive ,并且Flynn ( Jeff 的另一個(gè)項(xiàng)目)有 gitreceived 。他還有 execd 和其他項(xiàng)目,真是大忙人!

顯然,有很多方法可以講代碼放到容器中去執(zhí)行。如果要說(shuō) PaaS 有什么重要的事情,那么就是運(yùn)行代碼了。

#p#

環(huán)境變量

我認(rèn)為 docker 鏡像應(yīng)該會(huì)變得相當(dāng)普及。同時(shí)你不想將敏感的配置信息諸如密碼等放到鏡像之中,所以它們應(yīng)該從環(huán)境變量中獲取,并且這些變量需要通過(guò)某種方式注入容器環(huán)境中。

在我的 wordpress 例子中,我設(shè)定了 docker 的環(huán)境變量。 Docker 可以用“ -e ”參數(shù)運(yùn)行命令,以使得設(shè)定環(huán)境變量的方式暴露出來(lái),來(lái)看下面的例子:

 

  1. $ docker run -e FOO=bar -e BAR=foo busybox env  
  2. HOME=/    
  3. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin    
  4. HOSTNAME=6cf2d6e8acb3    
  5. FOO=bar    
  6. BAR=foo    

 

我的 wordpress 啟動(dòng)腳本檢查以下幾項(xiàng)環(huán)境變量:

 

  1. DB_NAME=${DB_NAME:-"wordpress"}    
  2. DB_USER=${DB_USER:-"wordpress"}    
  3. DB_PASSWORD=${DB_PASSWORD:-"wordpress"}    
  4. DB_HOST=${DB_HOST:-$1}    

 

并且使用它們和正確的數(shù)據(jù)庫(kù)設(shè)置創(chuàng)建 wordpress 的配置文件。

稍后我會(huì)談及“如何將所有部分整合”。我通過(guò)一個(gè) Python 腳本完成,在這個(gè)腳本中,我設(shè)置了容器的環(huán)境變量。

下面的是 python 代碼的一些片段,用環(huán)境變量初始化容器:

 

  1. env = {    
  2.   'DB_HOST': MYSQL_HOST,  
  3.   'DB_NAME': dbname,  
  4.   'DB_USER': dbname,  
  5.   'DB_PASSWORD': dbpass,  
  6. }  
  7. container = dockerConn.create_container(image, detach=True, environment=env)    

 

可以使用 docker-py 來(lái)聯(lián)合使用 docker 和 python。

另一種方法是是使用共享配置系統(tǒng),諸如我之前提到的 etcd 。

注: etcd 是一個(gè)高可用的鍵值存儲(chǔ)系統(tǒng),用于共享配置和服務(wù)發(fā)現(xiàn)。

etcd 能夠存儲(chǔ)配置信息; confd 則是一個(gè)配置管理代理軟件,能夠查詢 etcd 以生成針對(duì)應(yīng)用的 配置文件,并且能夠使用這些配置文件重啟服務(wù)。

說(shuō)了這么多,我認(rèn)為 環(huán)境/配置 變量是 PaaS 的核心部分,諸如 etcd 、confd 和 consul 都將是重要的項(xiàng)目組件。但是,對(duì)于本文所說(shuō)的 wordpress 例子而言,我們只是做一個(gè)簡(jiǎn)單的驗(yàn)證系統(tǒng),環(huán)境變量從容器運(yùn)行時(shí)中獲取。然而,我非常建議大型的 PaaS 或是其他類 PaaS 系統(tǒng)能夠使用 consul 或 etcd 這樣的組件。

數(shù)據(jù)存儲(chǔ)

如果你的應(yīng)用需要存留數(shù)據(jù),那么將數(shù)據(jù)放在某個(gè)地方就是必然的了,但是使用應(yīng)用容器來(lái)存儲(chǔ)顯然不是一個(gè)好選擇。通常來(lái)說(shuō),我認(rèn)為有兩種解決方案。

  1. 另一個(gè)容器
  2. 一個(gè)單獨(dú)的服務(wù)

對(duì)于“一個(gè)單獨(dú)的服務(wù)”而言,我指的是諸如亞馬遜 RDSOpenStack Trove (二者都是數(shù)據(jù)庫(kù)即服務(wù))或諸如 OpenStack Swift 那樣的對(duì)象存儲(chǔ)系統(tǒng)。簡(jiǎn)而言之就是有第三方管理的服務(wù),或者 Docker 也運(yùn)行其上的服務(wù)器。

另一個(gè)選擇是使用“另一個(gè) docker 容器”。再拿 wordpress 來(lái)做例子,我可能不只是啟動(dòng)一個(gè)應(yīng)用容器,而是啟動(dòng)第二個(gè)包含 MySQL 服務(wù)器的容器(或者兩個(gè)服務(wù)運(yùn)行在一個(gè)容器中)。也許 MySQL 的服務(wù)是一個(gè)容器,也許那是一個(gè)通過(guò) Ansible 配置的硬件服務(wù)器,誰(shuí)知道呢。 docker 同樣也推薦使用卷( volume ),尤其是當(dāng)數(shù)據(jù)不會(huì)分布到多個(gè)容器中的時(shí)候;如果數(shù)據(jù)分散,那么就是用 MySQL 或是 openstack swift 吧。

我認(rèn)為這幾種方式都 OK ,但是我更傾向于使用一個(gè)單獨(dú)的服務(wù)。正因如此,在我的例子中,存在一個(gè)單獨(dú)的 MySQL 服務(wù)器,所有的 wordpress 應(yīng)用都會(huì)連接它,每個(gè)應(yīng)用都有其自己的數(shù)據(jù)庫(kù)。或許這個(gè)單獨(dú)的服務(wù)也是用 docker 來(lái)完成的。

把上面講的內(nèi)容都串起來(lái)

我用一個(gè)名為 wpd 的腳本來(lái)串起所有環(huán)節(jié):

  1. 在 wpd 數(shù)據(jù)庫(kù)中傳經(jīng)一個(gè)站點(diǎn)記錄
  2. 為這個(gè) wordpress 站點(diǎn)創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)存儲(chǔ)
  3. 創(chuàng)建多個(gè) wordpress 容器
  4. 將環(huán)境變量傳送給這些容器,讓它們知道該如何連接數(shù)據(jù)庫(kù)
  5. 將站點(diǎn)添加到 redis 以便 hipache 能夠做路由/負(fù)載均衡

 

  1. $ wpd -h  
  2. usage: wpd [-h] {listkeys,addsite,listsites,addimage,deploysite,dumpsite} ...  
  3.  
  4. positional arguments:    
  5.   {listkeys,addsite,listsites,addimage,deploysite,dumpsite}  
  6.     listkeys            list all the keys in redis  
  7.     addsite             add a site to the database  
  8.     listsites           list all the sites in the database  
  9.     addimage            add a docker image to the database  
  10.     deploysite          startup a sites containers  
  11.     dumpsite            show all information about a site  
  12.  
  13. optional arguments:    
  14.   -h, --help            show this help message and exit 

 

正如你所見,有一些選項(xiàng),諸如“ addsite ”和“ deploysite ”還沒有完全弄完。添加站點(diǎn)僅僅是將其放到 wpd 數(shù)據(jù)庫(kù)中;部署站點(diǎn)意味著啟動(dòng)容器,并且向 redis 添加了信息以便 hipache 能夠?qū)?http 請(qǐng)求路由給它們。

這看起來(lái)想是一個(gè)大型系統(tǒng)…… 我不太確定哈。看起來(lái)更像是一個(gè)用戶管理系統(tǒng),因?yàn)橛脩裟軌驌碛姓军c(diǎn),站點(diǎn)能夠有名字、容器、鏡像和數(shù)據(jù)存儲(chǔ)等。

問(wèn)題

這里有幾個(gè)問(wèn)題我必須提一提(也可能我沒有全概括到)。

  • 日志

從 docker 之外獲取日志仍舊無(wú)解。所以在這里你可能需要在容器中配置 syslog 將日志記錄到一個(gè)中心系統(tǒng)中。我期望 docker 這邊能夠想辦法解決日志的問(wèn)題。

  • 文件系統(tǒng)

Wordpress 是一個(gè)很好的 Web 應(yīng)用示例,它很難擴(kuò)展,因?yàn)樗蕾囄募到y(tǒng)做數(shù)據(jù)存儲(chǔ),例如用戶上傳的多媒體文件。為了跨多個(gè) docker 主機(jī)擴(kuò)展文件系統(tǒng)你需要一個(gè)分布式的文件系統(tǒng),這個(gè)文件系統(tǒng)必須能夠支持動(dòng)態(tài)的擴(kuò)展,這很令人頭疼。所以我建議不用文件系統(tǒng)而是使用對(duì)象存儲(chǔ),例如 OpenStack Swift ,其實(shí)它并不是這么難搭。但是 Swift 并不能同時(shí)保證一致性和可用性。

  • 數(shù)據(jù)安全

我不確定什么是最好的保證數(shù)據(jù)安全的做法。一些密碼或其他重要的配置信息都需要注入容器中,并且需要存儲(chǔ)在諸如 etcd 的系統(tǒng)中,可能會(huì)被看到。

小結(jié)

在最后,我認(rèn)為 docker 用來(lái)做 PaaS 組件是非常棒的,對(duì)我來(lái)說(shuō),它簡(jiǎn)化了將自己的小型平臺(tái)改造成服務(wù)提供者的過(guò)程。你所需要做的就是 web 路由、 dockerfile 、 docker 主機(jī)、將應(yīng)用放到容器內(nèi)的方法,準(zhǔn)備好之后你就能夠做自己的 PaaS 了。請(qǐng)記住將你的容器做的盡量通用,多用環(huán)境變量和配置變量(或是從其他什么地方獲取到相關(guān)信息),并且盡可能避免使用文件系統(tǒng)。

未來(lái)展望!

很顯然我拉下了一些東西。搭建一個(gè)驗(yàn)證系統(tǒng)和實(shí)際弄一個(gè)生產(chǎn)用的 PaaS 還是有非常大的區(qū)別的。我還沒有提到諸如“服務(wù)發(fā)現(xiàn)”和“容器調(diào)度”,這些偏理論的東西可以用 etcd 或是 libswarm 來(lái)幫助你解決,雖然我不清楚 libswarm 是否能做容器調(diào)度器。最近 Google 開源了 Kubernetes ——一個(gè) docker 集群的管理工具,但是它現(xiàn)在仍然只能運(yùn)行在 GCE 上。 Apache 的 Mesos 同樣也只能運(yùn)行在它的 Deimos 項(xiàng)目上。長(zhǎng)遠(yuǎn)來(lái)看,CoreOS 有 fleet 。同樣我也沒有談到諸如資源限制問(wèn)題,如容器所用內(nèi)存、CPU 等其他的細(xì)節(jié),不過(guò)我計(jì)劃深入研究。


這篇文章由 serverascode 撰寫, 邵靖 翻譯。點(diǎn)擊 這里 可閱讀原文。

文章出自:https://www.dockboard.org/build-your-own-platform-as-a-service-with-docker/

責(zé)任編輯:林師授 來(lái)源: Docker中文社區(qū)
相關(guān)推薦

2023-07-30 17:34:53

KV存儲(chǔ)ChunkPosit

2015-02-11 09:57:21

2014-11-25 13:13:26

dockerpaasflynn

2017-02-09 09:30:18

UbuntuDokuWikiApache

2021-01-21 16:03:15

Java文本編輯器編程語(yǔ)言

2017-10-30 16:12:30

DockerServerless樹莓派

2018-07-27 16:18:30

PythonTwitter機(jī)器人

2023-12-12 13:07:16

2018-03-22 11:00:45

PythonRSS

2021-10-12 15:00:00

Jekyll網(wǎng)站生成器開源

2015-02-06 09:17:18

PaaS安全控制測(cè)試ISSO

2016-08-23 10:59:33

2020-10-26 08:34:18

知識(shí)體系普適性

2015-01-15 09:27:17

CloudFoundrPaaS開源

2013-01-11 10:18:25

PaaS新浪SAE

2011-11-23 09:22:06

云計(jì)算PaaSIaaS

2024-03-12 12:22:16

2020-04-09 14:23:44

PythonMarkdown編輯器

2012-04-19 14:30:07

華勝天成PaaS

2016-07-29 11:06:48

編程PythonShell
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)