基于 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)兔乞。
安裝和卸載
安裝
Mac
和 Windows
系統(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ù)锄俄,
web
和redis
。該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 mount的web
服務(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)該遞增
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...]