วิธีอัปเกรด Traefik v2 ไป v3 และสิ่งที่ต้องระวัง
ตรวจสอบข้อผิดพลาดเมื่อใช้ swarmMode หรือ pilot ใน static config บน Traefik v3 พร้อมแนวทางการเปลี่ยน ipWhiteList เป็น ipAllowList และการปรับปรุง router rule
ความเปลี่ยนแปลงระหว่าง Traefik v2 และ v3
การเปลี่ยนผ่านจาก Traefik v2 ไปยัง v3 ส่วนใหญ่เป็นการเปลี่ยนชื่อเรียก โดยมีการเปลี่ยนแปลงที่สำคัญคือ middleware ipWhiteList ถูกเปลี่ยนเป็น ipAllowList นอกจากนี้ v3 ได้ปรับปรุงไวยากรณ์ของ router rule ให้เข้มงวดขึ้น (เช่น PathPrefix จะไม่รองรับฟีเจอร์ regex อีกต่อไป, matcher บางตัวถูกเปลี่ยนชื่อหรือถูกตัดออก) รวมถึงมีการตัด provider และ option บางอย่างออกไป แต่ส่วนประกอบอื่นยังคงใช้งานได้ตามปกติ ทั้ง entrypoints, การตั้งค่าใบรับรอง ACME, ขั้นตอนการทำงานผ่าน Docker labels และ acme.json ของคุณจะยังคงใช้งานได้ต่อไป นอกจากนี้ v3 ยังมี compatibility mode เพื่อให้ไวยากรณ์ของ v2 ยังคงใช้งานได้ ช่วยให้คุณสามารถอัปเกรด binary ก่อน แล้วจึงค่อยทยอยแก้ไข rule ทีละ service แทนการแก้ไขทั้งหมดในครั้งเดียวซึ่งมีความเสี่ยงสูง
คู่มือนี้อ้างอิงตามการตั้งค่า Docker Compose แบบใช้ label จาก คู่มือ Traefik reverse proxy โดยเนื้อหาในหน้านั้นเป็นรูปแบบ v3-native ส่วนคู่มือนี้มีไว้สำหรับระบบที่ยังใช้งาน tag traefik:v2 อยู่
การเปลี่ยนชื่อและการลบออก
ipWhiteListเปลี่ยนเป็นipAllowListสำหรับทั้ง HTTP และ TCP middleware ตัวเลือกภายในยังคงเดิม ดังนั้นsourcerangeจึงยังคงมีความหมายเดิม เวอร์ชัน v3 ปัจจุบันรวมถึง v3.5 ยังคงรองรับชื่อเดิมในฐานะ deprecated alias และยังคงบังคับใช้ตามรายการเดิม การเปลี่ยนชื่อครั้งนี้จึงไม่ส่งผลกระทบต่อระบบ อย่างไรก็ตาม ควรเปลี่ยนชื่อตามกำหนดการ เนื่องจาก alias ดังกล่าวมีกำหนดถูกลบออก และจะหายไปจากรายการ deprecation โดยไม่มีการแจ้งเตือนproviders.docker.swarmMode=trueถูกลบออก Swarm จะใช้ provider ของตนเองซึ่งกำหนดค่าเป็นproviders.swarm.endpoint- ส่วนของ
pilotถูกลบออกทั้งหมด experimental.http3ถูกลบออก การเปิดใช้งาน HTTP/3 จะทำผ่าน entrypoint โดยตรงtls.caOptionalถูกลบออกจาก providers และจาก forwardAuth middleware- InfluxDB v1 metrics provider, Rancher provider และ Marathon provider ถูกลบออกแล้ว
- Tracing เปลี่ยนไปใช้ OpenTelemetry ส่วนการเชื่อมต่อกับ tracing backends โดยเฉพาะ เช่น Jaeger และ Zipkin ถูกลบออก โดย v3 จะส่งออกข้อมูลผ่าน OTLP (OpenTelemetry protocol) แทน
- ตัวเลือก
ssl*ที่เป็น deprecated ภายใน headers middleware (sslRedirect,sslHostและอื่นๆ) ถูกลบออกแล้ว โดยมี entrypoint redirections และ redirectScheme middleware มาแทนที่
การลบออกเหล่านี้มีความสำคัญมากกว่าที่เห็น เนื่องจาก Traefik จะไม่เริ่มทำงานหาก static configuration มีตัวเลือกที่ระบบไม่รู้จัก หากมีบรรทัด pilot หรือ swarmMode หลงเหลืออยู่ จะทำให้ container หยุดทำงานขณะ boot พร้อมข้อความ incompatible deprecated static option found ที่ระบุชื่อตัวเลือกนั้น ส่วนตัวเลือกที่ Traefik ไม่รู้จักเลย (เช่น พิมพ์ผิด หรือ tls.caOptional) จะทำให้ระบบหยุดทำงานพร้อมข้อความ field not found แทน ควรทำความสะอาด static configuration ก่อนเปลี่ยน image tag
กรณีที่ Traefik ไม่รู้จักชื่อ middleware อย่างแท้จริง (เช่น พิมพ์ผิด หรือชื่อที่ถูกลบออกแทนที่จะเป็น alias) จะเกิดข้อผิดพลาดต่างออกไป โดย router ที่อ้างอิงถึง middleware นั้นจะโหลดขึ้นมาพร้อมข้อผิดพลาดแทนที่จะเป็น route, dashboard จะทำเครื่องหมายแจ้งเตือน และ API จะรายงานว่า middleware "offce@docker" does not exist การส่ง request ไปยัง hostname นั้นจะได้รับ 404 เนื่องจาก router ไม่สามารถทำงานได้ โปรดทราบว่าใน v3 ปัจจุบัน ipwhitelist ไม่ได้อยู่ในกลุ่มนี้ เนื่องจากยังคงใช้งานได้ในฐานะ deprecated alias ดังนั้น label ที่ยังไม่ได้เปลี่ยนชื่อจะยังคงทำงานได้ตามปกติ
การเปลี่ยนแปลงไวยากรณ์ของ Rule
Rule คือส่วนที่สามารถทำการ rewrite ข้อมูลได้จริง การเปลี่ยนแปลงใน v3 มีดังนี้:
- ต้องใช้ backticks ล้อมรอบค่าที่อยู่ภายใน matcher ใน v2 สามารถใช้ double quotes ได้ แต่ v3 ไม่รองรับ ดังนั้น Host("app.example.com") ต้องเปลี่ยนเป็น Host(
app.example.com) PathPrefixไม่รองรับ regular expressions หรือ placeholder รูปแบบ{id}อีกต่อไป Rule ใน v2 เช่น PathPrefix(/api/{version:v[0-9]+}) ต้องเปลี่ยนเป็น matcher แบบPathRegexpที่เขียนด้วยไวยากรณ์ Go regular expression- Matcher รับค่าได้เพียงค่าเดียวเท่านั้น ใน v2 อนุญาตให้ใช้ Host(
app.example.com,www.example.com); แต่ใน v3 ต้องใช้ Host(app.example.com) || Host(www.example.com) ข้อยกเว้นคือHeader,HeaderRegexp,QueryและQueryRegexpซึ่งยังคงต้องใช้ชื่อร่วมกับค่าที่กำหนด HeadersและHeadersRegexpถูกเปลี่ยนชื่อเป็นHeaderและHeaderRegexpHostHeaderถูกลบออก ให้ใช้Hostแทน ซึ่งทำหน้าที่เหมือนกันใน v3- มี matcher ใหม่สองตัวคือ
QueryRegexpและClientIPสำหรับใช้ตรวจสอบ client address ภายใน rule
ข้อดีคือ Rule แบบ Host(app.example.com) ธรรมดาที่เขียนด้วย backticks สามารถใช้งานใน v3 ได้ทันที การตั้งค่า Compose ขนาดเล็กส่วนใหญ่ใช้รูปแบบนี้ ซึ่งหมายความว่า label ส่วนใหญ่สามารถใช้งานต่อได้โดยไม่ต้องแก้ไข rule
ตรวจสอบ label ของคุณก่อนเริ่มดำเนินการ
คุณสามารถประเมินขนาดของการ migration ได้ด้วยการค้นหาเพียงครั้งเดียว เนื่องจากทุกการเปลี่ยนแปลง label ที่ส่งผลกระทบต่อระบบจะทิ้งรูปแบบที่ grep สามารถค้นหาได้:
grep -rnE 'ipwhitelist|HostHeader|Headers\(|PathPrefix\(`[^`]*\{|Host\(`[^`]*`,' docker-compose*.ymlทุกรายการที่พบคือหนึ่งบรรทัดที่ต้องแก้ไข ipwhitelist จะเปลี่ยนเป็น ipallowlist HostHeader จะเปลี่ยนเป็น Host Headers จะเปลี่ยนเป็น Header ตัวแทน (placeholder) {...} ภายใน PathPrefix จะเปลี่ยนเป็นตัวจับคู่ (matcher) PathRegexp เครื่องหมายจุลภาค (comma) ภายใน Host() จะเปลี่ยนเป็นตัวจับคู่ Host() สองตัวที่เชื่อมกันด้วย || หากไม่พบรายการใดเลย แสดงว่า label ของคุณเป็นรูปแบบ v3 syntax ที่ถูกต้องแล้ว และการ migration จะเหลือเพียงการตั้งค่าแบบ static และ image tag เท่านั้น
สิ่งที่ยังคงเหมือนเดิม
Entrypoints และการ redirect จาก HTTP ไปยัง HTTPS, ACME resolvers ที่รองรับ challenge ทั้งสองประเภท, exposedByDefault, router และ service labels, loadbalancer.server.port รวมถึง dashboard ยังคงทำงานใน v3 ได้เหมือนกับใน v2 ใบรับรอง (certificates) ของคุณจะถูกใช้งานต่อได้ทันที เนื่องจาก v3 ยังคงอ่านข้อมูลจาก acme.json ที่ v2 เขียนไว้ อย่างไรก็ตาม ควรสำรองไฟล์ไว้ก่อนเริ่มดำเนินการ เนื่องจากหากการ rollback ทำให้ไฟล์นี้สูญหาย จะส่งผลให้คุณติดข้อจำกัดเรื่องการขอใบรับรองซ้ำ (duplicate-certificate rate limit) ของ Let's Encrypt:
cp ./letsencrypt/acme.json ./letsencrypt/acme.json.v2-backupThe migration path
Step 1: ระบุเวอร์ชันที่ใช้งานในปัจจุบัน เปลี่ยน tag traefik:latest หรือ traefik:v2 ให้เป็นเวอร์ชันที่ใช้งานอยู่จริง เช่น traefik:v2.11 จากนั้นให้ commit directory ของ compose ทั้งหมดลงใน git การทำเช่นนี้จะช่วยให้สามารถย้อนกลับขั้นตอนในภายหลังได้ด้วยการ checkout หากคุณยังไม่ชำนาญการสร้าง service ใหม่ด้วย docker compose up -d <service> สามารถศึกษา คู่มือพื้นฐาน Docker Compose ซึ่งครอบคลุมการทำงานที่จำเป็นสำหรับการ migration นี้
Step 2: ลบการตั้งค่าแบบ static และเปิดใช้งาน compatibility mode ลบ option ทั้งหมดที่ถูกยกเลิกใน v3 (pilot, swarmMode, tls.caOptional, experimental.http3) จากนั้นกำหนดให้ v3 ใช้ syntax ของ v2 สำหรับ rules เป็นค่าเริ่มต้น ใน traefik.yml:
core:
defaultRuleSyntax: v2หรือใช้เป็น flag ในรายการ compose command:: --core.defaultRuleSyntax=v2 ทั้งนี้ compatibility mode ใช้สำหรับ syntax ของ rules เท่านั้น ไม่ได้เป็นการคืนค่า option ที่ถูกลบไป และไม่ได้เปลี่ยนชื่อ middleware ให้โดยอัตโนมัติ
Step 3: เตรียมการเปลี่ยนชื่อ middleware ค้นหาชื่อเดิมในไฟล์ compose ของคุณ: grep -rn ipwhitelist docker-compose*.yml แก้ไข label ipwhitelist ทุกจุดให้เป็น ipallowlist แต่ห้ามเริ่มใช้งานการเปลี่ยนแปลงนี้ทันที เนื่องจากชื่อใหม่ยังไม่มีใน v2 การแก้ไขเหล่านี้จะต้องทำพร้อมกับการเปลี่ยนเวอร์ชันในขั้นตอนถัดไป (หากมีจุดที่หลุดรอดไป v3 เวอร์ชันปัจจุบันยังคงรองรับชื่อเดิมในฐานะ deprecated alias ดังนั้นระบบจะยังทำงานได้ ให้แก้ไขในรอบถัดไปแทนที่จะต้องมาแก้ตอนตี 2)
Step 4: เปลี่ยน image tag กำหนด Traefik image ให้เป็นเวอร์ชัน v3 ปัจจุบัน คือ traefik:v3.5 ณ เวลาที่เขียนบทความนี้ จากนั้น:
docker compose up -d
docker compose logs -f traefikเนื่องจากเปิดใช้งาน compatibility mode ไว้ rules ของ v2 จะยังคงทำงานได้ และเนื่องจาก up -d ได้สร้าง service ที่มีการเปลี่ยนชื่อ middleware label ใหม่ขึ้นมาใหม่ด้วย routers เหล่านั้นจึงจะเริ่มทำงานได้อย่างถูกต้อง Log ที่สมบูรณ์จะต้องไม่มีบรรทัด field not found และไม่มีบรรทัด does not exist
โปรดพิจารณาช่วงเวลาที่เกิดความเสี่ยงในขั้นตอนนี้ Router ที่อ้างอิงชื่อ middleware ที่ v3 ไม่รู้จัก (เช่น พิมพ์ผิด หรือเป็น option ที่ถูกลบไป) จะใช้งานไม่ได้ตั้งแต่ Traefik ตัวใหม่เริ่มทำงานจนกว่า container ของแอปจะถูกสร้างใหม่ ซึ่งในเครื่องหนึ่งเครื่องอาจใช้เวลาเพียงไม่กี่วินาทีที่ docker compose up -d ต้องประมวลผลรายการทั้งหมด หาก route ใดไม่สามารถหยุดทำงานได้แม้เพียงชั่วขณะ ให้ลบ middleware ที่เปลี่ยนชื่อออกจาก label middlewares ของ router นั้นก่อนทำการเปลี่ยนเวอร์ชัน แล้วจึงเพิ่มกลับเข้าไปใหม่ภายหลัง และควรตัดสินใจล่วงหน้าว่า route นั้นสามารถทำงานโดยไม่มี IP allow list ได้หรือไม่ในช่วงเวลาสั้นๆ ดังกล่าว
Step 5: migrate rules ทีละ service ดำเนินการทีละแอป: เขียน rule ใหม่ให้เป็น syntax ของ v3, สร้าง service นั้นใหม่ด้วย docker compose up -d app และทดสอบก่อนเริ่มทำตัวถัดไป หากมี service ใดที่มี rule ที่ยังไม่สามารถเขียนใหม่ได้ ให้ใส่ label traefik.http.routers.app.ruleSyntax=v2 เพื่อเป็นทางออกชั่วคราวแล้วดำเนินการต่อ
Step 6: ปิด compatibility mode เมื่อทุก rule เป็น syntax ของ v3 แล้ว ให้ลบ defaultRuleSyntax และ label ruleSyntax ทั้งหมดออก จากนั้น restart Traefik และตรวจสอบว่าทุก router ยังแสดงสถานะสีเขียวใน dashboard ห้ามใช้งานโดยเปิด compatibility mode ค้างไว้ เนื่องจาก Traefik ได้ประกาศ deprecated ทั้งสอง option ใน v3.4 และจะลบออกในเวอร์ชัน major ถัดไป ดังนั้น option เหล่านี้เป็นเพียงทางผ่าน ไม่ใช่จุดหมายปลายทาง
ก่อนและหลัง: การเปลี่ยนแปลง label ของ service หนึ่ง
นี่คือตัวอย่างแอปพลิเคชันที่มีการเปลี่ยนแปลงสำคัญหลายอย่างพร้อมกัน ได้แก่ multi-value Host, PathPrefix placeholder และ ipWhiteList middleware ส่วนของ v2 คือ:
app:
image: app:1.4
restart: unless-stopped
networks:
- proxy
labels:
- traefik.enable=true
- traefik.http.routers.app.rule=Host(`app.example.com`,`www.example.com`) && PathPrefix(`/api/{version:v[0-9]+}`)
- traefik.http.routers.app.entrypoints=websecure
- traefik.http.routers.app.tls.certresolver=le
- traefik.http.routers.app.middlewares=office
- traefik.http.middlewares.office.ipwhitelist.sourcerange=10.0.0.0/24
- traefik.http.services.app.loadbalancer.server.port=8080และ service เดิมที่ถูก migrate ไปยัง v3:
app:
image: app:1.4
restart: unless-stopped
networks:
- proxy
labels:
- traefik.enable=true
- traefik.http.routers.app.rule=(Host(`app.example.com`) || Host(`www.example.com`)) && PathRegexp(`^/api/v[0-9]+`)
- traefik.http.routers.app.entrypoints=websecure
- traefik.http.routers.app.tls.certresolver=le
- traefik.http.routers.app.middlewares=office
- traefik.http.middlewares.office.ipallowlist.sourcerange=10.0.0.0/24
- traefik.http.services.app.loadbalancer.server.port=8080มีการเปลี่ยนแปลง label ทั้งหมด 2 จุด กฎเดิมได้แยก multi-value Host ออกเป็น 2 matchers โดยเชื่อมด้วย || และเปลี่ยน placeholder เป็น PathRegexp นอกจากนี้ label ของ middleware ได้เปลี่ยนจาก ipwhitelist เป็น ipallowlist ส่วน entrypoint, certificate resolver, การเชื่อมต่อ router-to-middleware และ service port ไม่มีการเปลี่ยนแปลงใดๆ
ทดสอบแต่ละ service ด้วย dashboard
หลังจากทำการ flip ทุกครั้ง ให้เปิดหน้า HTTP routers ของ dashboard ทุก router ควรแสดงสถานะเป็นสีเขียว หาก router มี badge แสดงข้อผิดพลาด ให้ตรวจสอบชื่อปัญหาที่ระบุไว้ โดยส่วนใหญ่เกิดจาก middleware ที่ไม่มีอยู่จริงภายใต้ชื่อใหม่ หรือเป็นกฎที่ v3 ไม่สามารถ parse ได้ จากนั้นให้ตรวจสอบจากภายนอกทีละ hostname:
curl -sI https://app.example.com/api/v1/statusหากพบ 200 หรือการ redirect ปกติของแอปพลิเคชัน แสดงว่าระบบ routing และ TLS ยังทำงานได้ปกติ หากพบ 404 จาก Traefik แสดงว่า router ไม่สามารถเริ่มทำงานได้ ให้กลับไปที่ dashboard เพื่ออ่านข้อผิดพลาด ให้เปิด docker compose logs -f traefik ค้างไว้ใน terminal ที่สองขณะทำงาน เนื่องจากข้อผิดพลาดจากการ parse ทุกกรณีจะปรากฏที่นั่นทันทีที่ container เริ่มทำงานใหม่
ความถูกต้องในการ Rollback
ให้เก็บไฟล์ compose ของ v2, การตั้งค่าแบบ static และข้อมูลสำรอง acme.json ไว้ จนกว่าทุก service จะเปลี่ยนไปใช้ v3 และผ่านการทดสอบการใช้งานจริง การ Rollback คือการ checkout commit ก่อนการ migration และรัน docker compose up -d โดยต้องใช้ไฟล์ทั้งหมด ไม่ใช่เพียงแค่การเปลี่ยน image tag เนื่องจาก label ที่ใช้เฉพาะใน v3 จะทำงานผิดพลาดเมื่อใช้กับ v2 เช่นเดียวกับที่ label ของ v2 ทำงานผิดพลาดเมื่อใช้กับ v3: ipallowlist ไม่มีอยู่ใน v2 และ matcher ของ PathRegexp จะไม่สามารถ parse ได้เช่นกัน หาก acme.json สูญหายหรือเสียหายระหว่างกระบวนการ ให้ทำการ restore ข้อมูลสำรองก่อนเริ่มใช้งาน v2 เพื่อป้องกันไม่ให้การ rollback สิ้นเปลือง Let's Encrypt rate limit จากการออกใบรับรอง (certificate) ใหม่พร้อมกันถึงห้าใบ
FAQ
จำเป็นต้องเขียนกฎของ router ใหม่ทั้งหมดสำหรับ Traefik v3 หรือไม่?
ไม่จำเป็น กฎ Host(app.example.com) แบบปกติที่เขียนด้วย backticks สามารถใช้งานได้ทั้งสองเวอร์ชัน ซึ่งครอบคลุมการตั้งค่าส่วนใหญ่ใน Compose การเขียนใหม่จะจำเป็นเฉพาะในกรณีที่กฎเดิมใช้ฟีเจอร์ที่มีเฉพาะใน v2 เท่านั้น เช่น regex หรือ placeholders ภายใน Path และ PathPrefix, การใช้หลาย hostname ภายใน Host() เดียวกัน, การใช้ quotes แทน backticks หรือการใช้ matcher Headers, HeadersRegexp และ HostHeader ที่ถูกยกเลิกไปแล้ว
ipWhiteList ใน Traefik v3 เปลี่ยนแปลงอย่างไร?
มีการเปลี่ยนชื่อเป็น ipAllowList โดยที่การตั้งค่าภายในยังคงเดิม ดังนั้น label ของ v2 เช่น traefik.http.middlewares.office.ipwhitelist.sourcerange=10.0.0.0/24 จะกลายเป็นบรรทัดเดิมแต่เปลี่ยนเป็น ipallowlist สำหรับ Traefik v3 เวอร์ชันปัจจุบัน รวมถึง v3.5 ยังคงรองรับชื่อเดิมในฐานะ alias ที่ล้าสมัย (deprecated) ดังนั้นหากไม่เปลี่ยนชื่อ label จะยังคงบังคับใช้ allowlist ต่อไป แต่ควรเปลี่ยนชื่อตามกำหนดการ เนื่องจาก alias นี้มีแผนจะถูกลบออก หากใช้ชื่อ middleware ที่ Traefik ไม่รู้จัก ระบบจะแสดง error ของ router และส่งค่า 404 แทน โดยหน้า dashboard จะแสดงข้อผิดพลาดดังกล่าว และการเรียกใช้งาน hostname นั้นจะได้รับผลลัพธ์เป็น 404
Traefik v3 ยังสามารถอ่าน syntax ของกฎแบบ v2 ได้หรือไม่?
ได้ ให้ตั้งค่า core.defaultRuleSyntax: v2 ใน static configuration เพื่อใช้ syntax ของ v2 เป็นค่าเริ่มต้นในระหว่างการย้ายระบบ และใช้ label ruleSyntax=v2 ในระดับ router สำหรับส่วนที่ยังไม่ได้เปลี่ยนหลังจากเปลี่ยนค่าเริ่มต้นกลับคืนแล้ว ทั้งนี้ควรใช้ทั้งสองวิธีเป็นเพียงการชั่วคราว เนื่องจาก Traefik ได้ประกาศ deprecate ฟีเจอร์เหล่านี้ใน v3.4 และจะลบออกในเวอร์ชัน major ถัดไป
ใบรับรอง Let's Encrypt จะยังใช้งานได้หลังการอัปเกรดหรือไม่?
ใช้งานได้ Traefik v3 ยังคงอ่านไฟล์ acme.json ที่ v2 เขียนไว้ ดังนั้นใบรับรองจะไม่ถูกออกใหม่เพียงเพราะมีการเปลี่ยน binary อย่างไรก็ตาม ควรคัดลอกไฟล์ไปไว้ในที่ปลอดภัยก่อนเริ่มดำเนินการ เพราะหากมีการ rollback หรือ volume ถูกลบจนทำให้สูญเสีย acme.json จะส่งผลให้ต้องออกใบรับรองใหม่ทั้งหมดในคราวเดียว และ Let's Encrypt อนุญาตให้ขอใบรับรองซ้ำสำหรับ hostname ชุดเดิมได้เพียง 5 ครั้งต่อสัปดาห์เท่านั้น
ทำไม Traefik v3 ถึงไม่สามารถเริ่มทำงานได้หลังการอัปเกรด?
สาเหตุเกือบทั้งหมดเกิดจาก static configuration ยังมี option ที่ v3 ยกเลิกไปแล้ว และ Traefik จะไม่เริ่มทำงานหากพบ option ที่ไม่รู้จัก สำหรับค่าที่ถูกยกเลิกซึ่งเป็นที่รู้จักกันดี (pilot, providers.docker.swarmMode, experimental.http3) log จะแสดงข้อความ incompatible deprecated static option found พร้อมระบุสาเหตุ ส่วนกรณีที่ไม่เคยมีใน v3 เช่น tls.caOptional log จะแสดง field not found พร้อมระบุ node ให้ทำการลบหรือแทนที่ค่าเหล่านั้น แล้วจึงเริ่มการทำงานของ container ใหม่อีกครั้ง