?
This document uses PHP Chinese website manual Release
在此頁面上,您將構(gòu)建一個在Docker Compose上運行的簡單Python Web應(yīng)用程序。該應(yīng)用程序使用Flask框架并在Redis中維護一個計數(shù)器。雖然示例使用Python,但即使您不熟悉這些概念,此處演示的概念也應(yīng)該可以理解。
確保你已經(jīng)安裝了Docker Engine和Docker Compose。您不需要安裝Python或Redis,因為兩者都由Docker鏡像提供。
為項目創(chuàng)建一個目錄:$ mkdir composetest $ cd composetest
創(chuàng)建一個名為app.py
你的項目目錄中的文件,并將其粘貼到:from flask import從redis導(dǎo)入Flask Redis app = Flask(__ name__)redis = Redis(host ='redis',port = 6379)@ app.route('/') def hello():count = redis.incr('hits')return'Hello World!\ n'.format(count)if __name__ ==“__main__”:app.run(host =“0.0.0.0”,debug = True)在本例中,redis
redis的主機名容器在應(yīng)用程序的網(wǎng)絡(luò)上。我們使用Redis的默認(rèn)端口6379
。
requirements.txt
在項目目錄中創(chuàng)建另一個文件,并將其粘貼到:flask redis
這些定義了應(yīng)用程序的依賴關(guān)系。
在這一步中,您編寫一個Dockerfile來構(gòu)建一個Docker鏡像。該圖像包含Python應(yīng)用程序需要的所有依賴項,包括Python本身。
在您的項目目錄中,創(chuàng)建一個名為Dockerfile
并粘貼以下內(nèi)容的文件:
FROM python:3.4-alpine ADD . /code WORKDIR /code RUN pip install -r requirements.txt CMD ["python", "app.py"]
這告訴Docker:
從Python 3.4圖像開始構(gòu)建一個圖像。
將當(dāng)前目錄添加.
到/code
圖像的路徑中。
將工作目錄設(shè)置為/code
。
安裝Python依賴項。
將容器的默認(rèn)命令設(shè)置為python app.py
。
有關(guān)如何編寫Dockerfiles的更多信息,請參閱Docker用戶指南和Dockerfile參考。
創(chuàng)建一個docker-compose.yml
在您的項目目錄中調(diào)用的文件并粘貼以下內(nèi)容:
version: '3'services: web: build: . ports: - "5000:5000" redis: image: "redis:alpine"
這個撰寫文件定義了兩個服務(wù),web
并且redis
。網(wǎng)絡(luò)服務(wù):
使用Dockerfile
當(dāng)前目錄中構(gòu)建的圖像。
將容器上的暴露端口5000轉(zhuǎn)發(fā)到主機上的端口5000。我們使用Flask Web服務(wù)器的默認(rèn)端口,5000
。
該redis
服務(wù)使用從Docker Hub注冊表中提取的公共Redis映像。
從您的項目目錄中,運行啟動您的應(yīng)用程序 docker-compose up
。$ docker-compose up使用默認(rèn)驅(qū)動程序創(chuàng)建網(wǎng)絡(luò)“composetest_default”創(chuàng)建composetest_web_1 ...創(chuàng)建composetest_redis_1 ...創(chuàng)建composetest_web_1創(chuàng)建composetest_redis_1 ... done添加到composetest_web_1,composetest_redis_1 web_1 | *在http://0.0.0.0:5000/上運行(按CTRL + C退出)redis_1 | 1:C 17 Aug 22:11:10.480#oO0OoO0OoO0Oo Redis正在啟動oO0OoO0OoO0Oo redis_1 | 1:C 17 Aug 22:11:10.480#Redis version = 4.0.1,bits = 64,commit = 00000000,modified = 0,pid = 1,剛剛開始redis_1 | 1:C 17 Aug 22:11:10.480#警告:沒有指定配置文件,使用默認(rèn)配置。為了指定配置文件,請使用redis-server /path/to/redis.conf web_1 | *使用stat redis_1 |重新啟動 1:M 17 Aug 22:11:10.483 * Running mode = standalone,port = 6379。redis_1 | 1:M 8月17日22:11:10。483#警告:由于/ proc / sys / net / core / somaxconn設(shè)置為128的較低值,因此無法強制執(zhí)行TCP backlog設(shè)置511。*調(diào)試器處于活動狀態(tài)!redis_1 | 1:M 17 8月22日11:10.483#服務(wù)器初始化redis_1 | 1:M 17 Aug 22:11:10.483#警告您在內(nèi)核中啟用了透明巨大頁面(THP)支持。這將導(dǎo)致Redis的延遲和內(nèi)存使用問題。要解決此問題,請以root身份運行命令'echo never> / sys / kernel / mm / transparent_hugepage / enabled',并將其添加到您的/etc/rc.local中,以便在重新啟動后保留設(shè)置。必須在禁用THP后重新啟動Redis。web_1 | *調(diào)試器PIN:330-787-903 redis_1 | 1:M 8月22日:11:10.483 *準(zhǔn)備接受連接撰寫拉一個Redis圖像,為您的代碼建立一個圖像,并啟動您定義的服務(wù)。在這種情況下,
http://0.0.0.0:5000/
在瀏覽器中輸入以查看應(yīng)用程序正在運行。如果您在Linux,Docker for Mac或Docker本地使用Docker,則Web應(yīng)用程序現(xiàn)在應(yīng)該在Docker守護程序主機上的端口5000上偵聽。指向您的網(wǎng)絡(luò)瀏覽器http://localhost:5000
以查找Hello World
消息。如果這不解決,你也可以嘗試http://0.0.0.0:5000
。如果您在Mac上使用Docker Machine,請使用docker-machine ip MACHINE_VM
獲取Docker主機的IP地址。然后,http://MACHINE_VM_IP:5000
在瀏覽器中打開。您應(yīng)該在瀏覽器中看到一條消息:Hello World!我已經(jīng)看過1次了。
刷新頁面。數(shù)字應(yīng)該增加。你好,世界!我已經(jīng)看過2次了。
切換到另一個終端窗口,然后鍵入docker image ls
以列出本地圖像。此時列出圖片應(yīng)返回redis
并web
。$ docker image ls REPOSITORY TAG IMAGE ID創(chuàng)建大小composetest_web最新e2c21aa48cc1 4分鐘前93.8MB python 3.4-alpine 84e6077c7ab6 7天前82.5MB redis alpine 9d8fa9aa0e5b 3周前27.5MB您可以使用圖像檢查圖像docker inspect <tag or id>
。
停止應(yīng)用程序,可以docker-compose down
從第二個終端的項目目錄中運行,或者在啟動應(yīng)用程序的原始終端中按CTRL + C。
docker-compose.yml
在您的項目目錄中編輯以添加服務(wù)的綁定掛載web
:
version: '3'services: web: build: . ports: - "5000:5000" volumes: - .:/code redis: image: "redis:alpine"
新volumes
鍵將主機上的項目目錄(當(dāng)前目錄)裝載到/code
容器中,允許您即時修改代碼,而無需重新生成映像。
從您的項目目錄中鍵入docker-compose up
以使用更新的撰寫文件構(gòu)建應(yīng)用程序,然后運行它。
$ docker-compose up Creating network "composetest_default" with the default driver Creating composetest_web_1 ...Creating composetest_redis_1 ...Creating composetest_web_1 Creating composetest_redis_1 ... done Attaching to composetest_web_1, composetest_redis_1 web_1 | * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)...
Hello World
再次查看Web瀏覽器中的消息,然后刷新以查看計數(shù)增量。
Shared folders, volumes, and bind mounts
如果您的項目位于Users
目錄(cd ~
)外部,那么您需要共享您正在使用的Dockerfile和卷的驅(qū)動器或位置。如果您收到運行時錯誤,指示找不到應(yīng)用程序文件,卷掛載被拒絕或服務(wù)無法啟動,請嘗試啟用文件或驅(qū)動器共享。批量安裝需要共享驅(qū)動器用于C:\Users
(Windows)或/Users
(Mac)以外的項目,并且對于使用Linux容器的 Docker for Windows上的任何項目都需要共享驅(qū)動器。有關(guān)更多信息,請參閱Docker for Windows上的共享驅(qū)動器,Docker for Mac上的文件共享以及有關(guān)如何管理容器中的數(shù)據(jù)的一般示例。
如果您在較舊的Windows操作系統(tǒng)上使用Oracle VirtualBox,則可能會遇到如本VB故障單中所述的共享文件夾問題。較新的Windows系統(tǒng)滿足Docker for Windows的要求,并且不需要VirtualBox。
由于應(yīng)用程序代碼現(xiàn)在使用卷裝載到容器中,因此您可以更改代碼并立即查看更改,而無需重新構(gòu)建映像。
更改問候語app.py
并保存。例如,將Hello World!
消息更改為Hello from Docker!
:return'來自Docker的Hello!我已看過{}次。\ n'.format(count)
刷新瀏覽器中的應(yīng)用程序。問候應(yīng)該更新,并且柜臺應(yīng)該仍然在遞增。
如果你想在后臺運行你的服務(wù),你可以將-d
標(biāo)志(用于“分離”模式)傳遞給docker-compose up
并用于docker-compose ps
查看當(dāng)前正在運行的內(nèi)容:
$ docker-compose up -d Starting composetest_redis_1...Starting composetest_web_1...$ docker-compose ps Name Command State Ports ------------------------------------------------------------------- composetest_redis_1 /usr/local/bin/run Up composetest_web_1 /bin/sh -c python app.py Up 5000->5000/tcp
該docker-compose run
命令允許您為您的服務(wù)運行一次性命令。例如,要查看哪些環(huán)境變量可用于該web
服務(wù):
$ docker-compose run web env
請參閱docker-compose --help
查看其他可用的命令。您還可以安裝bash和zsh shell的命令補全,它還會顯示可用的命令。
如果您開始使用撰寫作品docker-compose up -d
,則可能需要在完成后與其停用服務(wù):
$ docker-compose stop
你可以把所有東西都拿下來,用down
命令徹底清除容器。通過--volumes
也可以刪除Redis容器使用的數(shù)據(jù)量:
$ docker-compose down --volumes
在這一點上,你已經(jīng)看到了Compose如何工作的基礎(chǔ)知識。
接下來,請嘗試Django,Rails或WordPress的快速入門指南
瀏覽Compose命令的完整列表
撰寫配置文件參考
要了解有關(guān)卷和綁定掛載的更多信息,請參閱管理Docker中的數(shù)據(jù)