Methods-to-configure-proxies-in-Docker

คอนเทนเนอร์ได้ปฏิวัติการพัฒนาซอฟต์แวร์ด้วยการแก้ปัญหามากมายที่โปรแกรมเมอร์ต้องเผชิญ ช่วยส่งมอบผลิตภัณฑ์ที่ทำงานได้อย่างเชื่อถือได้และสม่ำเสมอบนระบบและอุปกรณ์หลากหลายประเภท ส่วน Docker ได้ยกระดับคอนเทนเนอร์ขึ้นไปอีกขั้น เพราะแพลตฟอร์มนี้ทำให้การสร้าง การจัดการ และการรันทำได้ง่ายและรวดเร็วยิ่งขึ้น Docker ยังรองรับการใช้ proxy ของบุคคลที่สามและมีหลายวิธีในการตั้งค่า เหตุใดจึงควรใช้ร่วมกับ IP ทางเลือก วิธีใดเหมาะกับกรณีของคุณที่สุด และต้องทำอะไรบ้างทีละขั้น อ่านบทความต่อเพื่อหาคำตอบ

เหตุใดจึงใช้ proxy กับ Docker

คำตอบคือการทำให้เข้าถึงอินเทอร์เน็ตได้อย่างเสถียร ปลอดภัย และควบคุมได้ บางครั้งก็เพื่อให้เข้าถึงได้เลย

Docker ต้องเข้าถึงเว็บเพื่อทำงานต่าง ๆ เช่นดึงอิมเมจ ติดตั้งแพ็กเกจ และอื่น ๆ อย่างไรก็ตาม เครือข่ายองค์กรจำนวนมากไม่มีการเชื่อมต่อปกติ เพราะการรับส่งข้อมูลขาออกถูกควบคุมหรือจำกัดด้วยเหตุผลด้านความปลอดภัย ซึ่งยังคงเป็นอุปสรรคต่อการทำงานของนักพัฒนา proxy ที่ได้รับอนุมัติบางครั้งเป็นทางเดียวที่จะเข้าถึงอินเทอร์เน็ตและหลีกเลี่ยงข้อความอย่าง “การเชื่อมต่อหมดเวลา” หรือ “ไม่สามารถเข้าถึง www.example.com“.

นอกจากนี้ ในบางกรณีจำเป็นต้องยืนยันตัวตนเพื่อใช้อินเทอร์เน็ต แต่ Docker เองไม่รองรับการยืนยันตัวตน จึงควรใช้ proxy ภายนอก

แอปพลิเคชันขณะรันอาจต้องใช้การเชื่อมต่อภายนอกด้วย บางสถานการณ์คอนเทนเนอร์ต้องเชื่อมต่อกับ API บนคลาวด์ ฐานข้อมูล บริการของบุคคลที่สาม และอื่น ๆ หากมีไฟร์วอลล์ป้องกันอยู่ จำเป็นต้องใช้ proxy เพื่อเข้าถึงปลายทางเป้าหมาย

ยังมีเหตุผลอื่นในการใช้ proxy การกำหนดเส้นทางการรับส่งข้อมูลผ่านเซิร์ฟเวอร์ทางเลือกอาจแก้ปัญหาความเร็ว และช่วยตรวจสอบการรับส่งข้อมูลสำหรับการบันทึกบันทึกเหตุการณ์ ซอฟต์แวร์อันตราย การตรวจสอบ SSL และอื่น ๆ นอกจากนี้ยังช่วยรักษาความสม่ำเสมอของเครือข่ายระหว่างเซิร์ฟเวอร์และเครื่องจักรประเภทต่าง ๆ รวมทั้งปกปิดข้อมูลภายใน เช่นที่อยู่ IP, คำขอ DNS ภายใน และ NAT เพื่อเพิ่มความปลอดภัย

วิธีตั้งค่า proxy ใน Docker

คุณสามารถตั้งค่า proxy ได้ 4 ชั้น ได้แก่ Docker Daemon หรือ Docker Engine, Docker Client, คอนเทนเนอร์ และระดับ OS แต่ละชั้นยังมีวิธีตั้งค่าแตกต่างกัน และตัวเลือกที่เลือกจะส่งผลต่อส่วนต่าง ๆ ไม่เหมือนกัน ทุกตัวเลือกมีข้อดีของตัวเอง จึงควรเลือกตามกรณีใช้งาน มาดูทีละข้อว่าตัวเลือกใดเหมาะกับวัตถุประสงค์ใดและต้องทำอย่างไร

ชั้นที่ 1: ตั้งค่า Docker Daemon

proxy ที่ตั้งค่าในระดับนี้จะควบคุมการดึงและส่งอิมเมจ การเข้าถึง Docker Hub และรีจิสทรีส่วนตัว รวมถึงการเข้าถึง Docker Swarm

ควรเลือกตัวเลือกนี้เมื่อ:

  • ต้องการให้การดำเนินการกับอิมเมจทั้งหมดผ่าน proxy;
  • คำสั่งอย่าง docker pull หรือ docker push ล้มเหลว;
  • ต้องกำหนดเส้นทางการรับส่งข้อมูลทั้งหมดจากเครื่องผ่าน proxy ขององค์กร;
  • เข้าถึงเครือข่ายภายนอกได้ด้วย proxy เท่านั้น;
  • ใช้ Docker Swarm.

วิธีนี้เสถียรและคาดการณ์ได้ และหากใช้ Desktop ก็สามารถตั้งค่า proxy ผ่านอินเทอร์เฟซแบบกราฟิกได้ง่าย ในทางกลับกัน สำหรับเวอร์ชันเก่า (< 17.x) และการตั้งค่าบางแบบที่พบไม่บ่อย การตั้งค่าอาจส่งผลต่อคอนเทนเนอร์ทั้งหมด ซึ่งอาจทำให้คอนเทนเนอร์ที่ไม่ใช้อินเทอร์เน็ตช้าลง ในเวอร์ชันใหม่ proxy ของ Daemon จะไม่ส่งผลต่อคอนเทนเนอร์ เพราะการตั้งค่าไม่ได้สืบทอดโดยอัตโนมัติ

มี 4 วิธีในการตั้งค่า proxy ของ Docker Daemon

วิธีที่ 1 – ใช้ daemon.json

วิธีนี้ใช้ได้เฉพาะ Linux และแนะนำสำหรับ OS นี้ โดยตั้งค่าพฤติกรรมของ proxy ในไฟล์ daemon.json นี้:


{
 "proxies": {
   "http-proxy": "http://proxy.example.com:3128",
   "https-proxy": "https://proxy.example.com:3129",
   "no-proxy": "*.test.example.com,.example.org,127.0.0.0/8"
 }
}

      
        
        
        
        
        
        

      

หลังแก้ไขไฟล์แล้ว ให้รีสตาร์ต Docker เพื่อให้การเปลี่ยนแปลงมีผล:


sudo systemctl restart docker

      
        
      
วิธีที่ 2 – ผ่านไฟล์ drop-in ของ systemd

วิธีนี้ใช้ได้เฉพาะ Linux เช่นกัน และรันได้ทั้งโหมดปกติและ rootless

เริ่มด้วยการสร้างไดเรกทอรีระบบ:


sudo mkdir -p /etc/systemd/system/docker.service.d

      
        
      

จากนั้นสร้างไฟล์ชื่อ /etc/systemd/system/docker.service.d/http-proxy.conf เพื่อเพิ่มตัวแปรสภาพแวดล้อมของ proxy


[Service]
Environment="HTTP_PROXY=http://proxy.example.com:3128"

      
        
        
      

หากใช้เซิร์ฟเวอร์ HTTPS ให้เปลี่ยนตัวแปรเป็น “HTTPS_PROXY” คุณตั้งค่าได้หลายตัวแปร จากนั้นบันทึกและรีสตาร์ต Docker


sudo systemctl daemon-reload
sudo systemctl restart docker

      
        
        
        
วิธีที่ 3 – ใช้ตัวแปรสภาพแวดล้อมสำหรับ dockerd

Docker Daemon จะตรวจสอบตัวแปรสภาพแวดล้อมก่อนรัน อย่างไรก็ตาม วิธีนี้มักไม่ใช่ตัวเลือกแรก


export HTTP_PROXY=...
dockerd

      
        
        
      
วิธีที่ 4 – Docker Desktop

ในทางเทคนิค Docker Desktop อาศัย Linux Virtual Machine ขนาดเบาและใช้เพื่อกำหนดค่า Docker คุณอาจพบข้อมูลว่า Docker Desktop ใช้ได้เฉพาะ Windows/macOS แต่ในทางเทคนิคก็ใช้ได้กับ Linux เช่นกัน อย่างไรก็ตามพบได้ไม่บ่อย เป็นทางเลือก และยังต้องจัดการ Daemon ภายใน VM ไม่ใช่ engine แบบเนทีฟ ดังนั้นวิธีนี้จึงยังเหมาะกับ Windows/macOS มากกว่า ให้ไปตามเส้นทางนี้:

Docker Desktop > Settings > Resources > Proxies.

ชั้นที่ 2: ตั้งค่า proxy ของ Docker Client (CLI)

Docker Client ใช้ proxy เพื่อส่งคำขอ ซึ่งใช้กับการเรียก API ที่ทำผ่าน CLI และคำสั่งเช่น docker login, docker pull, docker push.

ควรเลือกตัวเลือกนี้เมื่อ:

  • ต้องการให้ client ยืนยันตัวตนผ่าน proxy;
  • มีข้อจำกัดการรับส่งข้อมูลขาออกของบริษัท;
  • ไม่ต้องการให้ Daemon หรือคอนเทนเนอร์ได้รับผลกระทบ

Client ตั้งค่าได้รวดเร็วและง่าย และไม่จำเป็นต้องรีสตาร์ต daemon อย่างไรก็ตาม วิธีนี้ใช้ไม่ได้หากต้องแก้ปัญหาการเข้าถึงระหว่าง build หรือ run ของคอนเทนเนอร์ หรือข้อผิดพลาด push และ pull ของ Daemon

โดยทั่วไป คุณจะตั้งค่า Docker Client ด้วยตัวแปรสภาพแวดล้อมของ shell

สำหรับ Linux และ macOS จะมีลักษณะดังนี้:


export HTTP_PROXY=http://PROXY:PORT

      
        
      

หรือ


export HTTPS_PROXY=http://PROXY:PORT

      
        
      

สำหรับ Windows ให้ใช้ดังนี้:


setx HTTP_PROXY http://PROXY:PORT

      
        
      

หมายเหตุ: บน Windows เมื่อใช้ CMD อาจเกิดปัญหาได้ แต่ PowerShell ใช้งานได้

ยังมีอีกวิธีหนึ่ง แต่ไม่ค่อยมีการใช้ คือการตั้งค่าแยกตามคำสั่ง


HTTP_PROXY=http://PROXY docker login

      
        
      

ชั้นที่ 3: proxy ของคอนเทนเนอร์

หากเลือกวิธีนี้ แอปพลิเคชันภายในคอนเทนเนอร์จะใช้ proxy คุณสามารถตั้งค่า proxy สำหรับ build หรือรันคอนเทนเนอร์พร้อม proxy ได้

ควรเลือกตัวเลือกนี้เมื่อ:

  • คอนเทนเนอร์ต้องการการเชื่อมต่อภายนอก;
  • build ไม่สามารถรัน package manager ได้;
  • แอปภายในคอนเทนเนอร์ต้องกำหนดเส้นทางคำขอ API ผ่าน proxy ภายนอก

ตั้งค่าแยกตามคอนเทนเนอร์ได้ง่าย และเหมาะกับสภาพแวดล้อมแบบผสมที่บางคอนเทนเนอร์ต้องใช้ proxy ขณะที่บางคอนเทนเนอร์ไม่ต้องใช้ อีกทั้งยังแยกออกจากการตั้งค่า OS และ daemon ได้ชัดเจน อย่างไรก็ตาม คุณต้องตั้งค่า proxy ด้วยตนเองสำหรับทุก build และ run ตัวเลือกนี้ยังไม่เหมาะที่สุดสำหรับการปรับใช้ขนาดใหญ่ และมีความเสี่ยงด้านความปลอดภัยเพราะข้อมูลรับรอง proxy อาจรั่วไหล

วิธีที่ 1 – ตั้งค่า proxy แยกตาม build

docker build \
 --build-arg HTTP_PROXY=http://PROXY:PORT \
 --build-arg HTTPS_PROXY=http://PROXY:PORT \
 -t myimage .

      
        
        
        
        
      
วิธีที่ 2 – ใช้ Dockerfile

ENV ใน Dockerfile หรือตัวแปรสภาพแวดล้อมจะฝังการตั้งค่าของคุณไว้ในอิมเมจ วิธีนี้มีความเสี่ยงด้านความปลอดภัย และไม่ควรใช้สำหรับการสร้าง


ENV HTTP_PROXY=http://PROXY:PORT

      
        
      

ENV HTTPS_PROXY=http://PROXY:PORT

      
        
      
วิธีที่ 3 – ตั้งค่า proxy แยกตาม run

docker run \
 -e HTTP_PROXY=http://PROXY:PORT \
 -e HTTPS_PROXY=http://PROXY:PORT \
 image

      
        
        
        
        
      
วิธีที่ 4 – เลือกใช้ Docker Compose

นี่เป็นตัวเลือกที่ปลอดภัยและแนะนำ:


environment:
 HTTP_PROXY: http://PROXY:PORT
 HTTPS_PROXY: http://PROXY:PORT
 NO_PROXY: "localhost,127.0.0.1"

      
        
        
        
        
      

หมายเหตุ: ในเอกสารทางการของ Docker มีแนวคิด 2 อย่างที่เรียกว่า CLI ซึ่งอาจทำให้สับสน มี Docker CLI proxy ที่ส่งผลต่อโปรแกรม client และมี Docker CLI flags ที่แทรกการตั้งค่า proxy เข้าไปในคอนเทนเนอร์ ซึ่งส่งผลต่อคอนเทนเนอร์ ไม่ใช่ client อย่างไรก็ตาม ทั้งสองกรณีใช้เครื่องมือบรรทัดคำสั่ง

ชั้นที่ 4: proxy ระดับระบบปฏิบัติการ

คุณสามารถตั้งค่าให้การรับส่งข้อมูลทั้งหมดจากอุปกรณ์ผ่านเซิร์ฟเวอร์ proxy ซึ่งจะส่งผลต่อทั้ง Docker Daemon และ Docker Client และบางครั้งอาจส่งผลแม้แต่กับคอนเทนเนอร์และแอปอื่นทั้งหมดที่คุณใช้

ควรใช้ตัวเลือกนี้เมื่อ:

  • บริษัทกำหนดให้ใช้ proxy ระดับระบบ;
  • มีแอปจำนวนมากนอกเหนือจาก Docker ที่ต้องใช้ proxy ด้วย

วิธีนี้ง่ายและรวดเร็ว เพราะตั้งค่า proxy ครั้งเดียวแล้วการตั้งค่านั้นจะใช้ได้กับส่วนประกอบและแอปส่วนใหญ่ อย่างไรก็ตาม วิธีนี้ไม่ได้จำเพาะกับ Docker และทำให้ debugging ยากขึ้น อีกทั้งคอนเทนเนอร์จะสืบทอดการตั้งค่าเหล่านี้โดยอัตโนมัติได้ค่อนข้างยาก คุณจึงอาจยังต้องตั้งค่าแยกต่างหาก

ที่นี่, คุณจะพบบทแนะนำทีละขั้นสำหรับการตั้งค่า proxy บน OS ต่าง ๆ รวมถึง macOS และ Windows.

นอกจากนี้ คุณสามารถดูเอกสารทางการของ Docker เพื่อดูรายละเอียดเพิ่มเติมของแต่ละวิธีและตัวแปรที่มีทั้งหมด

การตั้งค่า proxy ของ Docker Daemon

วิธีตั้งค่า Docker Client

วิธีปรับการตั้งค่า proxy ใน Docker Desktop

Docker มี proxy ภายในหรือไม่

Docker มีสิ่งที่เรียกว่า proxy ภายใน HTTP(S) สำหรับการสร้างอิมเมจเท่านั้น ซึ่งทำให้บางคนสับสนและคิดว่าไม่จำเป็นต้องใช้ proxy ภายนอก

proxy ภายในของ BuildKit ใช้สำหรับ build เท่านั้น ช่วยให้เข้าถึงได้เร็วขึ้น แก้ปัญหา DNS และป้องกันไม่ให้การตั้งค่า DNS รั่วไปยัง build อย่างไรก็ตาม ไม่สามารถช่วยสร้างการเชื่อมต่อขาออกที่ปลอดภัยได้ จึงใช้แทน proxy ไม่ได้

ปัญหาการตั้งค่าที่พบบ่อยและวิธีแก้ไข

การแก้ข้อผิดพลาดที่เกี่ยวข้องกับ proxy ใน Docker อาจยุ่งยากเพราะมีหลายชั้น ต่อไปนี้คือปัญหาที่พบบ่อย 5 ข้อและวิธีแก้

ข้อผิดพลาด 1: Docker pull/docker push ล้มเหลว

หากพบว่า proxy pull ค้าง หมดเวลา หรือการเชื่อมต่อถูกปฏิเสธ แสดงว่า Docker Daemon ไม่รู้จัก proxy ของคุณ ให้แก้โดยตั้งค่า proxy ในระดับ engine

ข้อผิดพลาด 2: ไม่มีการเชื่อมต่อแม้ Daemon ทำงาน

ขณะเดียวกัน dicker pull ทำงานได้ แต่คอนเทนเนอร์รัน pip install และ dependency อื่นไม่ได้ อาจเกิดข้อผิดพลาดเช่นการแก้ชื่อชั่วคราวล้มเหลว สถานการณ์นี้เกิดกับ Docker เวอร์ชันใหม่เพราะ proxy ของ Daemon ไม่ถูกนำไปใช้ภายในคอนเทนเนอร์โดยอัตโนมัติ ให้แก้โดยใช้ proxy ระดับคอนเทนเนอร์ใน Dockerfile หรือ Docker Compose

ข้อผิดพลาด 3: ตัวแปร NO_PROXY ใช้งานไม่ได้

หากยังเห็นว่า Docker พยายามกำหนดเส้นทางการรับส่งข้อมูลผ่าน proxy แม้ตั้งค่าไว้แล้ว คอนเทนเนอร์สื่อสารไม่ได้ หรือมิเรอร์ของรีจิสทรีล้มเหลว สาเหตุอาจเป็นไวยากรณ์ไม่ถูกต้อง ลองใช้รายการที่คั่นด้วยจุลภาค และอย่าระบุโปรโตคอลเมื่อใส่โดเมน

NO_PROXY=localhost,127.0.0.1,.corp.example.com,registry.internal

ข้อผิดพลาด 4: ข้อมูลรับรอง proxy มีสัญลักษณ์ที่ไม่รองรับ

ในกรณีนี้ Docker อาจเริ่มทำงานไม่ได้หรือกำหนดเส้นทางการรับส่งข้อมูลผ่าน proxy ไม่สำเร็จ เพื่อแก้ปัญหา คุณต้อง URL-encode สัญลักษณ์อย่าง @, #, %, :

จะมีลักษณะดังนี้:

Environment=”HTTP_PROXY=http://user:Pa%%23ss@proxy:8080″

ข้อผิดพลาด 5: Docker ไม่สนใจการตั้งค่า proxy ของ Desktop

เมื่อคุณตั้งค่า proxy ด้วย Desktop แต่ build ล้มเหลวและคอนเทนเนอร์เชื่อมต่อไม่ได้ นั่นอาจเป็นสัญญาณว่าควรใช้ตัวเลือกการตั้งค่าอื่น Desktop ส่งผลต่อ Daemon แต่ไม่ได้ส่งผลต่อคอนเทนเนอร์โดยตรง ลองตั้งค่า proxy ระดับคอนเทนเนอร์

สรุป

Docker และ proxy เป็นการผสานที่ทรงพลัง มอบความเร็ว ความปลอดภัย และการปรับใช้ที่มีประสิทธิภาพ เพื่อให้ได้ประโยชน์สูงสุด คุณต้องเลือกการตั้งค่าที่เหมาะสม และแน่นอนว่าควรเลือก proxy คุณภาพสูงที่ได้มาอย่างถูกต้องตามกฎหมาย DataImpulse พร้อมช่วยคุณด้วย proxy ที่จัดหาอย่างมีจริยธรรมกว่า 90+million รายการ และทีมสนับสนุนโดยมนุษย์ตลอด 24/7 เพื่อช่วยงานพัฒนาของคุณ ติดต่อเราได้ที่ [email protected] หรือกดปุ่ม “ลองใช้เลย” เพื่อเริ่มต้นกับเรา คลิก “ลองใช้เลย” หรือติดต่อเราได้ที่ [email protected] เพื่อเริ่มต้น

Share article: