Dockerfile ที่เกี่ยวข้องpython3.9 , latest (DockerFile) แท็กเหล่านี้ไม่ได้รับการสนับสนุนหรือบำรุงรักษาอีกต่อไปพวกเขาจะถูกลบออกจากที่เก็บ GitHub แต่เวอร์ชันสุดท้ายที่ผลักดันอาจยังคงมีอยู่ใน Docker Hub หากใครก็ตามที่ดึงพวกเขา:
python3.9-alpine3.13python3.8python3.8-alpine3.11python3.7python3.7-alpine3.8python3.6python3.6-alpine3.8python2.7แท็กวันที่สุดท้ายสำหรับเวอร์ชันเหล่านี้คือ:
python3.9-alpine3.13-2024-03-11python3.8-2024-10-28python3.8-alpine3.11-2024-03-11python3.7-2024-10-28python3.7-alpine3.8-2024-03-11python3.6-2022-11-25python3.6-alpine3.8-2022-11-25python2.7-2022-11-25 หมายเหตุ : มีแท็กสำหรับแต่ละวันที่สร้าง หากคุณต้องการ "ปักหมุด" เวอร์ชันภาพ Docker ที่คุณใช้คุณสามารถเลือกหนึ่งในแท็กเหล่านั้น เช่น tiangolo/meinheld-gunicorn-flask:python3.9-2024-11-02
Docker Image with Meinheld จัดการโดย Gunicorn สำหรับเว็บแอปพลิเคชันประสิทธิภาพสูงใน Flask โดยใช้ Python พร้อมการปรับแต่งอัตโนมัติ
GitHub repo : https://github.com/tiangolo/meinheld-gunicorn-flask-docker
Docker Hub Image : https://hub.docker.com/r/tiangolo/meinheld-gunicorn-flask/
แอปพลิเคชั่นเว็บ Python Flask ที่ทำงานร่วมกับ Meinheld ควบคุมโดย Gunicorn มีการแสดงที่ดีที่สุดบางอย่างที่สามารถทำได้โดย Flask (*)
หากคุณมีแอปพลิเคชันที่มีอยู่แล้วใน Flask หรือกำลังสร้างแอปพลิเคชั่นใหม่ภาพนี้จะให้ประสิทธิภาพที่ดีที่สุดเท่าที่จะเป็นไปได้ (หรือใกล้เคียงกับที่)
ภาพนี้มีกลไก "ปรับจูนอัตโนมัติ" เพื่อให้คุณสามารถเพิ่มรหัสของคุณและรับ ประสิทธิภาพที่ดี โดยอัตโนมัติ และโดยไม่ต้องเสียสละ (เช่นการตัดไม้)
รุ่นล่าสุดของ Meinheld เปิดตัวคือ 1.0.2 ตั้งแต่วันที่ 17 พฤษภาคม 2020 รุ่น Meinheld รุ่นนี้ต้องการ Greenlet รุ่นเก่า ( >=0.4.5,<0.5 ) ที่ไม่สามารถใช้งานได้กับ Python 3.10 และ 3.11 นั่นเป็นเหตุผลที่ Python เวอร์ชันล่าสุดที่รองรับในภาพนี้คือ Python 3.9
หากคุณกำลังเริ่มโครงการใหม่คุณอาจได้รับประโยชน์จากกรอบใหม่และเร็วกว่าเช่น Fastapi (ขึ้นอยู่กับ ASGI แทนที่จะเป็น WSGI เช่น Flask และ Django) และภาพนักเทียบท่าเช่น Tiangolo/Uvicorn-Gunicorn-Fastapi
มันจะทำให้คุณมีประสิทธิภาพประมาณ 200% ที่สามารถทำได้ด้วย Flask แม้ว่าจะใช้ภาพนี้
นอกจากนี้หากคุณต้องการใช้เทคโนโลยีใหม่ ๆ เช่น WebSockets มันจะง่ายขึ้นด้วยเฟรมเวิร์กใหม่ที่ใช้ ASGI เช่น Fastapi เนื่องจาก ASGI มาตรฐานได้รับการออกแบบให้สามารถจัดการรหัสแบบอะซิงโครนัสได้เช่นเดียวกับที่จำเป็นสำหรับ WebSockets
Meinheld เป็นเว็บเซิร์ฟเวอร์ที่มีประสิทธิภาพสูง WSGI
คุณสามารถใช้ Gunicorn เพื่อจัดการ meinheld และเรียกใช้หลายกระบวนการของมัน
Flask เป็น microframework สำหรับ Python ตาม Werkzeug, Jinja 2 และความตั้งใจที่ดี
ภาพนี้ถูกสร้างขึ้นเพื่อเป็นทางเลือกแทน Tiangolo/Uwsgi-Nginx-Flask ซึ่งให้ประสิทธิภาพของภาพนั้นประมาณ 400%
มันขึ้นอยู่กับภาพทั่วไปที่มากขึ้น Tiangolo/Meinheld-Gunicorn นั่นคือสิ่งที่คุณจะใช้สำหรับเฟรมเวิร์ก WSGI อื่น ๆ เช่น Django
คุณอาจใช้ Kubernetes หรือเครื่องมือที่คล้ายกัน ในกรณีนี้คุณอาจ ไม่ต้องการภาพนี้ (หรือ ภาพฐานอื่น ๆ ที่คล้ายกัน ) คุณน่าจะดีกว่าใน การสร้างภาพนักเทียบท่าตั้งแต่เริ่มต้น
หากคุณมีกลุ่มเครื่องจักรที่มี Kubernetes , Docker Swarm Mode, Nomad หรือระบบที่ซับซ้อนอื่น ๆ ที่คล้ายกันเพื่อจัดการคอนเทนเนอร์แบบกระจายในหลายเครื่องคุณอาจต้องการ จัดการการจำลองแบบ ที่ ระดับคลัสเตอร์ แทนที่จะใช้ตัว จัดการ กระบวนการ ในแต่ละคอนเทนเนอร์
ในกรณีเหล่านั้น (เช่นการใช้ Kubernetes) คุณอาจต้องการสร้าง อิมเมจนักเทียบท่าตั้งแต่เริ่มต้น การติดตั้งการพึ่งพาของคุณและเรียกใช้ กระบวนการเดียว แทนภาพนี้
ตัวอย่างเช่นการใช้ gunicorn คุณอาจมี app/gunicorn_conf.py ด้วย:
# Gunicorn config variables
loglevel = "info"
errorlog = "-" # stderr
accesslog = "-" # stdout
worker_tmp_dir = "/dev/shm"
graceful_timeout = 120
timeout = 120
keepalive = 5
threads = 3 แล้วคุณอาจมี Dockerfile ด้วย:
FROM python:3.9
WORKDIR /code
COPY ./requirements.txt /code/requirements.txt
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
COPY ./app /code/app
CMD [ "gunicorn" , "--conf" , "app/gunicorn_conf.py" , "--bind" , "0.0.0.0:80" , "app.main:app" ]คุณสามารถอ่านเพิ่มเติมเกี่ยวกับแนวคิดเหล่านี้ในเอกสาร Fastapi เกี่ยวกับ: fastapi ในคอนเทนเนอร์ - Docker เป็นแนวคิดเดียวกันจะนำไปใช้กับเว็บแอปพลิเคชันอื่น ๆ ในคอนเทนเนอร์
คุณอาจต้องการตัวจัดการกระบวนการที่ใช้กระบวนการทำงานหลายกระบวนการในคอนเทนเนอร์หากแอปพลิเคชันของคุณ ง่ายพอ ที่คุณไม่ต้องการ (อย่างน้อยก็ยังไม่ได้) เพื่อปรับจำนวนกระบวนการมากเกินไปและคุณสามารถใช้ค่าเริ่มต้นอัตโนมัติและคุณกำลังทำงานบน เซิร์ฟเวอร์เดียว ไม่ใช่คลัสเตอร์
คุณสามารถปรับใช้กับ เซิร์ฟเวอร์เดียว (ไม่ใช่คลัสเตอร์) ด้วย การเขียน Docker ดังนั้นคุณจะไม่มีวิธีที่ง่ายในการจัดการการจำลองแบบของคอนเทนเนอร์ (พร้อม Docker Compose) ในขณะที่รักษาเครือข่ายที่ ใช้ ร่วมกัน
จากนั้นคุณอาจต้องการมี คอนเทนเนอร์เดียว ที่มี ตัวจัดการกระบวนการ เริ่มต้น กระบวนการของคนงานหลายอย่าง ภายในเช่นเดียวกับภาพนักเทียบท่านี้
คุณอาจมี เหตุผลอื่น ๆ ที่จะทำให้ง่ายขึ้นที่จะมี คอนเทนเนอร์เดียว ที่มี หลายกระบวนการ แทนที่จะมี คอนเทนเนอร์หลายตัว ที่มี กระบวนการเดียว ในแต่ละอัน
ตัวอย่างเช่น (ขึ้นอยู่กับการตั้งค่าของคุณ) คุณอาจมีเครื่องมือบางอย่างเช่นผู้ส่งออก Prometheus ในคอนเทนเนอร์เดียวกันกับที่ควรเข้าถึง คำขอแต่ละคำขอ ที่มา
ในกรณีนี้หากคุณมี คอนเทนเนอร์หลายตัว โดยค่าเริ่มต้นเมื่อ Prometheus มา อ่านตัวชี้วัด มันจะได้รับ คอนเทนเนอร์เดียวในแต่ละครั้ง (สำหรับคอนเทนเนอร์ที่จัดการคำขอนั้น) แทนที่จะได้รับ การวัดสะสม สำหรับภาชนะที่จำลองทั้งหมด
จากนั้นในกรณีนั้นอาจง่ายกว่าที่จะมี คอนเทนเนอร์หนึ่งอัน ที่มี หลายกระบวนการ และเครื่องมือท้องถิ่น (เช่นผู้ส่งออกโพร) ในคอนเทนเนอร์เดียวกันที่รวบรวมตัวชี้วัดโพรโพรสำหรับกระบวนการภายในทั้งหมดและเปิดเผยตัวชี้วัดเหล่านั้นในภาชนะเดียวนั้น
อ่านเพิ่มเติมเกี่ยวกับมันทั้งหมดในเอกสาร Fastapi เกี่ยวกับ: fastapi ในคอนเทนเนอร์ - Docker เป็นแนวคิดเดียวกันนี้ใช้กับเว็บแอปพลิเคชันอื่น ๆ ในคอนเทนเนอร์
คุณไม่ต้องโคลน repo นี้
คุณสามารถใช้ภาพนี้เป็นภาพพื้นฐานสำหรับภาพอื่น ๆ
สมมติว่าคุณมี requirements.txt ไฟล์ txt คุณอาจมี Dockerfile เช่นนี้:
FROM tiangolo/meinheld-gunicorn-flask:python3.9
COPY ./requirements.txt /app/requirements.txt
RUN pip install --no-cache-dir --upgrade -r /app/requirements.txt
COPY ./app /app คาดว่าจะมีไฟล์ที่ /app/app/main.py
หรือมิฉะนั้นไฟล์ at /app/main.py
และคาดว่าจะมี app ตัวแปรด้วยแอปพลิเคชัน "WSGI" ของคุณ
จากนั้นคุณสามารถสร้างภาพของคุณจากไดเรกทอรีที่มี Dockerfile ของคุณเช่น:
docker build -t myimage ./นี่คือตัวแปรสภาพแวดล้อมที่คุณสามารถตั้งค่าในคอนเทนเนอร์เพื่อกำหนดค่าและค่าเริ่มต้นของพวกเขา:
MODULE_NAMEPython "โมดูล" (ไฟล์) ที่จะนำเข้าโดย Gunicorn โมดูลนี้จะมีแอปพลิเคชันขวดจริงในตัวแปร
โดยค่าเริ่มต้น:
app.main หากมีไฟล์ /app/app/main.py หรือmain หากมีไฟล์ /app/main.py ตัวอย่างเช่นหากไฟล์หลักของคุณอยู่ที่ /app/custom_app/custom_main.py คุณสามารถตั้งค่าได้เช่น:
docker run -d -p 80:80 -e MODULE_NAME= " custom_app.custom_main " myimageVARIABLE_NAMEตัวแปรภายในโมดูล Python ที่มีแอปพลิเคชันขวด
โดยค่าเริ่มต้น:
appตัวอย่างเช่นหากไฟล์ Python หลักของคุณมีบางอย่างเช่น:
from flask import Flask
api = Flask ( __name__ )
@ api . route ( "/" )
def hello ():
return "Hello World from Flask" ในกรณีนี้ api จะเป็นตัวแปรด้วย "แอปพลิเคชันขวด" คุณสามารถตั้งค่าได้เช่น:
docker run -d -p 80:80 -e VARIABLE_NAME= " api " myimageAPP_MODULEสตริงที่มีโมดูล Python และชื่อตัวแปรส่งผ่านไปยัง Gunicorn
โดยค่าเริ่มต้นตั้งค่าตามตัวแปร MODULE_NAME และ VARIABLE_NAME :
app.main:app หรือmain:appคุณสามารถตั้งค่าได้เช่น:
docker run -d -p 80:80 -e APP_MODULE= " custom_app.custom_main:api " myimageGUNICORN_CONFพา ธ ไปยังไฟล์กำหนดค่า Gunicorn Python
โดยค่าเริ่มต้น:
/app/gunicorn_conf.py ถ้ามีอยู่/app/app/gunicorn_conf.py ถ้ามีอยู่/gunicorn_conf.py (ค่าเริ่มต้นที่รวมอยู่)คุณสามารถตั้งค่าได้เช่น:
docker run -d -p 80:80 -e GUNICORN_CONF= " /app/custom_gunicorn_conf.py " myimageWORKERS_PER_COREภาพนี้จะตรวจสอบจำนวนคอร์ CPU ที่มีอยู่ในเซิร์ฟเวอร์ปัจจุบันที่ใช้งานคอนเทนเนอร์ของคุณ
มันจะกำหนดจำนวนคนงานเป็นจำนวนคอร์ CPU คูณด้วยค่านี้
โดยค่าเริ่มต้น:
2คุณสามารถตั้งค่าได้เช่น:
docker run -d -p 80:80 -e WORKERS_PER_CORE= " 3 " myimage หากคุณใช้ค่า 3 ในเซิร์ฟเวอร์ที่มี 2 CPU Cores มันจะเรียกใช้ 6 กระบวนการของคนงาน
คุณสามารถใช้ค่าจุดลอยตัวได้เช่นกัน
ตัวอย่างเช่นหากคุณมีเซิร์ฟเวอร์ขนาดใหญ่ (สมมติว่ามี 8 คอร์ซีพียู) ที่ใช้งานหลายแอปพลิเคชันและคุณมีแอปพลิเคชัน ASGI ที่คุณรู้ว่าไม่จำเป็นต้องมีประสิทธิภาพสูง และคุณไม่ต้องการเสียทรัพยากรเซิร์ฟเวอร์ คุณสามารถใช้งานได้ 0.5 คนต่อ CPU Core ตัวอย่างเช่น:
docker run -d -p 80:80 -e WORKERS_PER_CORE= " 0.5 " myimageในเซิร์ฟเวอร์ที่มี 8 คอร์ CPU ซึ่งจะทำให้เริ่มต้นกระบวนการของคนงานเพียง 4 กระบวนการเท่านั้น
WEB_CONCURRENCYแทนที่คำจำกัดความอัตโนมัติของจำนวนคนงาน
โดยค่าเริ่มต้น:
WORKERS_PER_CORE ดังนั้นในเซิร์ฟเวอร์ที่มี 2 คอร์โดยค่าเริ่มต้นจะถูกตั้งค่าเป็น 4คุณสามารถตั้งค่าได้เช่น:
docker run -d -p 80:80 -e WEB_CONCURRENCY= " 2 " myimageสิ่งนี้จะทำให้ภาพเริ่มต้น 2 กระบวนการทำงานโดยไม่ขึ้นกับจำนวนคอร์ CPU ที่มีอยู่ในเซิร์ฟเวอร์
HOST"โฮสต์" ที่ใช้โดย Gunicorn, IP ที่ Gunicorn จะฟังคำขอ
มันเป็นโฮสต์ภายในคอนเทนเนอร์
ตัวอย่างเช่นหากคุณตั้งค่าตัวแปรนี้เป็น 127.0.0.1 มันจะสามารถใช้ได้ภายในคอนเทนเนอร์เท่านั้นไม่ใช่ในโฮสต์ที่ทำงาน
มันมีไว้เพื่อความสมบูรณ์ แต่คุณอาจไม่ควรเปลี่ยนแปลง
โดยค่าเริ่มต้น:
0.0.0.0PORTพอร์ตคอนเทนเนอร์ควรฟัง
หากคุณใช้งานคอนเทนเนอร์ในสภาพแวดล้อมที่ จำกัด ซึ่งบังคับให้คุณใช้พอร์ตเฉพาะ (เช่น 8080 ) คุณสามารถตั้งค่าด้วยตัวแปรนี้
โดยค่าเริ่มต้น:
80คุณสามารถตั้งค่าได้เช่น:
docker run -d -p 80:8080 -e PORT= " 8080 " myimageBINDโฮสต์ที่แท้จริงและพอร์ตผ่านไปยัง Gunicorn
โดยค่าเริ่มต้นตั้งค่าตาม HOST และ PORT
ดังนั้นหากคุณไม่ได้เปลี่ยนแปลงอะไรเลยมันจะถูกตั้งค่าตามค่าเริ่มต้นเป็น:
0.0.0.0:80คุณสามารถตั้งค่าได้เช่น:
docker run -d -p 80:8080 -e BIND= " 0.0.0.0:8080 " myimageLOG_LEVELระดับบันทึกสำหรับ Gunicorn
หนึ่งใน:
debuginfowarningerrorcritical โดยค่าเริ่มต้นตั้งค่าเป็น info
หากคุณต้องการบีบการเสียสละประสิทธิภาพให้มากขึ้นให้ตั้งค่าเป็น warning ตัวอย่างเช่น:
คุณสามารถตั้งค่าได้เช่น:
docker run -d -p 80:8080 -e LOG_LEVEL= " warning " myimage บันทึกจะถูกส่งไปยัง stderr และ stdout ของคอนเทนเนอร์ซึ่งหมายความว่าคุณสามารถดูบันทึกด้วย docker logs -f your_container_name_here
ภาพรวมไฟล์กำหนดค่า Gunicorn Python เริ่มต้นที่ /gunicorn_conf.py
มันใช้ตัวแปรสภาพแวดล้อมที่ประกาศไว้ข้างต้นเพื่อตั้งค่าการกำหนดค่าทั้งหมด
คุณสามารถแทนที่ด้วยไฟล์ใน:
/app/gunicorn_conf.py/app/app/gunicorn_conf.py/gunicorn_conf.py/app/prestart.sh หากคุณต้องการเรียกใช้อะไรก่อนเริ่มแอปคุณสามารถเพิ่มไฟล์ prestart.sh ในไดเรกทอรี /app ภาพจะตรวจจับและเรียกใช้โดยอัตโนมัติก่อนเริ่มทุกอย่าง
ตัวอย่างเช่นหากคุณต้องการเพิ่ม Alembic SQL Migrations (ด้วย sqlalchemy) คุณสามารถสร้างไฟล์ ./app/prestart.sh ในไดเรกทอรีรหัสของคุณ (ซึ่งจะถูกคัดลอกโดย Dockerfile ของคุณ) ด้วย:
#! /usr/bin/env bash
# Let the DB start
sleep 10 ;
# Run migrations
alembic upgrade head และมันจะรอ 10 วินาทีเพื่อให้ฐานข้อมูลเริ่มต้นแล้วเรียกใช้คำสั่ง alembic นั้น
หากคุณต้องการเรียกใช้สคริปต์ Python ก่อนที่จะเริ่มแอปคุณสามารถสร้างไฟล์ /app/prestart.sh เรียกใช้สคริปต์ Python ของคุณด้วย:
#! /usr/bin/env bash
# Run custom Python script before starting
python /app/my_custom_prestart_script.py กล่าวโดยย่อ: คุณอาจไม่ควรใช้อัลไพน์สำหรับโครงการ Python แทนที่จะใช้เวอร์ชันอิมเมจ Docker slim
คุณต้องการรายละเอียดเพิ่มเติมหรือไม่? อ่านต่อ?
อัลไพน์มีประโยชน์มากกว่าสำหรับภาษาอื่น ๆ ที่คุณสร้างไบนารีแบบคงที่ในเวทีภาพนักเทียบท่าหนึ่ง (ใช้การสร้างท่าเทียบเรือหลายขั้นตอน) จากนั้นคัดลอกไปยังภาพอัลไพน์ที่เรียบง่ายแล้วดำเนินการไบนารีนั้น ตัวอย่างเช่นการใช้ไป
แต่สำหรับ Python เนื่องจากอัลไพน์ไม่ได้ใช้เครื่องมือมาตรฐานที่ใช้ในการสร้างส่วนขยาย Python เมื่อติดตั้งแพ็คเกจในหลายกรณี Python ( pip ) จะไม่พบแพ็คเกจที่ติดตั้งได้แบบ preompiled ("ล้อ") สำหรับอัลไพน์ และหลังจากการดีบักข้อผิดพลาดแปลก ๆ มากมายคุณจะรู้ว่าคุณต้องติดตั้งเครื่องมือพิเศษจำนวนมากและสร้างการพึ่งพาจำนวนมากเพื่อใช้แพ็คเกจ Python ทั่วไปเหล่านี้ -
ซึ่งหมายความว่าแม้ว่าภาพอัลไพน์ดั้งเดิมอาจมีขนาดเล็ก แต่คุณก็จบลงด้วยภาพที่มีขนาดเทียบได้กับขนาดที่คุณจะได้รับหากคุณเพิ่งใช้ภาพงูหลามมาตรฐาน (อิงตาม Debian) หรือในบางกรณี -
และในทุกกรณีมันจะใช้เวลานานกว่าในการสร้างใช้ทรัพยากรมากขึ้นการสร้างการพึ่งพานานขึ้นและยังเพิ่มการปล่อยก๊าซคาร์บอนไดออกไซด์ในขณะที่คุณใช้เวลาและพลังงานของซีพียูมากขึ้นสำหรับการสร้างแต่ละครั้ง -
หากคุณต้องการรูปภาพ Python ที่เพรียวบางคุณควรลองและใช้เวอร์ชัน slim ที่ยังคงใช้ Debian แต่มีขนาดเล็กลง -
แท็กรูปภาพทั้งหมดการกำหนดค่าตัวแปรสภาพแวดล้อมและตัวเลือกแอปพลิเคชันได้รับการทดสอบ
issue-manager.yml PR #154 โดย @tiangololatest-changes ของ GitHub PR #153 โดย @tiangololatest-changes.yml PR #141 โดย @alejsdevREADME.md PR #137 โดย @alejsdev ไฮไลท์ของรุ่นนี้:
สนับสนุน Python 3.9 และ 3.8
การคัดค้าน Python 3.6 และ 2.7
python3.6-2022-11-25 และ python2.7-2022-11-25รุ่นอัพเกรดของการพึ่งพาทั้งหมด
การปรับปรุงและแก้ไขเล็กน้อย
เพิ่มการสนับสนุนสำหรับ Python 3.9 และ Python 3.9 Alpine PR #50 โดย @tiangolo
เพิ่ม Python 3.8 ด้วยอัลไพน์ 3.11 PR #28
เพิ่มการสนับสนุนสำหรับ Python 3.8 PR #27.
tiangolo/meinheld-gunicorn-flask:python3.7-2019-10-15 PR #17.เพิ่มการสนับสนุนสำหรับ Python 2.7 (คุณควรใช้ Python 3.7 หรือ Python 3.6) PR #11.
อัปเดตการกำหนดค่า Travis CI PR #10 โดย @CCLAUSS
/app/prestart.sh โครงการนี้ได้รับใบอนุญาตภายใต้ข้อกำหนดของใบอนุญาต MIT