<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在這個頁面上,你可以建立一個簡單的Python網路應用程式,執行在Docker Compose上。該應用使用Flask框架,並在Redis中維護一個點選計數器。雖然樣本使用了Python,但即使你不熟悉它,這裡展示的概念也應該是可以理解的。(官網教學翻譯)
請確保你已經安裝了Docker Engine和Docker Compose。你不需要安裝Python或Redis,因為兩者都是由Docker映象提供的。
定義應用程式的依賴。
$ mkdir composetest $ cd composetest
app.py
的檔案,並把以下內容貼上進去: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)
在這個例子中,redis
是應用程式網路中的redis容器的主機名。我們使用Redis的預設埠,6379。
處理瞬時錯誤 注意
get_hit_count
函數的編寫方式。這個基本的重試迴圈讓我們在redis服務不可用時多次嘗試我們的請求。這在應用程式上線的時候很有用,而且如果Redis服務需要在應用程式的生命週期內隨時重啟,這也使我們的應用程式更具彈性。在一個叢集中,這也有助於處理節點之間的瞬間連線中斷。
requirements.txt
的檔案,並將以下內容貼上進去:flask redis
在這一步,你要寫一個Dockerfile來構建一個Docker映象。這個映象包含了Python應用程式所需的所有依賴項,包括Python本身。
在你的專案目錄中,建立一個名為 Dockerfile
的檔案並貼上以下內容:
# syntax=docker/dockerfile:1 FROM python:3.7-alpine WORKDIR /code ENV FLASK_APP=app.py ENV FLASK_RUN_HOST=0.0.0.0 RUN apk add --no-cache gcc musl-dev linux-headers COPY requirements.txt requirements.txt RUN pip install -r requirements.txt EXPOSE 5000 COPY . . CMD ["flask", "run"]
這告訴Docker:
從Python 3.7映象開始構建一個映象。
設定工作目錄為 /code
。
設定 flask
命令使用的環境變數。
安裝gcc和其他依賴項
複製 requirements.txt
並安裝Python依賴項。
給映象新增後設資料,描述容器在5000埠上監聽
將專案中的當前目錄.複製到映象中的工作目錄.。
將容器的預設命令設定為 flask run
。
在你的專案目錄下建立一個名為 docker-compose.yml
的檔案,並貼上以下內容:
version: "3.9" services: web: build: . ports: - "8000:5000" redis: image: "redis:alpine"
這個 Compose 檔案定義了兩個服務:web
和 redis
。
web
服務使用一個從當前目錄下的 Dockerfile
檔案構建的映象。然後它將容器和主機繫結到暴露的埠8000上。本例服務使用Flask網路伺服器的預設埠,即5000。
redis
服務使用了一個從Docker Hub倉庫中拉取的公共Redis映象。
docker-compose up
來啟動你的應用程式。$ 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) redis_1 | 1:C 17 Aug 22:11:10.480 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo redis_1 | 1:C 17 Aug 22:11:10.480 # Redis version=4.0.1, bits=64, commit=00000000, modified=0, pid=1, just started redis_1 | 1:C 17 Aug 22:11:10.480 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf web_1 | * Restarting with stat redis_1 | 1:M 17 Aug 22:11:10.483 * Running mode=standalone, port=6379. redis_1 | 1:M 17 Aug 22:11:10.483 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. web_1 | * Debugger is active! redis_1 | 1:M 17 Aug 22:11:10.483 # Server initialized redis_1 | 1:M 17 Aug 22:11:10.483 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled. web_1 | * Debugger PIN: 330-787-903 redis_1 | 1:M 17 Aug 22:11:10.483 * Ready to accept connections
Compose會拉取一個Redis映象,為你的程式碼構建一個映象,並啟動你定義的服務。在這種情況下,程式碼在構建時被靜態地複製到映象中。
如果你在本地Linux上使用Docker、Docker Desktop for Mac或Docker Desktop for Windows,那麼網路應用現在應該在你的Docker守護主機上監聽8000埠。將你的網路瀏覽器指向http://localhost:8000,找到`Hello World` 訊息。如果這還沒有解決,你也可以試試http://127.0.0.1:8000。
你應該在你的瀏覽器中看到一條訊息說:
Hello World! I have been seen 1 times.
3. 重新整理頁面。
這個數位應該是遞增的。
Hello World! I have been seen 2 times.
docker image ls
來列出本地影象。在這一點上,列出影象應該返回 redis
和 web
。
$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE composetest_web latest e2c21aa48cc1 4 minutes ago 93.8MB python 3.4-alpine 84e6077c7ab6 7 days ago 82.5MB redis alpine 9d8fa9aa0e5b 3 weeks ago 27.5MB
你可以用 docker inspect <tag or id>
檢查映象。
docker-compose down
,或者在啟動應用程式的原始終端中點選CTRL+C。在你的專案目錄中編輯 docker-compose.yml
,為 web
服務新增一個繫結掛載。
version: "3.9" services: web: build: . ports: - "8000:5000" volumes: - .:/code environment: FLASK_ENV: development redis: image: "redis:alpine"
新的 volumes
鍵將主機上的專案目錄(當前目錄)掛載到容器內的 /code
,允許你即時修改程式碼,而不需要重建映象。environment
鍵設定 FLASK_ENV
環境變數,它告訴 flask run
在開發模式下執行,並在程式碼變化時重新載入。這種模式只應在開發中使用。
在你的專案目錄下,輸入 docker-compose up
,用更新的Compose檔案構建應用程式,並執行它。
$ 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
訊息,並重新整理以看到計數的增加。
共用資料夾、卷和繫結掛載
如果你的專案在
Users
目錄之外(cd ~
),那麼你需要共用你正在使用的Dockerfile檔案和volume的驅動器或位置。如果你得到執行時的錯誤,表明找不到應用檔案,卷掛載被拒絕,或服務無法啟動,請嘗試啟用檔案或驅動器共用。卷掛載需要在C:Users
(Windows)或/Users
(Mac)之外的專案共用驅動器,而且對於Docker Desktop for Windows上任何使用Linux容器的專案都是必需的。如果你在舊的Windows作業系統上使用Oracle VirtualBox,你可能會遇到這個VB故障單中描述的共用資料夾的問題。較新的Windows系統符合Docker Desktop for Windows的要求並且不需要VirtualBox。
因為應用程式程式碼現在是用volume裝入容器的,所以你可以對其程式碼進行修改,並立即看到變化,而不需要重建映象。
改變 app.py
中的問候語,並儲存它。例如,將 Hello World!
的資訊改為 Hello from Docker!
。
return 'Hello from Docker! I have been seen {} times.n'.format(count)
在你的瀏覽器中重新整理該應用程式。問候語應該被更新,而計數器應該仍然在遞增。
如果你想在後臺執行你的服務,你可以向 docker-compose up
傳遞 -d
標誌(用於 "分離 "模式),並使用docker-compose ps
來檢視當前正在執行的內容:
$ docker-compose up -d Starting composetest_redis_1... Starting composetest_web_1... $ docker-compose ps Name Command State Ports ------------------------------------------------------------------------------------- composetest_redis_1 docker-entrypoint.sh redis ... Up 6379/tcp composetest_web_1 flask run Up 0.0.0.0:8000->5000/tcp
docker-compose
的執行命令允許你為你的服務執行一次性的命令。例如,看看 web
服務有哪些環境變數可用:
$ docker-compose run web env
參見 docker-compose --help
以檢視其他可用的命令。
如果你用 docker-compose up -d
啟動了Compose,一旦你完成了你的服務,就停止它們:
$ docker-compose stop
你可以用 down
命令來關閉一切,完全刪除容器。通過 --volumes
,也可以刪除Redis容器所使用的資料卷:
$ docker-compose down --volumes
在這一點上,你已經明白了 Compose 是如何工作的。
到此這篇關於Docker Compose 搭建簡單的Python網路應用程式的詳細步驟的文章就介紹到這了,更多相關Docker Compose 搭建Python網路應用程式內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45