Step 1: 定義python應(yīng)用
1 .創(chuàng)建工程目錄
$ mkdir compose_test
$ cd compose_test
$ mkdir src # 源碼文件夾
$ mkdir docker # docker配置文件夾
2 .在compose_test/src/目錄下創(chuàng)建python flask應(yīng)用 compose_test/src/app.py文件。
from flask import Flask
from redis import Redis
app = Flask(__name__)
redis = Redis(host='redis', port=6379)
@app.route('/')
def hello():
count = redis.incr('hits')
return 'Hello World! I have been seen {} times.\n'.format(count)
if __name__ == "__main__":
app.run(host="0.0.0.0", debug=True)
3 .創(chuàng)建python 需求文件 compose_test/docker/requirements.txt
flask
redis
Step 2: 創(chuàng)建容器的Dockerfile文件
一個容器一個Dockerfile文件
為了工程目錄更加清晰苔巨,在compose_test/docker/目錄下創(chuàng)建compose_test/docker/web目錄
$ cd docker
$ mkdir web
在compose_test/docker/web/目錄中創(chuàng)建Dockerfile文件:
FROM python:3.4
ADD . /docker
ADD ../../src /src # ADD的源路徑應(yīng)該在Dockerfile文件的上下文環(huán)境中(即Dockerfile文件所在根目錄及其子目錄下词爬,如ADD . /src是合法的鹃共,而ADD ../../src /src不合法)窘茁,此處為了清晰的項(xiàng)目結(jié)構(gòu)瞪醋,只是展示ADD指令成黄,實(shí)際中應(yīng)該用volumes掛載
WORKDIR /src
RUN pip install -r /docker/requirements.txt
CMD ["python", "app.py"]
Dockerfile文件告訴docker了如下信息:
從Python 3.4鏡像開始構(gòu)建一個容器鏡像玻墅。
復(fù)制當(dāng)前 . (即compose_test/docker)目錄到容器的/docker目錄介牙。
復(fù)制../../src目錄(即compose_test/src) 到容器中的/src目錄(此處../../src是不合法的路徑,ADD的源路徑必須在Dockerfile文件的上下文環(huán)境中澳厢,即Dockerfile文件所在根目錄或起子目錄中环础,實(shí)際應(yīng)該使用volumes掛載項(xiàng)目源文件)。
將容器的工作目錄設(shè)置為/src剩拢。
安裝Python依賴關(guān)系线得。
將容器的默認(rèn)命令設(shè)置為python app.py。
Step 3: 定義docker-compose腳本
在compose_test/docker/目錄下創(chuàng)建docker-compose.yml文件徐伐,并在里面定義服務(wù)贯钩,內(nèi)容如下:
version: '3'
services:
web:
build: ./web/
ports:
- "5000:5000"
redis:
image: "redis:3.0.7"
這個compose文件定義了兩個服務(wù),即定義了web和redis兩個容器办素。
web容器:
* 使用當(dāng)前的web目錄(compose_test/docker/web/)中的Dockerfile構(gòu)建映像角雷。
* 將容器上的暴露端口5000映射到主機(jī)上的端口5000。 我們使用Flask Web服務(wù)器的默認(rèn)端口5000性穿。
redis容器:
* redis服務(wù)使用從Docker Hub提取的官方redis鏡像3.0.7版本勺三。
Step 4: 使用Compose構(gòu)建并運(yùn)行您的應(yīng)用程序
在compose_test/docker/目錄下執(zhí)行docker-compose.yml文件:
$ docker-compose up
# 若是要后臺運(yùn)行: $ docker-compose up -d
# 若不使用默認(rèn)的docker-compose.yml 文件名:
$ docker-compose -f server.yml up -d
然后在瀏覽器中輸入http://0.0.0.0:5000/查看運(yùn)行的應(yīng)用程序。
Step 5: 編輯compose文件以添加文件綁定掛載
上面的代碼是在構(gòu)建時靜態(tài)復(fù)制到容器中的需曾,即通過Dockerfile文件中的ADD ./src /src命令實(shí)現(xiàn)物理主機(jī)中的源碼復(fù)制到容器中吗坚,這樣在后續(xù)物理主機(jī)src目錄中代碼的更改不會反應(yīng)到容器中。
可以通過volumes 關(guān)鍵字實(shí)現(xiàn)物理主機(jī)目錄掛載到容器中的功能(同時刪除Dockerfile中的ADD指令呆万,不需要創(chuàng)建鏡像時將代碼打包進(jìn)鏡像商源,而是通過volums動態(tài)掛載,容器和物理host共享數(shù)據(jù)卷):
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- ../src :/src
redis:
image: "redis:3.0.7"
通過volumes(卷)將主機(jī)上的項(xiàng)目目錄(compose_test/src)掛載到容器中的/src目錄下谋减,允許您即時修改代碼牡彻,而無需重新構(gòu)建映像。
Step 6: 重新構(gòu)建和運(yùn)行應(yīng)用程序
使用更新的compose文件構(gòu)建應(yīng)用程序逃顶,然后運(yùn)行它讨便。
$ docker-compose up -d