ตกลงเพื่อเรียกใช้นักเทียบท่าจากด้านในหรือไม่


185

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


11
ความเป็นไปได้อีกอย่างหนึ่งคือการติดตั้งซ็อกเก็ตนักเทียบท่าจากโฮสต์เป็นโวลุ่มในคอนเทนเนอร์ ที่ช่วยให้คุณสร้างคอนเทนเนอร์ "พี่น้อง" และมีข้อได้เปรียบในการใช้แคชซ้ำ
Adrian Mouat

4
ฉันพบว่าเมื่อใช้ซ็อกเก็ตนักเทียบท่าจากโฮสต์ว่าในกรณีที่ฉันต้องการติดตั้งไดรฟ์ข้อมูลภายนอกจำเป็นต้องกำหนดเส้นทางวอลุ่มที่เกี่ยวข้องกับโฮสต์ตามที่เป็นที่ที่ดีมอนภูต การตั้งค่าสัมพันธ์กับคอนเทนเนอร์ที่เริ่มต้นคอนเทนเนอร์จะไม่จำเป็นต้องทำงานเว้นแต่ว่าพา ธ ตรงกัน
Jakob Runge

คำตอบ:


224

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

Jérôme Petazzoni - ผู้เขียนของคุณลักษณะที่ทำให้มันเป็นไปได้สำหรับนักเทียบท่าเพื่อให้ทำงานได้ภายในภาชนะหาง - จริงเขียนบล็อกโพสต์บอกว่าจะไม่ทำมัน กรณีการใช้งานที่เขาอธิบายตรงกับกรณีการใช้งานที่แน่นอนของ OP ของคอนเทนเนอร์ CI Docker ที่ต้องใช้งานภายในคอนเทนเนอร์ Docker อื่น

Petazzoni แสดงเหตุผลสองประการที่ว่าดินมีปัญหา:

  1. ไม่ร่วมมือกับ Linux Security Modules (LSM) ได้ดี
  2. มันสร้างความไม่ตรงกันในระบบไฟล์ที่สร้างปัญหาสำหรับคอนเทนเนอร์ที่สร้างขึ้นภายในคอนเทนเนอร์หลัก

จากโพสต์บล็อกนั้นเขาอธิบายทางเลือกต่อไปนี้

[วิธีที่ง่ายที่สุด] คือการเปิดเผยซ็อกเก็ต Docker กับคอนเทนเนอร์ CI ของคุณโดยผูกติดกับ-vธง

เพียงแค่ใส่เมื่อคุณเริ่มต้น CI container ของคุณ (Jenkins หรืออื่น ๆ ) แทนที่จะแฮ็คบางอย่างร่วมกับ Docker-in-Docker ให้เริ่มด้วย:

docker run -v /var/run/docker.sock:/var/run/docker.sock ...

ตอนนี้คอนเทนเนอร์นี้จะเข้าถึงซ็อกเก็ต Docker และจะสามารถเริ่มต้นคอนเทนเนอร์ได้ ยกเว้นว่าแทนที่จะเริ่มต้นคอนเทนเนอร์ "child" มันจะเริ่มต้นคอนเทนเนอร์ "sibling"


1
วิธีการเรียกใช้คำสั่งนักเทียบท่าโดยไม่sudoทำเช่นนี้? ขอบคุณ
c4k

3
คุณต้องเพิ่มผู้ใช้ในdockerกลุ่ม: sudo usermod -aG docker $USER. คุณจะต้อง relog หลังจากนั้น
predmijat

2
วิธีการ relog จากภายใน cointainer หรือไม่?
thiagowfx

1
@AlexanderMills มันเป็นสิ่งเดียวกันเพราะซ็อกเก็ตนักเทียบท่าของคุณยังอยู่ที่/var/run/docker.sockเมื่อคุณเรียกใช้นักเทียบท่าสำหรับ Mac บนเครื่อง Macos ของคุณ
บรูซซัน

1
แล้ว windows ล่ะ ฉันไม่มี/var/run/docker.sock
Abdelhafid

54

ผมตอบคำถามที่คล้ายกันมาก่อนในวิธีการเรียกใช้ภาชนะหางภายในเทียบท่า

ในการเรียกใช้นักเทียบท่าภายในนักเทียบท่าเป็นไปได้อย่างแน่นอน สิ่งสำคัญคือคุณrunภาชนะด้านนอกที่มีสิทธิ์พิเศษ (เริ่มต้นด้วย--privileged=true) แล้วติดตั้งนักเทียบท่าในภาชนะนั้น

ตรวจสอบการโพสต์บล็อกนี้สำหรับข้อมูลเพิ่มเติม: เทียบท่าในหาง

กรณีใช้ที่เป็นไปได้หนึ่งกรณีสำหรับสิ่งนี้อธิบายไว้ในรายการนี้ บล็อกอธิบายถึงวิธีการสร้างคอนเทนเนอร์นักเทียบท่าภายในคอนเทนเนอร์นักเทียบท่าของเจนกินส์

อย่างไรก็ตามนักเทียบท่าภายใน Docker ไม่ใช่วิธีที่แนะนำในการแก้ปัญหาประเภทนี้ แต่วิธีที่แนะนำคือการสร้างภาชนะ "พี่น้อง" ตามที่อธิบายไว้ในโพสต์นี้

ดังนั้นการใช้งานนักเทียบท่าในนักเทียบท่าจึงถือว่าเป็นวิธีแก้ปัญหาที่ดีสำหรับปัญหาประเภทนี้ ตอนนี้แนวโน้มคือการใช้คอนเทนเนอร์ "พี่น้อง" แทน ดูคำตอบโดย @predmijat ในหน้านี้สำหรับข้อมูลเพิ่มเติม


ดูความคิดเห็นด้านล่างเกี่ยวกับการหลีกเลี่ยงนักเทียบท่าในนักเทียบท่า
Dan Poltawski

6

ตกลงที่จะเรียกใช้ Docker-in-Docker (DinD) และอันที่จริงแล้ว Docker (บริษัท ) มีภาพ DinD อย่างเป็นทางการสำหรับสิ่งนี้

อย่างไรก็ตามข้อแม้คือมันต้องมีภาชนะที่มีสิทธิพิเศษซึ่งขึ้นอยู่กับความต้องการความปลอดภัยของคุณอาจไม่ได้เป็นทางเลือกที่ทำงานได้

ทางเลือกอื่นในการใช้งานนักเทียบท่าโดยใช้คอนเทนเนอร์ของพี่น้อง (หรือที่รู้จักว่า Docker-out-of-Docker หรือ DooD) ไม่จำเป็นต้องใช้คอนเทนเนอร์ที่ได้รับสิทธิพิเศษ แต่มีข้อบกพร่องเล็กน้อยที่เกิดขึ้นจากข้อเท็จจริงที่ว่าคุณเปิดตัวคอนเทนเนอร์จากบริบท แตกต่างจากที่ใช้อยู่ (เช่นคุณเปิดใช้คอนเทนเนอร์จากภายในคอนเทนเนอร์ แต่มันทำงานในระดับโฮสต์ไม่ใช่ภายในคอนเทนเนอร์)

ผมเขียนบล็อกอธิบายข้อดี / ข้อเสียของ DinD VS Dood ที่นี่

เมื่อกล่าวถึงนี้ Nestybox (การเริ่มต้นที่ฉันเพิ่งก่อตั้งขึ้น) กำลังทำงานกับโซลูชันที่ใช้งานนักเทียบท่าที่แท้จริงใน Docker อย่างปลอดภัย (โดยไม่ต้องใช้คอนเทนเนอร์ที่มีสิทธิ์) คุณสามารถตรวจสอบได้ที่www.nestybox.com


0

ใช่เราสามารถเรียกใช้นักเทียบท่าในนักเทียบท่าเราจะต้องแนบ unix sockeet "/var/run/docker.sock" ซึ่ง daemon ตัวรับฟังโดยค่าเริ่มต้นเป็นไดรฟ์ข้อมูลกับ parent dock โดยใช้ "-v / var / run /docker.sock:/var/run/docker.sock" บางครั้งปัญหาการอนุญาตอาจเกิดขึ้นสำหรับซ็อกเก็ต daemon ซึ่งคุณสามารถเขียน "sudo chmod 757 /var/run/docker.sock"

และมันก็จะต้องเรียกใช้นักเทียบท่าในโหมดสิทธิพิเศษดังนั้นคำสั่งจะเป็น:

sudo chmod 757 /var/run/docker.sock

ทำงานนักเทียบท่า --privileged = true -v /var/run/docker.sock:/var/run/docker.sock -it ...

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.