ฉันใช้คอนเทนเนอร์นักเทียบท่าเพื่อโฮสต์เว็บแอป ฉันมีสามคอนเทนเนอร์หลัก: MySQL, flask และ Nginx สองอันแรกทำงานตามที่คาดไว้และอันหลังดูเหมือนจะทำงานได้ดีเนื่องจากไม่มีข้อผิดพลาดปรากฏขึ้นในการเริ่มต้นใช้งาน docker-compose
เอาต์พุตการเริ่มต้นคอนเทนเนอร์ Nginx:
nginx | /docker-entrypoint.sh: /docker-entrypoint.d/ ไม่ว่างเปล่า จะพยายามดำเนินการกำหนดค่า
nginx | /docker-entrypoint.sh: ค้นหาเชลล์สคริปต์ใน /docker-entrypoint.d/
nginx | /docker-entrypoint.sh: เปิดตัว /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
nginx | 10-listen-on-ipv6-by-default.sh: info: /etc/nginx/conf.d/default.conf ไม่ใช่ไฟล์หรือไม่มีอยู่
nginx | /docker-entrypoint.sh: เปิดตัว /docker-entrypoint.d/20-envsubst-on-templates.sh
nginx | /docker-entrypoint.sh: เปิดตัว /docker-entrypoint.d/30-tune-worker-processes.sh
nginx | /docker-entrypoint.sh: การกำหนดค่าเสร็จสมบูรณ์; พร้อมสำหรับการเริ่มต้น
nginx | 2022/04/07 13:09:13 [ประกาศ] 1#1: ใช้วิธีเหตุการณ์ "epoll"
nginx | 2022/04/07 13:09:13 [ประกาศ] 1#1: nginx/1.21.6
nginx | 2022/04/07 13:09:13 [ประกาศ] 1#1: สร้างโดย gcc 10.2.1 20210110 (Debian 10.2.1-6)
nginx | 2022/04/07 13:09:13 [ประกาศ] 1#1: OS: Linux 4.19.130-boot2docker
nginx | 2022/04/07 13:09:13 [ประกาศ] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
nginx | 2022/04/07 13:09:13 [ประกาศ] 1#1: เริ่มกระบวนการของผู้ปฏิบัติงาน
nginx | 2022/04/07 13:09:13 [ประกาศ] 1#1: เริ่มกระบวนการของผู้ปฏิบัติงาน 21
ไฟล์นักเทียบท่า Nginx
# Dockerfile-nginx
จาก nginx: ล่าสุด
# Nginx จะฟังพอร์ตนี้
# เปิดเผย 80
# ลบไฟล์กำหนดค่าเริ่มต้นที่
# /etc/nginx/nginx.conf รวมถึง
RUN rm /etc/nginx/conf.d/default.conf
# เราคัดลอกไฟล์ข้อกำหนดเพื่อติดตั้ง
# การพึ่งพา Python
สำเนา nginx.conf /etc/nginx/conf.d/
คอนเทนเนอร์หลังจากปรับใช้และพอร์ตที่เกี่ยวข้อง:
รหัสคอนเทนเนอร์ IMAGE คำสั่งสร้างสถานะชื่อพอร์ต
bffffcfe2f70 sc_server_nginx "/docker-entrypoint.â¦" 14 วินาทีที่แล้ว อัพ 13 วินาที 0.0.0.0:80->80/tcp nginx
a73d958c1407 sc_server_flask "uwsgi app.ini" 9 ชั่วโมงที่แล้ว สูงสุด 9 ชั่วโมง 8080/tcp flask
d273db5f80ef mysql:5.7 "docker-entrypoint.sâ¦" 21 ชั่วโมงที่แล้ว ขึ้น 9 ชั่วโมง (ปกติ) 0.0.0.0:3306->3306/tcp, 33060/tcp mysql
ฉันยังใหม่กับเซิร์ฟเวอร์ Nginx ดังนั้นฉันเดาว่ามันอาจเป็นข้อผิดพลาดของมือใหม่ ฉันกำลังพยายามเปลี่ยนเส้นทางการรับส่งข้อมูลทั้งหมดจากพอร์ต 80 ของเครื่องโฮสต์ไปยัง 80 ของนักเทียบท่า ซึ่งเปลี่ยนเส้นทางการรับส่งข้อมูลไปยังคอนเทนเนอร์ WSGI ผ่านซ็อกเก็ต
ฉันใช้การกำหนดค่า Nginx ต่อไปนี้ (ไม่มีอะไรใกล้เคียงกับแฟนซี):
เซิร์ฟเวอร์ {
ฟัง 80;
ที่ตั้ง / {
รวม uwsgi_params;
uwsgi_pass กระติกน้ำ:8080;
}
}
อย่างที่คุณเห็นเซิร์ฟเวอร์รับฟังที่พอร์ต 80 และเปลี่ยนเส้นทางการรับส่งข้อมูลทั้งหมดผ่านซ็อกเก็ต uwsgi_pass กระติกน้ำ:8080;
ไปยังคอนเทนเนอร์ WSGI ที่โฮสต์แอป
อย่างไรก็ตาม เมื่อใดก็ตามที่ฉันพิมพ์ 127.0.0.1:80 หรือ 0.0.0.0:80 ในเบราว์เซอร์ การเชื่อมต่อจะถูกปฏิเสธ ฉันไม่ได้ติดตั้งไฟร์วอลล์ ดังนั้นฉันเดาว่าไม่มีปัญหากับพอร์ต 80 ที่หยุดทำงาน
นี่คือไฟล์การกำหนดค่า app.ini ของฉัน ซึ่งมีการระบุพารามิเตอร์เริ่มต้นและการปรับใช้:
[uwsgi]
ไฟล์ wsgi = wsgi.py
; นี่คือชื่อของตัวแปร
; ในสคริปต์ของเราที่จะถูกเรียก
โทรได้ = แอพ
; เราใช้พอร์ต 8080 ซึ่งเราจะ
; จากนั้นเปิดเผยบน Dockerfile ของเรา
ซ็อกเก็ต = :8080
; ตั้งค่า uWSGI เพื่อเริ่มต้น 4 คนงาน
กระบวนการ = 4
เธรด = 2
มาสเตอร์ = จริง
chmod-socket = 660
สุญญากาศ = จริง
ตายตามกำหนด = จริง
นอกจากนี้ ฉันยังรวม docker-compose.yml (ฉันเดาว่ามันอาจมีประโยชน์):
นักเทียบท่า-compose.yml
บริการ:
กระติกน้ำ:
สร้าง: ./ขวด
container_name: กระติกน้ำ
รีสตาร์ท: เสมอ
สิ่งแวดล้อม:
- APP_NAME=MyFlaskApp
- YOURAPPLICATION_SETTINGS=docker_config.py
เปิดเผย:
- 8080
ขึ้นอยู่กับ:
มายเอสคิวแอล:
เงื่อนไข: service_healthy
มายเอสคิวแอล:
รูป: mysql:5.7
ชื่อคอนเทนเนอร์: mysql
พอร์ต:
- "3306:3306"
สิ่งแวดล้อม:
MYSQL_ROOT_PASSWORD:
MYSQL_DATABASE:
MYSQL_USER:
MYSQL_PASSWORD:
ปริมาณ:
- ./db/init.sql:/data/application/init.sql
ตรวจสุขภาพ:
ทดสอบ: mysql -u -p --database -e "แสดงตาราง"
ช่วงเวลา: 3 วินาที
ลองใหม่: 5
start_period: 30 วินาที
จิงซ์:
สร้าง: ./nginx
ชื่อคอนเทนเนอร์: nginx
รีสตาร์ท: เสมอ
ขึ้นอยู่กับ:
- มายเอสคิวแอล
- กระติกน้ำ
พอร์ต:
- "80:80"
ใครก็ได้ช่วยที
อัปเดต
ฉันใช้ Wireshark เพื่อสแกนอินเทอร์เฟซย้อนกลับเพื่อดูการตอบสนองของเซิร์ฟเวอร์ที่ 0.0.0.0:80 (ฉันสงสัยว่าอาจมีปัญหากับพอร์ต 80) และฉันได้รับเพย์โหลดต่อไปนี้: