จะผลักดัน Docker Compose stack ไปยัง Docker Swarm โดยไม่ต้องอัพโหลดคอนเทนเนอร์ไปยังรีจิสตรีได้อย่างไร

ฉันได้ค้นคว้าข้อมูลก่อนที่จะถามที่นี่ แต่คำตอบทั้งหมดทำให้ฉันได้ข้อสรุปเดียวกัน:

  1. สร้างสแต็ก Docker Compose ของคุณภายในเครื่อง
  2. แท็กและพุชรูปภาพไปที่รีจิสตรี (ไม่ว่าจะเป็นแบบส่วนตัวหรือแบบสาธารณะเช่น Docker Hub)
  3. ดันสแต็คไปที่ฝูงโดยใช้ docker stack deploy --compose-file docker-compose.yml stackdemo
  4. จากที่นี่ สแต็กจะหยิบและ "ดึง" รูปภาพจากรีจิสทรีและเรียกใช้คอนเทนเนอร์

ไม่มีวิธีที่ตรงไปตรงมาในการทำให้สถานการณ์ต่อไปนี้ (ฉันคิดว่าสามัญสำนึก) ทำงานได้อย่างราบรื่นหรือไม่

  1. Docker swarm manager มีสิทธิ์เข้าถึง (คีย์ SSH) เพื่อดึงโปรเจ็กต์จาก Git
  2. มันจะดึงโปรเจ็กต์เป็นระยะและสร้าง "ในเครื่อง" โดยใช้ docker-compose up
  3. เมื่อการสร้างสำเร็จ (คอนเทนเนอร์พร้อมแล้ว) มันจะผลักสแต็กไปที่ฝูงโดยใช้ docker stack deploy เพื่อเผยแพร่อิมเมจไปยังโหนดของผู้ปฏิบัติงานทั้งหมด
  4. ด้วยวิธีนี้ เฉพาะ "ซอร์สโค้ด" ดั้งเดิมเท่านั้นที่รู้จักโดยโหนดผู้จัดการ และมีเพียงเท่านั้นที่สามารถเข้าถึงที่เก็บ Git ได้โดยตรง

การดูแลรักษารีจิสทรี (หรือการชำระเงินสำหรับคลาวด์) ดูเหมือนจะเป็นข้อเสียอย่างมากสำหรับการใช้ Docker ในโหมด Swarm

หมายเหตุด้านข้าง: ฉันได้ลองใช้แนวทางของ ปรับใช้รีจิสทรีเป็นบริการภายในสแต็ก และการแท็ก + พุชอิมเมจไปที่ 127.0.0.1/myimage แต่นั่นนำไปสู่ปัญหาชุดอื่นของตัวเอง - เช่น ความจริงที่ว่าโหนดของผู้ปฏิบัติงานที่ไม่มีอินสแตนซ์ของคอนเทนเนอร์ Registry ทำงานอยู่นั้นไม่มีสิทธิ์เข้าถึงเพื่อดึงอิมเมจ (จำเป็นต้องจำลองรีจิสทรีไปยังโหนดทั้งหมด)


person Dzhuneyt    schedule 07.03.2019    source แหล่งที่มา


คำตอบ (2)


ใช้นักเทียบท่า บันทึก และนักเทียบท่า โหลด คำสั่งเพื่อถ่ายโอนรูปภาพจากเครื่อง dev ของคุณไปยังเครื่อง swarm ทั้งหมดของคุณ

person herm    schedule 07.03.2019

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

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

การเริ่มต้นรีจิสทรี (อย่างน้อยบน localhost) นั้นง่ายมาก - แต่นั่นไม่ใช่คำถามของคุณ

เมื่อมาถึงคำถามของคุณ คุณสามารถเก็บไฟล์ compose stack ไว้ในไดเร็กทอรีเดียวกับที่คุณมี Dockerfile จากนั้นในไฟล์เขียน stack คุณสามารถเขียนบริการซึ่งจะได้รับ build เมื่อคุณปรับใช้ stack:

version: "3.9"

services:
  web:
    image: 127.0.0.1:5000/stackdemo
    build: .
    ports:
      - "8000:8000"

ที่นี่,

build: .

บรรทัดนี้สร้างอิมเมจด้วยการแท็กชื่อที่กำหนดให้กับรีจิสตรีบน localhost - แต่ไม่ได้ถูกผลักซึ่งต้องทำด้วยตนเอง ดังนั้นใน Dockerfile คุณสามารถเขียน git pull หรือ git clone แล้วรันคำสั่งเพื่อสร้างโค้ดของคุณและอื่นๆ

นี่คือลิงก์ที่ให้ขั้นตอนง่ายๆ ในการเริ่มต้นรีจิสทรีและสร้างอิมเมจได้ทันทีขณะปรับใช้สแต็ก: https://docs.docker.com/engine/swarm/stack-deploy/

นอกจากนี้ swarm จะไม่ทำงานหากไม่มีรีจิสทรี & ดังนั้นจึงเป็นไปไม่ได้ที่จะบันทึก & โหลดรูปภาพ & ใช้กับ swarm orchestration

person Saurabhcdt    schedule 12.05.2021