- Traefik ทำหน้าที่เป็นรีเวิร์สพร็อกซีแบบไดนามิกและจัดการใบรับรอง TLS ในขณะที่ Portainer มีอินเทอร์เฟซแบบกราฟิกสำหรับการจัดการ Docker และ Swarm
- การรวมไฟล์ traefik.yml, dynamic.yml และ docker-compose.yml เข้าด้วยกันจะช่วยให้คุณสามารถกำหนดจุดเริ่มต้น (entrypoints), มิดเดิลแวร์ด้านความปลอดภัย และการกำหนดเส้นทาง HTTP/HTTPS ตามป้ายกำกับได้
- ในกรณีการใช้งาน Docker แบบสแตนด์อโลนหรือ Swarm เพียงแค่เพิ่มบริการต่างๆ เข้าไปในเครือข่ายพร็อกซีและติดแท็กให้ Traefik สามารถค้นหาและเปิดเผยบริการเหล่านั้นได้อย่างปลอดภัย
- การใช้ Let's Encrypt, เครือข่ายเฉพาะ และการตรวจสอบสิทธิ์แบบพื้นฐานบนแดชบอร์ด ช่วยสร้างสภาพแวดล้อมที่แข็งแกร่งสำหรับการใช้งานแอปพลิเคชันหลายตัวบนเซิร์ฟเวอร์เดียว
การติดตั้งระบบที่ทันสมัยด้วยDocker, Traefik และ Portainerในปัจจุบันเป็นหนึ่งในวิธีที่ง่ายที่สุดในการจัดการคอนเทนเนอร์บนเซิร์ฟเวอร์เดียวและให้บริการหลายอย่างผ่าน HTTPS โดยไม่ต้องยุ่งยากกับการตั้งค่า ข้อดีคือ Traefik ทำหน้าที่เป็นพร็อกซีแบบย้อนกลับแบบไดนามิก ในขณะที่ Portainer มีเว็บอินเทอร์เฟซที่ใช้งานง่ายมากสำหรับการจัดการ Docker และหากต้องการก็สามารถจัดการ Swarm ได้เช่นกัน
ในบทความนี้คุณจะเห็นว่า ติดตั้ง Traefik เป็น reverse proxy ไว้ด้านหน้า Portainer ทั้งในสถานการณ์ Docker แบบ "คลาสสิก" (แบบสแตนด์อโลน) และคลัสเตอร์ Docker Swarm จะรวม TLS (แบบลงนามเองหรือ Let's Encrypt) อย่างไร และไฟล์การกำหนดค่าใดบ้างที่มีบทบาทสำคัญ (traefik.yml, dynamic.yml y docker-compose.yml) และเทคนิคทั่วไปบางอย่างเกี่ยวกับมิดเดิลแวร์ เครือข่าย และปัญหาการติดแท็กทั่วไปใน Traefik
Docker, Traefik และ Portainer มีบทบาทอย่างไรในสถาปัตยกรรมนี้?
ในการตั้งค่าแบบนี้Dockerเป็นเลเยอร์พื้นฐานที่คอนเทนเนอร์ทำงานTraefik ทำหน้าที่เป็นพร็อกซีแบบย้อนกลับและตัวกระจายโหลดที่รับคำขอ HTTP/HTTPS ทั้งหมดบนพอร์ต 80 และ 443 แล้วส่งไปยังคอนเทนเนอร์ที่เหมาะสม และPortainer ให้ส่วนติดต่อผู้ใช้แบบกราฟิกสำหรับการจัดการอิมเมจ คอนเทนเนอร์ วอลุ่ม เครือข่าย และสแต็ก Docker หรือ Swarm
แนวคิดคือการมีโฮสต์เดียวที่ใช้ Docker โดยที่ Traefik ตั้งอยู่ที่ "ประตูทางเข้า": ฟังที่จุดเริ่มต้น web (80) y websecure (443) แก้ไขใบรับรอง TLS (โดยปกติใช้ Let's Encrypt) และด้วยการผสานรวมกับผู้ให้บริการ Docker จะค้นพบบริการที่คุณเปิดเผยโดยอัตโนมัติโดยการเพิ่มป้ายกำกับให้กับคอนเทนเนอร์
ในทางกลับกัน Portainer ทำงานเหมือนคอนเทนเนอร์ทั่วไป แต่ถูกเปิดเผยผ่านช่องทางต่างๆ ตัวอย่างเช่น โดเมนย่อยเฉพาะ portainer.tudominio.comได้รับการปกป้องด้วย TLS และหากต้องการ สามารถใช้ตัวกลางการตรวจสอบสิทธิ์เพิ่มเติม นอกเหนือจากการเข้าสู่ระบบของ Portainer เองได้ ทั้งหมดนี้ได้รับการจัดการอย่างเป็นระบบด้วย นักเทียบท่า-เขียน ซึ่งเป็นตัวกำหนด Traefik, Portainer และเครือข่ายทั่วไปของประเภท proxy.
ข้อดีที่เห็นได้ชัดของวิธีการนี้คือ คุณสามารถปรับใช้บริการใหม่ได้ง่ายๆ เพียงแค่เพิ่มป้ายกำกับให้กับคอนเทนเนอร์ของคุณ: Traefik ตรวจจับการเปลี่ยนแปลงใน Docker สร้างเราเตอร์ บริการ และมิดเดิลแวร์แบบเรียลไทม์ และในเวลาเพียงไม่กี่วินาที คุณก็จะมีโดเมนย่อยหรือเส้นทางใหม่ที่ใช้งานได้โดยไม่ต้องแก้ไขไฟล์การกำหนดค่าแบบคงที่ด้วยตนเอง
การตั้งค่า Traefik แบบคงที่: traefik.yml
โดยปกติแล้ว การตั้งค่าแบบคงที่ของ Traefik จะถูกจัดเก็บไว้ในไฟล์ลักษณะนี้ traefik.ymlซึ่งติดตั้งอยู่ภายในคอนเทนเนอร์ นี่คือคำจำกัดความของมัน แดชบอร์ด จุดเริ่มต้น ผู้ให้บริการ และตัวแก้ไขใบรับรอง รวมถึง Let's Encrypt และอื่นๆ อีกมากมาย
การตั้งค่า YAML ทั่วไปเริ่มต้นด้วยการเปิดใช้งาน API และแผงควบคุมด้วยคำสั่งประมาณนี้ api: dashboard: trueส่วนนี้ช่วยให้เข้าถึงเว็บอินเทอร์เฟซได้ ซึ่งคุณสามารถดูเราเตอร์ บริการ และมิดเดิลแวร์ได้ แผงควบคุมนี้ไม่ได้ตรวจสอบสิทธิ์โดยค่าเริ่มต้น ดังนั้นเราจะมาดูวิธีการรักษาความปลอดภัยด้วยการตรวจสอบสิทธิ์พื้นฐานจากการกำหนดค่าแบบไดนามิกในภายหลัง
ถัดไปคือการกำหนดจุดเริ่มต้น โดยปกติจะมี จุดเริ่มต้น web ที่ท่าเรือ 80 และอีก websecure ใน 443. ที่ web โดยปกติแล้ว การเปลี่ยนเส้นทางอัตโนมัติจะถูกตั้งค่าไว้ดังนี้ websecureเพื่อให้การเข้าถึง HTTP ใดๆ ถูกเปลี่ยนเส้นทางไปยัง HTTPS:
โครงร่างทั่วไปจะประกอบด้วยส่วนต่างๆ ดังนี้ http.redirections.entryPoint.to: websecure เพื่อบังคับให้เกิดการเปลี่ยนเส้นทางและรวมศูนย์การรับส่งข้อมูลที่เข้ารหัสทั้งหมดไว้ที่จุดเข้าใช้งานที่ปลอดภัย
ไปยัง websecure มีการระบุว่าควรใช้ TLS และมีลิงก์ให้ไว้ด้วย certResolver (ตัวอย่างเช่น letsencrypt) ซึ่งจะรับผิดชอบในการจัดการใบรับรองโดยอัตโนมัติ ทั้งหมดนี้ได้รับการสนับสนุนโดย ACMEซึ่งเป็นโปรโตคอลที่ Let's Encrypt ใช้ในการออกและต่ออายุใบรับรอง
ในบล็อก ผู้ให้บริการ ผู้ให้บริการ Docker ได้รับการกำหนดค่าแล้ว โดยชี้ไปยังซ็อกเก็ต unix:///var/run/docker.sockโดยมีตัวเลือกสำคัญหนึ่งอย่าง: exposedByDefault: falseด้วยเหตุนี้ Traefik จึงไม่ได้เผยแพร่คอนเทนเนอร์ทั้งหมดโดยค่าเริ่มต้น แต่จะเผยแพร่เฉพาะคอนเทนเนอร์ที่มีป้ายกำกับเท่านั้น traefik.enable=trueนอกจากนี้ คุณยังสามารถกำหนดค่าผู้ให้บริการไฟล์ได้ (file) เพื่อโหลดการกำหนดค่าแบบไดนามิกเพิ่มเติมจากตัวอย่างเช่น /configurations/dynamic.yml.
สุดท้ายนี้ ไฟล์คงที่มักจะมีส่วนดังกล่าวด้วย certificatesResolversโดยที่ตัวแก้ไข ACME ถูกกำหนดไว้: อีเมลลงทะเบียน, ไฟล์จัดเก็บ (โดยปกติ) acme.json), ประเภทคีย์ (ตัวอย่างเช่น EC384) และวิธีการตรวจสอบความถูกต้อง (ตัวอย่างเช่น) httpChallenge ที่จุดทางเข้า webสิ่งสำคัญคือ ตั้งค่าอีเมลจริง ในส่วนนี้ Let's Encrypt ใช้ข้อมูลนี้สำหรับการแจ้งเตือนและการต่ออายุ หากคุณใส่ค่าที่ไม่ถูกต้องหรือไม่สมบูรณ์ คุณอาจพบข้อผิดพลาดเมื่อเริ่มต้นคอนเทนเนอร์ Traefik
นอกเหนือจากการกำหนดค่า YAML นี้แล้ว ยังมีการใช้งานอื่นๆ ที่ใช้การกำหนดค่าแบบอื่นๆ อีกด้วย รูปแบบ TOML (traefik.toml)แต่หลักการก็เหมือนกัน คือ ใบรับรองตัวแก้ไขส่วน (ตัวอย่างเช่น) [certificatesResolvers.main.acme]) กำหนดความท้าทาย (เช่น dnsChallenge กับ provider = "route53") และเพิ่มตัวเลือก TLS เริ่มต้น เช่น forzar minVersion = "VersionTLS13" หรือกำหนดค่ารายการของ cipherSuites อนุญาต.
การกำหนดค่าแบบไดนามิก: มิดเดิลแวร์, TLS และความปลอดภัย
ส่วนที่เป็นไดนามิกของ Traefik มักจะอยู่ในไฟล์ลักษณะนี้ dynamic.ymlโหลดโดยผู้ให้บริการไฟล์ ที่นี่คุณกำหนดค่า มิดเดิลแวร์และตัวเลือก TLS ซึ่งสามารถแก้ไขได้โดยไม่ต้องรีสตาร์ทคอนเทนเนอร์ Traefik ซึ่งมีประโยชน์มากสำหรับการปรับแต่งความปลอดภัยได้ทันที
ตัวอย่างทั่วไปคือการสร้างมิดเดิลแวร์ส่วนหัว เป็นต้น secureHeadersซึ่งเพิ่มนโยบายที่เกี่ยวข้องกับ HSTS และการใช้งาน HTTPS ที่บังคับใช้ ในรูปแบบ YAML คุณอาจพบพารามิเตอร์ต่างๆ เช่น sslRedirect: true, forceSTSHeader: true, stsIncludeSubdomains: true, stsPreload: true และ stsSeconds สูง (ตัวอย่างเช่น หนึ่งปีในหน่วยวินาที) ซึ่งช่วยเสริมความปลอดภัยในการรับส่งข้อมูลจากฝั่งเบราว์เซอร์
มิดเดิลแวร์อีกประเภทหนึ่งที่ใช้กันทั่วไปคือ มิดเดิลแวร์สำหรับการตรวจสอบสิทธิ์ขั้นพื้นฐาน เป็นต้น user-auth ประเภท basicAuthโดยที่รายชื่อผู้ใช้จะถูกประกาศในรูปแบบ usuario:hashโดยปกติแล้วค่าแฮชจะถูกสร้างขึ้นด้วย htpasswd และถูกฝังอยู่ในไฟล์ มิดเดิลแวร์นี้มักเชื่อมโยงกับเราเตอร์แดชบอร์ด Traefik ดังนั้น นอกเหนือจากการเข้าถึงผ่าน HTTPS แล้ว ยังต้องใช้ชื่อผู้ใช้และรหัสผ่านด้วย
ภายในโครงสร้างไดนามิกเดียวกันนั้น มักจะพบเห็นบล็อกอยู่ด้วย tls.options ด้วยโปรไฟล์เริ่มต้น (default) โดยที่ระบุชุดเข้ารหัสที่รองรับและเวอร์ชัน TLS ขั้นต่ำไว้ ตัวอย่างเช่น VersionTLS12ในการใช้งานบางครั้ง จะมีการกำหนดตัวเลือกหลายอย่าง (ตัวอย่างเช่น โปรไฟล์ที่เรียกว่า) tls12 และอีก defaultเพื่อปรับระดับความปลอดภัยให้เหมาะสมกับบริการต่างๆ หากจำเป็น
ในสภาพแวดล้อมที่ต้องการใช้งาน TLS ยังทำงานภายในอีกด้วย ระหว่าง Traefik กับบริการแบ็กเอนด์ (เช่น Portainer) อาจเกิดปัญหาขึ้นได้ โดยที่บริการเหล่านั้นไม่มีใบรับรองที่ได้รับการรับรองจาก CA สาธารณะ นั่นคือเหตุผลที่ตัวเลือกนี้เข้ามามีบทบาท insecureSkipVerifyซึ่งกำหนดค่าไว้ภายใต้ providers.http.tls หรือในตัวเลือก TLS ที่เหมาะสม จะทำให้ Traefik สามารถข้ามการตรวจสอบความถูกต้องของใบรับรองจากฝั่งเซิร์ฟเวอร์ได้ ซึ่งมีประโยชน์สำหรับสภาพแวดล้อมในห้องปฏิบัติการหรือใบรับรองที่ลงนามเองภายในองค์กร แต่ควรใช้ด้วยความระมัดระวังเนื่องจากเป็นการลดความเข้มงวดในการตรวจสอบ
รายละเอียดเชิงปฏิบัติ: ไฟล์ dynamic.yml สามารถแก้ไขได้ทันทีTraefik จะโหลดการกำหนดค่าแบบไดนามิกใหม่โดยไม่ต้องรีสตาร์ท ดังนั้นคุณสามารถเพิ่มหรือลบมิดเดิลแวร์ เปลี่ยนส่วนหัวด้านความปลอดภัย หรือแก้ไขการตรวจสอบสิทธิ์พื้นฐานได้โดยไม่ส่งผลกระทบต่อความพร้อมใช้งานของพร็อกซี
docker-compose ร่วมกับ Traefik และ Portainer ในรูปแบบ Docker standalone
ในสถานการณ์การใช้งาน Docker แบบพื้นฐาน โดยไม่มี Swarm สิ่งที่ทำกันโดยทั่วไปมากที่สุดคือการเรียกใช้คำสั่ง `startup` Traefik และ Portainer ที่มีตัวเดียว docker-compose.yml ซึ่งกำหนดทั้งบริการและเครือข่ายแบบบริดจ์ที่ใช้ร่วมกัน เรียกว่า ตัวอย่างเช่น proxy.
บริการ เทรฟิค โดยปกติจะใช้ภาพอย่างเป็นทางการ ตัวอย่างเช่น traefik:latest หรือเวอร์ชันเฉพาะเช่น traefik:v3.4พอร์ตต่างๆ ได้รับการแมปแล้ว 80 และ 443 สำหรับทราฟฟิกเว็บ และในบางกรณี พอร์ต 8080 เพื่อเปิดเผยแผงควบคุมภายใน นอกจากนี้ยังมีการเพิ่มตัวเลือกดังกล่าว restart: unless-stopped และเสริมความปลอดภัยด้วย security_opt: - no-new-privileges:true เพื่อลดความเสี่ยงในการยกระดับสิทธิ์ภายในคอนเทนเนอร์
ในส่วนของวอลุ่ม Traefik จำเป็นต้องเมานต์ซ็อกเก็ต Docker แบบอ่านอย่างเดียว (/var/run/docker.sock:/var/run/docker.sock:ro) เพื่อค้นหาคอนเทนเนอร์ ไฟล์คงที่ traefik.yml และไดเร็กทอรีที่จะบันทึกการกำหนดค่าแบบไดนามิก (./traefik-data/configurations:/configurationsไฟล์ดังกล่าวได้รับการเมานต์แล้วเช่นกัน acme.jsonนี่คือตำแหน่งที่ Traefik จัดเก็บใบรับรองที่ออกโดย Let's Encrypt ไฟล์นี้จะถูกสร้างขึ้นบนโฮสต์และกำหนดสิทธิ์การเข้าถึงให้ 600 เพื่อให้เฉพาะผู้ใช้ที่เหมาะสมเท่านั้นที่สามารถอ่านและเขียนได้ หากคุณปล่อยสิทธิ์ไว้ที่ 644 โดยปกติแล้ว Traefik จะแสดงข้อผิดพลาด
เคล็ดลับสำคัญที่ทำให้ Traefik แสดงฝีมือได้อย่างน่าทึ่งคือ... ป้ายกำกับบริการคุณจะพบสิ่งต่างๆ เหล่านี้ รวมถึง: traefik.enable=true (เพื่อให้ผู้ให้บริการ Docker เปิดเผยบริการนี้) traefik.docker.network=proxy (ระบุว่า Traefik ควรใช้เครือข่ายใดในการสื่อสารกับคอนเทนเนอร์) และเราเตอร์เช่น traefik.http.routers.traefik-secureโดยมีป้ายกำกับที่กำหนดจุดเริ่มต้นของมัน (websecure) กฎของโฮสต์ (ตัวอย่างเช่น Host(`traefik.tudominio.com`)บริการที่เกี่ยวข้อง (api@internal) และมิดเดิลแวร์การตรวจสอบสิทธิ์ (user-auth@file).
บริการ พอร์เทนเนอร์ ในที่เดียวกัน docker-compose.yml โดยทั่วไปใช้ portainer/portainer-ce:latest (หรือรุ่น Enterprise หากคุณมีใบอนุญาต) มีการเมานต์วอลุ่มที่คล้ายกัน ได้แก่ ซ็อกเก็ต Docker และโฟลเดอร์ข้อมูล (./portainer-data:/data) และบ่อยครั้งก็รวมถึง /etc/localtime เพื่อให้รับเอาเขตเวลาของโฮสต์มาใช้
ฉลากของ Portainer ลงทะเบียนกับ Traefik แล้ว: traefik.enable=true, traefik.docker.network=proxyเราเตอร์ประเภท traefik.http.routers.portainer-secure ด้วยจุดเริ่มต้น websecure และกฎโฮสต์เช่น Host(`portainer.tudominio.com`)นอกจากนี้ ยังมีการกำหนดบริการที่ Traefik ควรใช้ โดยชี้ไปยังพอร์ตภายในของ Portainer ตัวอย่างเช่น ด้วย traefik.http.services.portainer.loadbalancer.server.port=9000.
ในขณะที่ทุกอย่างกำลังดำเนินไป หลังจากการเปิดตัว docker compose up -d ในไดเร็กทอรี stack นั้น Traefik จะดาวน์โหลดอิมเมจและสร้างเครือข่ายขึ้นมา proxy หากมีการประกาศให้เป็นแบบภายนอกและแสดงแผงควบคุมทั้งสองในโดเมนย่อยที่กำหนดค่าไว้ พร้อมด้วย การเข้ารหัส HTTPS อัตโนมัติด้วย Let's Encryptจากนั้นเป็นต้นไป การเพิ่มบริการใหม่ก็เป็นเรื่องง่าย เพียงแค่คัดลอกโปรเจกต์ของคุณ เพิ่มป้ายกำกับ Traefik สองสามรายการ และเชื่อมต่อเข้ากับเครือข่าย proxy.
สถานการณ์การใช้งาน Docker Swarm: Portainer และ Traefik ในคลัสเตอร์
เมื่อคุณเปิดใช้งานDocker Swarmสิ่งต่างๆ จะเปลี่ยนแปลงไปเล็กน้อย เนื่องจากบริการต่างๆ จะถูกปรับใช้ในรูปแบบของสแต็ก และเครือข่ายมักจะใช้รูปแบบโอเวอร์เลย์ อย่างไรก็ตาม ตรรกะพื้นฐานของ Traefik และ Portainer นั้นคล้ายคลึงกันมาก: Traefik ยังคงทำหน้าที่เป็นรีเวิร์สพร็อกซีและตัวค้นหาบริการแบบไดนามิก และ Portainer สามารถทำงานได้ทั้งในโหมดสแตนด์อโลนและ โหมด Portainer + เอเจนต์เพื่อจัดการโหนดระยะไกลภายในคลัสเตอร์
โดยทั่วไปแล้ว ในการติดตั้งใช้งาน Swarm นั้น สแต็กจะถูกสร้างขึ้นก่อนที่จะนำไปใช้งาน เครือข่ายโอเวอร์เลย์สองเครือข่าย ซึ่ง Traefik จะใช้ในการกำหนดเส้นทางการรับส่งข้อมูลระหว่างโหนดต่างๆ นอกจากนี้ ยังมีการสร้างวอลุ่มเพื่อเก็บรักษาข้อมูล Portainer (เป็นต้น) portainer_data) และถ้าคุณต้องการ ก็ขออีกอันสำหรับ acme.json หรือไดเร็กทอรีที่ Traefik จัดเก็บใบรับรองและไฟล์การกำหนดค่า
El docker-compose.yml (ซึ่งจะคลี่คลายต่อไปด้วย) docker stack deploy โดยใช้ตัวอย่างเช่น -c portainer.ymlโดยปกติจะกำหนดบริการไว้สองอย่าง: ตัวแทนพอร์เทนเนอร์ซึ่งทำงานในโหมดนี้ global บนโหนด Linux ทั้งหมด และบริการ Portainer หลัก (CE หรือ EE) ซึ่งโดยปกติจะคงอยู่ในโหมดจำลองข้อมูล โดยมีข้อจำกัดให้ทำงานเฉพาะบนตัวจัดการเท่านั้น
เอเจนต์ Portainer จะทำการเมานต์ซ็อกเก็ต Docker และไดเร็กทอรีวอลุ่ม (/var/lib/docker/volumes) เพื่อให้สามารถตรวจสอบทรัพยากรได้ โดยจะเชื่อมต่อกับเครือข่ายโอเวอร์เลย์ที่จะใช้ร่วมกับ Traefik เป็นต้น traefik_publicบริการ Portainer หลักสามารถกำหนดค่าให้สื่อสารกับเอเจนต์ผ่านทาง TCP ได้ (tcp://tasks.agent:9001) และในความเป็นจริง ในบางตัวอย่าง คำสั่งนั้นจะแสดงด้วย --tlsskipverify มีการระบุให้ข้ามการตรวจสอบ TLS หากจำเป็น
ไม่ว่าจะบนสแต็กเดียวกันหรือสแต็กอื่น Traefik จะเริ่มต้นทำงานโดยใช้ผู้ให้บริการ Docker ในโหมด Swarm (swarmMode = true ในรูปแบบ TOML หรือตัวเลือกที่เทียบเท่าในแฟล็ก) โดยสังเกตบริการที่ติดแท็ก การกำหนดค่าประกอบด้วย certificatesResolvers.main.acme สำหรับ Let's Encrypt ซึ่งเป็น dnsChallenge กับซัพพลายเออร์เช่น เส้นทาง 53 หากคุณต้องการตรวจสอบความถูกต้องของใบรับรองโดยใช้ DNS และกลุ่มของข้อมูล tls.options ตัวอย่างเช่น ในกรณีที่ถูกบังคับ minVersion = "VersionTLS13" สำหรับโปรไฟล์เริ่มต้นและมีการกำหนดรายการที่ชัดเจนของ cipherSuites สำหรับโปรไฟล์ TLS 1.2
ค่ายเพลงของ Portainer ที่ Swarm ยึดหลักปรัชญาเดียวกัน: traefik.enable=trueเราเตอร์เช่น traefik.http.routers.portainer กับ Host(`portainer.midominio.com`), traefik.http.routers.portainer.entrypoints=https (o websecure (ตามการตั้งชื่อ) และ traefik.http.routers.portainer.tls=true เพื่อเปิดใช้งาน TLS บนเราเตอร์นั้น นอกจากนี้ คุณยังสามารถระบุได้อีกด้วย เซอร์เทรโซลเวอร์ กับ traefik.http.routers.portainer.tls.certresolver=main และสคีมาแบ็กเอนด์หากบริการนั้นใช้ HTTPS ภายในกับ traefik.http.services.portainer.loadbalancer.server.scheme=https.
ในบันทึกการดีบักของ Traefik ใน Swarm คุณจะเห็นการกำหนดค่าที่สร้างขึ้น: เราเตอร์เช่น api y portainerบริการที่ค้นพบ (ตัวอย่างเช่น) portainer en http://10.0.1.12:9000 และบริการ traefik (ชี้ไปยังพอร์ต 8080 ของแดชบอร์ด) และหากมีปัญหาเกี่ยวกับป้ายกำกับที่กำหนดไว้ไม่ชัดเจน จะแสดงข้อความเช่น "ไม่สามารถกำหนดชื่อบริการสำหรับเราเตอร์ได้: มีบริการมากเกินไป"ซึ่งโดยปกติแล้วบ่งชี้ว่ามีข้อขัดแย้งหรือการซ้ำซ้อนของบริการที่เกี่ยวข้องกับเราเตอร์
ตัวอย่างแบบง่าย: การตรวจสอบ WHOA, เส้นทาง และ TLS กับ Traefik
ก่อนที่จะนำ Portainer เข้ามาเกี่ยวข้อง การลองใช้ Traefik กับแบ็กเอนด์ที่เรียบง่ายมาก ๆ ดังภาพ ถือว่าค่อนข้างเหมาะสมกว่า traefik/whoamiซึ่งจะส่งคืนข้อมูลเกี่ยวกับคำขอ ช่วยให้คุณตรวจสอบได้ว่า Traefik ได้รับการกำหนดค่าอย่างถูกต้องและกฎการกำหนดเส้นทางทำงานได้
Un docker-compose.yml ขั้นพื้นฐานอาจรวมถึงบริการ traefik ด้วยภาพ traefik:v3.4โดยทำการเมานต์ซ็อกเก็ต Docker และกำหนดแฟล็กการบูตดังนี้ --providers.docker=true, --providers.docker.exposedbydefault=false, --providers.docker.network=proxy และจุดเข้า --entryPoints.web.address=:80พอร์ต 80 และ 8080 จะถูกประกาศบนโฮสต์ และเครือข่ายจะถูกสร้างขึ้น proxy ซึ่งจะใช้คอนเทนเนอร์ด้วยเช่นกัน whoami.
บริการ whoami มันเริ่มต้นบนเครือข่ายเดียวกันและมีเครื่องหมายกำกับไว้ traefik.enable=trueจากนั้นจึงกำหนดเราเตอร์โดยใช้ป้ายกำกับ traefik.http.routers.whoami.rule=Host(`whoami.docker.localhost`) และมีการระบุว่าจุดเริ่มต้นของคุณคือ webหากคุณยื่นคำขอด้วย curl -H "Host: whoami.docker.localhost" http://localhost/คุณจะเห็นการตอบกลับที่มีชื่อโฮสต์ ที่อยู่ IP ส่วนหัว และอื่นๆ ซึ่งยืนยันว่า Traefik กำลังกำหนดเส้นทางได้อย่างถูกต้อง
จากนั้นก็ง่ายแล้วครับ/ค่ะ เพิ่มการกำหนดเส้นทางตามพาธตัวอย่างเช่น คุณสามารถสร้างบริการอื่นได้ whoami-api โดยใช้รูปภาพเดียวกัน บนเครือข่ายเดียวกัน และติดแท็กด้วยกฎประเภทดังกล่าว Host(`whoami.docker.localhost`) && PathPrefix(`/api`)ดังนั้น ราก / ไปที่ whoami ต้นฉบับและคำขอไปยัง /api จะให้บริการพวกเขา whoami-apiคุณสามารถตรวจสอบได้โดยการส่งคำขอไปยัง / แล้ว /api โดยมีโฮสต์เดียวกัน
เพื่อเปิดใช้งาน TLS ในสภาพแวดล้อมท้องถิ่นนี้ ทางเลือกหนึ่งคือการสร้างใบรับรองแบบลงนามด้วยตนเองสำหรับโดเมน *.docker.localhost กับ opensslคุณสร้างไดเร็กทอรี certs, คุณสร้าง local.key y local.crtจากนั้นคุณเพิ่มไฟล์แบบไดนามิก (ตัวอย่างเช่น) dynamic/tls.yml) ด้วยส่วนนั้น tls: และเส้นทาง certFile y keyFile ชี้ไปยังไฟล์เหล่านั้น
ถัดไป คุณจะต้องอัปเดตคำจำกัดความบริการ Traefik ใน docker-compose.yml เพื่อเชื่อมต่อโฟลเดอร์ ./certs และโฟลเดอร์ ./dynamic ภายในคอนเทนเนอร์ คุณจะเปิดใช้งาน API ที่ปลอดภัยด้วย --api.dashboard=trueคุณสร้างจุดเริ่มต้น websecure (--entryPoints.websecure.address=:443) และเปิดใช้งาน TLS ที่นั่นด้วย --entryPoints.websecure.http.tls=trueคุณยังติดป้ายกำกับเราเตอร์แดชบอร์ดและเราเตอร์ของ whoami เพื่อให้พวกเขาได้ใช้ websecure และมี tls=true.
เมื่อระบบพร้อมใช้งานแล้ว คุณจะสามารถเข้าถึงได้ https://whoami.docker.localhost/ และไปยังแผงควบคุม Traefik ด้วยใบรับรองที่ลงนามด้วยตนเอง โดยยอมรับคำเตือนด้านความปลอดภัยของเบราว์เซอร์ ประสบการณ์นี้คล้ายคลึงกับสิ่งที่คุณจะได้พบในภายหลังเมื่อใช้งาน Let's Encrypt ในสภาพแวดล้อมจริง แต่ไม่ต้องพึ่งพาเซิร์ฟเวอร์ DNS สาธารณะ
แนวทางปฏิบัติที่ดีที่สุด การติดตั้งใช้งานแอปพลิเคชัน และการแก้ไขปัญหาทั่วไป
รูปแบบหนึ่งที่ปรากฏซ้ำในตัวอย่างทั้งหมดเหล่านี้คือ Traefik ช่วยลดความซับซ้อนในการติดตั้งแอปพลิเคชันใหม่ได้อย่างมากเมื่อคุณมีโครงสร้างพื้นฐานครบแล้ว (Traefik + Portainer + เครือข่าย) proxy (รวมถึงใบรับรอง) การเพิ่มบริการใหม่โดยทั่วไปมักมีขั้นตอนดังนี้:
โคลนโปรเจ็กต์หรือคัดลอกของคุณ docker-compose.yml ไปยังเซิร์ฟเวอร์ ให้ชี้โดเมนย่อยไปยังที่อยู่ IP ของโฮสต์โดยใช้ บันทึก ก ใน DNS ของคุณ (ตัวอย่างเช่น) app.tudominio.com) จากนั้นเพิ่มป้ายกำกับคีย์ลงในบริการ: traefik.enable=true, traefik.docker.network=proxy และเราเตอร์ที่มีกฎโฮสต์สำหรับโดเมนย่อยนั้น โดยระบุจุดเข้าใช้งานที่ปลอดภัย websecure และ y บริการที่มีพอร์ตภายในที่ถูกต้อง.
ตัวอย่างเช่น บทช่วยสอนหลายๆ บทจะแสดงวิธีการติดตั้งแอปพลิเคชันขนาดเล็ก FastAPI แยกออกจากกัน: มีการเพิ่มป้ายกำกับสี่ป้าย เพื่อให้แน่ใจว่าได้เข้าร่วมเครือข่ายแล้ว proxy ในส่วน networks เดล docker-compose.ymlและหลังจากทำเสร็จแล้ว docker compose up -d แอปจะปรากฏบนแดชบอร์ด Traefik โดยอัตโนมัติพร้อมเปิดใช้งาน TLS การค้นหาอัตโนมัติของ Traefik หมายความว่าคุณไม่จำเป็นต้องปรับการตั้งค่าคงที่ใดๆ เลย
เพื่อให้ทุกอย่างดำเนินไปอย่างราบรื่น สิ่งสำคัญคือต้องใส่ใจในรายละเอียดเล็กน้อยบางประการ: ห้ามใช้รหัสระบุเราเตอร์เดียวกันซ้ำ ในแอปพลิเคชันต่างๆ ตรวจสอบให้แน่ใจว่ามีบริการเพียงหนึ่งเดียวที่เชื่อมโยงกับเราเตอร์แต่ละตัว (เพื่อหลีกเลี่ยงข้อผิดพลาด "มีบริการมากเกินไป") และใช้ชื่อเครือข่ายที่สอดคล้องกัน (ตัวอย่างเช่น proxy (บนทุกสแต็กที่คุณต้องการเปิดเผย) และหากคุณใช้ Let's Encrypt โปรดตรวจสอบให้แน่ใจว่า acme.json มีสิทธิ์การเข้าถึงระดับ 600 และอีเมลที่ตั้งค่าไว้ก็ถูกต้อง
ในสภาพแวดล้อม Swarm ให้ตรวจสอบด้วยว่าการกำหนดค่า Traefik มีผู้ให้บริการ Docker รวมอยู่ด้วยหรือไม่ swarmMode=true y watch=trueและข้อจำกัดของบริการ (ตัวอย่างเช่น) node.role == manager (สำหรับ Portainer) ไม่ขัดแย้งกับตำแหน่งที่ติดตั้ง Traefik บันทึกการแก้ไขข้อผิดพลาดมีรายละเอียดมาก แต่มีความสำคัญอย่างยิ่งต่อการค้นหาปัญหาเกี่ยวกับการกำหนดเส้นทางหรือ TLS
เมื่อผสานรวมDocker, Traefik และ Portainer เข้าด้วยกัน คุณสามารถสร้างสภาพแวดล้อมการจัดการแบบครบวงจรที่มีน้ำหนักเบาบนเซิร์ฟเวอร์เดียว พร้อมแดชบอร์ดแบบกราฟิก ใบรับรองอัตโนมัติ และขั้นตอนการปรับใช้ที่รวดเร็วมาก โดยการเพิ่ม อัปเดต หรือลบเซอร์วิสต่างๆ จะลดลงเหลือเพียงการแก้ไขโค้ด YAML เพียงไม่กี่บรรทัด และปล่อยให้ Traefik ทำงานที่ยุ่งยากเกี่ยวกับการพร็อกซีแบบย้อนกลับและ TLS ให้เอง
