Linux中國

使用 Docker Swarm 部署可擴展的 Python3 應用

今天,我想展示給你的就是如何使用 Docker Swarm 部署一個簡單的 Python Falcon REST 應用。這裡我不會使用dockerrun 或者是其他無服務特性,你可能會驚訝,使用 Docker Swarm 部署(複製)一個 Python(Java、Go 都一樣)應用是如此的簡單。

注意:這展示的部分步驟是截取自 Swarm Tutorial,我已經修改了部分內容,並且增加了一個 Vagrant Helper 的倉庫來啟動一個可以讓 Docker Swarm 工作起來的本地測試環境。請確保你使用的是 1.12 或以上版本的 Docker Engine。我寫這篇文章的時候,使用的是 1.12RC2 版本。注意的是,這只是一個測試版本,可能還會有修改。

你要做的第一件事,就是如果你想本地運行的話,你要保證 Vagrant 已經正確的安裝和運行了。你也可以按如下步驟使用你最喜歡的雲服務提供商部署 Docker Swarm 虛擬機系統。

我們將會使用這三台 VM:一個簡單的 Docker Swarm 管理平台和兩台 worker。

安全注意事項:Vagrantfile 代碼中包含了部分位於 Docker 測試伺服器上的 shell 腳本。這是一個潛在的安全問題,它會運行你不能控制的腳本,所以請確保你會在運行代碼之前審查過這部分的腳本

$ git clone https://github.com/chadlung/vagrant-docker-swarm
$ cd vagrant-docker-swarm
$ vagrant plugin install vagrant-vbguest
$ vagrant up

Vagrant up 命令需要一些時間才能完成。

SSH 登錄進入 manager1 虛擬機:

$ vagrant ssh manager1

在 manager1 的 ssh 終端會話中執行如下命令:

$ sudo docker swarm init --listen-addr 192.168.99.100:2377

現在還沒有 worker 註冊上來:

$ sudo docker node ls

讓我們註冊兩個新的 worker,請打開兩個新的終端會話(保持 manager1 會話繼續運行):

$ vagrant ssh worker1

在 worker1 的 ssh 終端會話上執行如下命令:

$ sudo docker swarm join 192.168.99.100:2377

在 worker2 的 ssh 終端會話上重複這些命令。

在 manager1 終端上執行如下命令:

$ docker node ls

你將會看到:

在 manager1 的終端里部署一個簡單的服務。

sudo docker service create --replicas 1 --name pinger alpine ping google.com

這個命令將會部署一個服務,它會從 worker 之一 ping google.com。(或者 manager,manager 也可以運行服務,不過如果你只是想 worker 運行容器的話,也可以禁用這一點)。可以使用如下命令,查看哪些節點正在執行服務:

$ sudo docker service tasks pinger

結果會和這個比較類似:

所以,我們知道了服務正跑在 worker1 上。我們可以回到 worker1 的會話里,然後進入正在運行的容器:

$ sudo docker ps

你可以看到容器的 id 是: ae56769b9d4d,在我的例子中,我運行如下的代碼:

$ sudo docker attach ae56769b9d4d

你可以按下 CTRL-C 來停止服務。

回到 manager1,然後移除這個 pinger 服務。

$ sudo docker service rm pinger

現在,我們將會部署可複製的 Python 應用。注意,為了保持文章的簡潔,而且容易複製,所以部署的是一個簡單的應用。

你需要做的第一件事就是將鏡像放到 Docker Hub上,或者使用我已經上傳的一個。這是一個簡單的 Python 3 Falcon REST 應用。它有一個簡單的入口: /hello 帶一個 value 參數。

放在 chadlung/hello-app 上的 Python 代碼看起來像這樣:

import json
from wsgiref import simple_server

import falcon

class HelloResource(object):
    def on_get(self, req, resp):
        try:
            value = req.get_param('value')

            resp.content_type = 'application/json'
            resp.status = falcon.HTTP_200
            resp.body = json.dumps({'message': str(value)})
        except Exception as ex:
            resp.status = falcon.HTTP_500
            resp.body = str(ex)

if __name__ == '__main__':
    app = falcon.API()
    hello_resource = HelloResource()
    app.add_route('/hello', hello_resource)
    httpd = simple_server.make_server('0.0.0.0', 8080, app)
    httpd.serve_forever()

Dockerfile 很簡單:

FROM python:3.4.4

RUN pip install -U pip
RUN pip install -U falcon

EXPOSE 8080

COPY . /hello-app
WORKDIR /hello-app

CMD ["python", "app.py"]

上面表示的意思很簡單,如果你想,你可以在本地運行該進行來訪問這個入口: http://127.0.0.1:8080/hello?value=Fred

這將返回如下結果:

{"message": "Fred"}

在 Docker Hub 上構建和部署這個 hello-app(修改成你自己的 Docker Hub 倉庫或者使用這個):

$ sudo docker build . -t chadlung/hello-app:2
$ sudo docker push chadlung/hello-app:2

現在,我們可以將應用部署到之前的 Docker Swarm 了。登錄 manager1 的 ssh 終端會話,並且執行:

$ sudo docker service create -p 8080:8080 --replicas 2 --name hello-app chadlung/hello-app:2
$ sudo docker service inspect --pretty hello-app
$ sudo docker service tasks hello-app

現在,我們已經可以測試了。使用任何一個 Swarm 節點的 IP 來訪問 /hello 入口。在本例中,我在 manager1 的終端里使用 curl 命令:

注意,Swarm 中的所有的 IP 都可以,不管這個服務是運行在一台還是更多的節點上。

$ curl -v -X GET "http://192.168.99.100:8080/hello?value=Chad"
$ curl -v -X GET "http://192.168.99.101:8080/hello?value=Test"
$ curl -v -X GET "http://192.168.99.102:8080/hello?value=Docker"

結果:

* Hostname was NOT found in DNS cache
*   Trying 192.168.99.101...
* Connected to 192.168.99.101 (192.168.99.101) port 8080 (#0)
> GET /hello?value=Chad HTTP/1.1
> User-Agent: curl/7.35.0
> Host: 192.168.99.101:8080
> Accept: */*
> 
* HTTP 1.0, assume close after body
< HTTP/1.0 200 OK
< Date: Tue, 28 Jun 2016 23:52:55 GMT
< Server: WSGIServer/0.2 CPython/3.4.4
< content-type: application/json
< content-length: 19
< 
{"message": "Chad"}

從瀏覽器中訪問其他節點:

如果你想看運行的所有服務,你可以在 manager1 節點上運行如下代碼:

$ sudo docker service ls

如果你想添加可視化控制平台,你可以安裝 Docker Swarm Visualizer(這對於展示非常方便)。在 manager1 的終端中執行如下代碼:

$ sudo docker run -it -d -p 5000:5000 -e HOST=192.168.99.100 -e PORT=5000 -v /var/run/docker.sock:/var/run/docker.sock manomarks/visualizer

打開你的瀏覽器,並且訪問: http://192.168.99.100:5000/

結果如下(假設已經運行了兩個 Docker Swarm 服務):

要停止運行 hello-app(已經在兩個節點上運行了),可以在 manager1 上執行這個代碼:

$ sudo docker service rm hello-app

如果想停止 Visualizer, 那麼在 manager1 的終端中執行:

$ sudo docker ps

獲得容器的 ID,這裡是: f71fec0d3ce1,從 manager1 的終端會話中執行這個代碼:

$ sudo docker stop f71fec0d3ce1

祝你成功使用 Docker Swarm。這篇文章主要是以 1.12 版本來進行描述的。

via: http://www.giantflyingsaucer.com/blog/?p=5923

作者:Chad Lung 譯者:MikeCoder 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國