Docker Compose 容器編排利器

基于 Docker18.09.0 docker-compose version 1.23.1


簡(jiǎn)單介紹

Compose 項(xiàng)目是 Docker 官方的開(kāi)源項(xiàng)目咪奖,負(fù)責(zé)實(shí)現(xiàn)對(duì) Docker 容器集群的快速編排盗忱。

其定位是: 定義和運(yùn)行多個(gè) Docker 容器的應(yīng)用,其前身是開(kāi)源項(xiàng)目 Fig羊赵。

一個(gè)正常的生產(chǎn)環(huán)境的項(xiàng)目趟佃,一般都包含的負(fù)載均衡器,應(yīng)用程序和數(shù)據(jù)庫(kù)昧捷。
之前我們都是把每個(gè)應(yīng)用定義在 Dockerfile 中揖闸,之后使用在命令中一個(gè)一個(gè)構(gòu)建和運(yùn)行,比如之前我和大家分享的 ELK 容器化中料身。部署起來(lái)不但繁瑣,而且容易出錯(cuò)衩茸。有沒(méi)有一種方案芹血,可以把他們整合到一起,一起進(jìn)行維護(hù)和啟動(dòng)呢?應(yīng)該他們是一個(gè)集群嘛幔烛。答案肯定是有的啃擦,這就是 Compose`。

Compose 使用一個(gè)具有 YAML風(fēng)格的文件來(lái)實(shí)現(xiàn)饿悬,這個(gè)文件一般叫做 docker-compose.yml 令蛉。通過(guò)編寫(xiě)這個(gè)文件來(lái)定義一組相互之間有關(guān)聯(lián)的應(yīng)用容器。

概念

Compose 中有兩個(gè)比較重要的概念: 服務(wù)service 和 項(xiàng)目 project狡恬。

服務(wù) service

就是一個(gè)應(yīng)用容器珠叔,實(shí)際上可以包含多個(gè)使用相同鏡像運(yùn)行的容器實(shí)例。

項(xiàng)目 project

就是由組織相互關(guān)聯(lián)的應(yīng)用容器組成的一個(gè)完整的業(yè)務(wù)單元弟劲。

Compose 的默認(rèn)管理對(duì)象是 項(xiàng)目祷安,由 Python 編寫(xiě),通過(guò)調(diào)用 Docker 服務(wù)提供的 API 實(shí)現(xiàn)兔乞。

安裝和卸載

安裝

MacWindows 系統(tǒng)汇鞭,只要安裝了 Docker,默認(rèn)就會(huì)有 docker-compose庸追。
下面只討論 Linux 環(huán)境下的安裝霍骄,建議采用下載二進(jìn)制的方式進(jìn)行安裝。

1. 下載二進(jìn)制文件到指定的目錄下

sudo curl -L "https://github.com/docker/compose/releases/download/1.23.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

更多版本見(jiàn)github

2. 對(duì)二進(jìn)制文件添加可執(zhí)行權(quán)限

sudo chmod +x /usr/local/bin/docker-compose

3. 添加命令行的自動(dòng)補(bǔ)全等功能

BASH

sudo curl -L https://raw.githubusercontent.com/docker/compose/1.23.1/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose

ZSH

$ mkdir -p ~/.zsh/completion
$ curl -L https://raw.githubusercontent.com/docker/compose/1.23.1/contrib/completion/zsh/_docker-compose > ~/.zsh/completion/_docker-compose

之后在 ~/.zshrc 中添加如下內(nèi)容

fpath=(~/.zsh/completion $fpath)
autoload -Uz compinit && compinit -i

然后重新加載你的shell:

exec $SHELL -l

4. 測(cè)試

$ docker-compose --version
ocker-compose version 1.23.1, build b02f1306
docker-py version: 3.5.0
CPython version: 3.6.7
OpenSSL version: OpenSSL 1.1.0f  25 May 2017

卸載

要卸載直接刪除二進(jìn)制文件即可

sudo rm /usr/local/bin/docker-compose

從簡(jiǎn)單示例開(kāi)始使用 Compose

以非 root 用戶運(yùn)行淡溯,參考以非root用戶身份管理Docker

1. 準(zhǔn)備數(shù)據(jù)

a. 為整個(gè)項(xiàng)目創(chuàng)建目錄读整,以便管理

$ mkdir composetest
$ cd composetest

b. 在項(xiàng)目的目錄下編輯 app.py 文件,并粘貼以下內(nèi)容

import time

import redis
from flask import Flask


app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)


def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr('hits')
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)


@app.route('/')
def hello():
    count = get_hit_count()
    return 'Hello World! I have been seen {} times.\n'.format(count)

if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=True)

在此示例中血筑,redis是應(yīng)用程序網(wǎng)絡(luò)上redis容器的主機(jī)名绘沉。我們使用Redis的默認(rèn)端口6379。

處理瞬態(tài)錯(cuò)誤
請(qǐng)注意get_hit_count函數(shù)的編寫(xiě)方式豺总。如果redis服務(wù)不可用车伞,這個(gè)基本的重試循環(huán)允許我們多次嘗試我們的請(qǐng)求。這在應(yīng)用程序聯(lián)機(jī)時(shí)啟動(dòng)時(shí)非常有用喻喳,但如果需要在應(yīng)用程序生命周期內(nèi)的任何時(shí)間重新啟動(dòng)Redis服務(wù)另玖,這也會(huì)使我們的應(yīng)用程序更具彈性。在群集中表伦,這還有助于處理節(jié)點(diǎn)之間的瞬時(shí)連接丟棄谦去。

c. 在項(xiàng)目目錄下編輯另一個(gè)文件 requirements.txt

flask
redis

此文件定義了一個(gè) Python 應(yīng)用程序需要的依賴模塊。

2. 創(chuàng)建Dockerfile

在此步驟中蹦哼,您將編寫(xiě)一個(gè)用于構(gòu)建 Docker 鏡像的 Dockerfile 鳄哭。該鏡像包含Python應(yīng)用程序所需的所有依賴項(xiàng),包括Python本身纲熏。

在項(xiàng)目目錄中妆丘,創(chuàng)建一個(gè)名為的文件Dockerfile并粘貼以下內(nèi)容:

FROM python:3.6-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "app.py"]

3. 在Compose文件中定義服務(wù)

在項(xiàng)目目錄下創(chuàng)建一個(gè)名字為 docker-compose.yml 的文件并粘貼以下內(nèi)容:

version: '3'
services:
  web:
    build: .
    ports:
     - "5000:5000"
  redis:
    image: "redis:alpine"

此Compose文件定義了兩個(gè)服務(wù)锄俄,webredis。該web服務(wù):

  • 使用從當(dāng)前目錄中的 Dockerfile 構(gòu)建鏡像勺拣。
  • 將容器上的公開(kāi)端口5000轉(zhuǎn)發(fā)到主機(jī)上的端口5000奶赠。我們使用Flask Web服務(wù)器的默認(rèn)端口5000

redis服務(wù)使用從Docker Hub 注冊(cè)倉(cāng)庫(kù)中提取的公共 Redis映像药有。

4. 使用Compose構(gòu)建并運(yùn)行您的應(yīng)用程序

$ docker-compose up

5. 編輯Compose文件以添加一個(gè) bind mount

編輯docker-compose.yml在項(xiàng)目目錄添加bind mountweb服務(wù):

version: '3'
services:
  web:
    build: .
    ports:
     - "5000:5000"
    volumes:
     - .:/code
  redis:
    image: "redis:alpine"

6. 使用Compose重新構(gòu)建并運(yùn)行應(yīng)用程序

使用Compose重新構(gòu)建并運(yùn)行應(yīng)用程序

$ docker-compose up

7. 嘗試更新應(yīng)用程序

由于應(yīng)用程序代碼現(xiàn)在使用卷安裝到容器中毅戈,因此您可以更改其代碼并立即查看更改,而無(wú)需重建映像愤惰。

a. 更改問(wèn)候語(yǔ)app.py并保存苇经。例如,將Hello World! 信息更改為Hello from Docker!

return 'Hello from Docker! I have been seen {} times.\n'.format(count)

b. 在瀏覽器中刷新應(yīng)用程序羊苟。問(wèn)候語(yǔ)應(yīng)該更新塑陵,計(jì)數(shù)器仍然應(yīng)該遞增

image.png

8. 嘗試其他一些命令

a. 后臺(tái)運(yùn)行

$ docker-compose up -d

b. 查看目前運(yùn)行的容器

$ docker-compose ps

c. 查看 web 服務(wù)的環(huán)境變量

$ docker-compose run web env

d. 停止服務(wù)

$ docker-compose stop

e. 完全刪除容器。傳遞 --volumes 還刪除Redis容器使用的數(shù)據(jù)卷:

$ docker-compose down --volumes

更多請(qǐng)參考官方文檔

水平擴(kuò)展和負(fù)載均衡

使用 up 子命令中的 --scale 可以實(shí)現(xiàn)對(duì)一個(gè)服務(wù)數(shù)量的限制蜡励。
命令格式如下:

docker-compose  up   [--scale SERVICE=NUM...] [SERVICE...]
HAProxy實(shí)現(xiàn)負(fù)責(zé)均衡
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末令花,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子凉倚,更是在濱河造成了極大的恐慌兼都,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稽寒,死亡現(xiàn)場(chǎng)離奇詭異扮碧,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)杏糙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)慎王,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人宏侍,你說(shuō)我怎么就攤上這事赖淤。” “怎么了谅河?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵咱旱,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我绷耍,道長(zhǎng)吐限,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任褂始,我火速辦了婚禮诸典,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘崎苗。我一直安慰自己狐粱,他們只是感情好赘阀,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著脑奠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪幅慌。 梳的紋絲不亂的頭發(fā)上宋欺,一...
    開(kāi)封第一講書(shū)人閱讀 51,554評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音胰伍,去河邊找鬼齿诞。 笑死,一個(gè)胖子當(dāng)著我的面吹牛骂租,可吹牛的內(nèi)容都是我干的祷杈。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼渗饮,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼但汞!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起互站,我...
    開(kāi)封第一講書(shū)人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤私蕾,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后胡桃,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體踩叭,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年翠胰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了容贝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡之景,死狀恐怖斤富,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情闺兢,我是刑警寧澤茂缚,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站屋谭,受9級(jí)特大地震影響脚囊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜桐磁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一悔耘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧我擂,春花似錦衬以、人聲如沸缓艳。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)阶淘。三九已至,卻和暖如春互妓,著一層夾襖步出監(jiān)牢的瞬間溪窒,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工冯勉, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留澈蚌,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓灼狰,卻偏偏與公主長(zhǎng)得像宛瞄,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子交胚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容