ความแตกต่างระหว่างการใช้งานและการเริ่มคอนเทนเนอร์นักเทียบท่า


307

ในทางปฏิบัติเพื่อเริ่มภาชนะฉันจะ:

docker run a8asd8f9asdf0

หากเป็นเช่นนั้นจะเกิดอะไรขึ้น:

docker start

ทำ?

ในคู่มือบอกว่า

เริ่มคอนเทนเนอร์ที่หยุดทำงานตั้งแต่หนึ่งรายการขึ้นไป


101
run = create + start
Fumisky Wells

4
ฉันหวังว่า OP ได้รวม 'execute' ด้วย
Monica Heddneck

อาจเป็นประโยชน์: chat.stackoverflow.com/transcript/76919
Shubham

@MonicaHeddneck มีนักเทียบท่าexecuteไหม?
Koray Tugay

คุณใช้การเริ่มต้นไปยังคอนเทนเนอร์ถ้าก่อนหน้านี้คุณได้หยุดคอนเทนเนอร์นี้ คุณใช้การเรียกใช้ไปยังรูปภาพถ้าคุณ ealier ได้ลบคอนเทนเนอร์ของรูปนี้ นี่คือการใช้งานพื้นฐานที่ฉันคิดว่า
CodeSlave

คำตอบ:


350

นี่เป็นคำถามที่สำคัญมากและคำตอบนั้นง่ายมาก แต่เป็นพื้นฐาน:

  1. เรียกใช้: สร้างคอนเทนเนอร์ใหม่ของรูปภาพและเรียกใช้คอนเทนเนอร์ คุณสามารถสร้าง N โคลนของภาพเดียวกัน คำสั่งคือ: docker run IMAGE_ID และไม่ docker run CONTAINER_ID

ป้อนคำอธิบายรูปภาพที่นี่

  1. เริ่ม: เรียกใช้คอนเทนเนอร์ที่หยุดก่อนหน้านี้ ตัวอย่างเช่นถ้าคุณหยุดฐานข้อมูลด้วยคำสั่งdocker stop CONTAINER_IDคุณสามารถเรียกคืนคอนเทนเนอร์เดียวกันด้วยคำสั่งdocker start CONTAINER_IDและข้อมูลและการตั้งค่าจะเหมือนกัน

ป้อนคำอธิบายรูปภาพที่นี่


1
ต้องสร้างโวลุ่มสำหรับคอนเทนเนอร์ที่หยุดทำงานเพื่อให้ข้อมูลคงอยู่หรือไม่?
โลแกนฟิลลิปส์

@LoganPhillips ความแตกต่างระหว่างวัฏจักรของไฟล์ที่เขียนไปยังเลเยอร์ระบบไฟล์สหภาพเริ่มต้นของคอนเทนเนอร์และไฟล์ที่เขียนไปยังไดรฟ์คือ: ข้อมูลเลเยอร์ระบบไฟล์สหภาพของคอนเทนเนอร์จะหายไปเสมอเมื่อลบคอนเทนเนอร์ ( docker rm container_id) ในทางกลับกันข้อมูลปริมาณอยู่รอดการลบของคอนเทนเนอร์เว้นแต่-vจะมีการระบุตัวเลือกในบรรทัดคำสั่ง สามารถตรวจสอบตำแหน่งปริมาณบนระบบโฮสต์ได้โดยตรง ดูบทความนี้
Stphane

เกี่ยวกับกระบวนการต้องการ& ที่ส่วนท้ายของrunบรรทัดคำสั่งหรือไม่ ฉันต้องการมันเป็นบริการ (24 ชั่วโมง) ที่โดดเด่น
Peter Krauss

ดังนั้นวัตถุประสงค์ของ "นักสร้างสร้าง" คืออะไร? จะใช้อย่างไร / เมื่อไหร่?
โจเซฟแก็กนอน

100
  • runเรียกใช้ภาพ
  • startเริ่มภาชนะ

docker rundocไม่เอ่ยถึง:

docker runคำสั่งแรกสร้างชั้นภาชนะเขียนได้มากกว่าภาพที่ระบุและจากนั้นจะเริ่มต้นได้โดยใช้คำสั่งที่ระบุ

นั่นคือนักเทียบท่าวิ่งเทียบเท่ากับ API แล้ว/containers/create/containers/(id)/start

คุณไม่ได้เรียกใช้ภาชนะที่มีอยู่คุณนักเทียบท่า exec ไป (ตั้งแต่นักเทียบท่า 1.3)
คุณสามารถเริ่มต้นใหม่ที่เก็บออก


@Tarik คุณไม่จำเป็นต้องเพิ่ม-iการdocker runสำหรับกระบวนการโต้ตอบหรือไม่? ฉันหมายถึงการทำงานของนักเทียบท่าต้องการภาพเพื่อเรียกใช้ภาชนะ
VonC

10
ดูเหมือนว่าจะมีห้องสำหรับคนที่จะเขียนคำตอบที่ซับซ้อนมากขึ้น คำตอบนั้นดูไม่ชัดเจนนัก
qartal

4
คำถามต่อไปสำหรับฉันเป็นอะไรที่แตกต่างระหว่าง-a-ภาชนะและใช้ภาพ stackoverflow.com/questions/21498832/...
อเล็กซ์ Punnen

18

คำอธิบายพร้อมตัวอย่าง:

พิจารณาว่าคุณมีรูปเกม (iso) ในคอมพิวเตอร์ของคุณ

เมื่อคุณrun(เมานต์อิมเมจของคุณเป็นไดรฟ์เสมือน) ไดรฟ์เสมือนจะถูกสร้างขึ้นพร้อมเนื้อหาเกมทั้งหมดในไดรฟ์เสมือนและไฟล์การติดตั้งเกมจะเปิดขึ้นโดยอัตโนมัติ [ใช้ภาพนักเทียบท่าของคุณ - สร้างภาชนะแล้วเริ่มต้น]

แต่เมื่อคุณstop(คล้ายกับ docker stop) ไดร์ฟเสมือนจะยังคงมีอยู่ แต่หยุดกระบวนการทั้งหมด [เนื่องจากที่เก็บมีอยู่จนกว่าจะไม่ถูกลบ]

และเมื่อคุณทำstart(คล้ายกับจุดเริ่มต้นของนักเทียบท่า) จากไดรฟ์เสมือนไฟล์เกมจะเริ่มทำงาน [เริ่มภาชนะที่มีอยู่]

ในตัวอย่างนี้ - รูปเกมเป็นอิมเมจ Docker ของคุณและไดรฟ์เสมือนเป็นที่เก็บข้อมูลของคุณ


8

คำตอบของdaniele3004ค่อนข้างดีอยู่แล้ว

เพียงรวดเร็วและสกปรกสูตรสำหรับคนอย่างผมที่ผสมขึ้นrunและstartเมื่อเวลาผ่านไป:

docker run [...]= docker pull [...]+docker start [...]


2
สิ่งนี้ไม่เป็นความจริงเลย ตามเอกสารอย่างเป็นทางการ"...docker run is equivalent to the API /containers/create then /containers/(id)/start.(ที่มา: docs.docker.com/engine/reference/commandline/run )
sshh

2

runคำสั่งสร้างคอนเทนเนอร์จากอิมเมจจากนั้นเริ่มต้นกระบวนการรูทบนคอนเทนเนอร์นี้ การรันด้วยการrun --rmตั้งค่าสถานะจะช่วยให้คุณประหยัดปัญหาในการลบที่เก็บไร้ประโยชน์ที่ตายแล้วในภายหลังและจะช่วยให้คุณสามารถละเว้นการมีอยู่ของdocker startและdocker removeโดยสิ้นเชิง

ป้อนคำอธิบายรูปภาพที่นี่

run คำสั่งทำบางสิ่งที่แตกต่าง:

docker run --name dname image_name bash -c "whoami"
  1. สร้างคอนเทนเนอร์จากรูปภาพ ณ จุดนี้คอนเทนเนอร์จะมี id อาจมีชื่อถ้ามีใครจะปรากฏขึ้นdocker ps
  2. เริ่ม / เรียกใช้กระบวนการรูทของคอนเทนเนอร์ bash -c "whoami"ในโค้ดข้างต้นที่จะดำเนินการ หากหนึ่งรันdocker run --name dname image_nameโดยไม่มีคำสั่งเพื่อดำเนินการคอนเทนเนอร์จะเข้าสู่สถานะหยุดทันที
  3. เมื่อกระบวนการรูทสิ้นสุดลงคอนเทนเนอร์จะหยุดทำงาน ณ จุดนี้มันไร้ประโยชน์มากทีเดียว หนึ่งไม่สามารถดำเนินการอะไรอีกต่อไปหรือคืนชีพภาชนะ โดยทั่วไปมี 2 วิธีในการหยุดสถานะ: ลบคอนเทนเนอร์หรือสร้างจุดตรวจ (เช่นรูปภาพ) ออกจากคอนเทนเนอร์ที่หยุดทำงานเพื่อทำงานอย่างอื่น หนึ่งจะต้องเรียกใช้docker removeก่อนที่จะเปิดตัวภาชนะภายใต้ชื่อเดียวกัน

จะลบคอนเทนเนอร์ได้อย่างไรเมื่อมันถูกหยุดโดยอัตโนมัติ เพิ่มการ--rmตั้งค่าสถานะให้กับrunคำสั่ง:

docker run --rm --name dname image_name bash -c "whoami"

วิธีการดำเนินการหลายคำสั่งในที่เก็บเดียว? โดยป้องกันไม่ให้กระบวนการรูตนั้นกำลังจะตาย สิ่งนี้สามารถทำได้โดยการรันคำสั่งที่ไม่มีประโยชน์เมื่อเริ่มต้นด้วย--detachedแฟล็กจากนั้นใช้ "execute" เพื่อรันคำสั่งจริง:

docker run --rm -d --name dname image_name tail -f /dev/null
docker exec dname bash -c "whoami"
docker exec dname bash -c "echo 'Nnice'"

ทำไมเราต้องdocker stopแล้ว? tail -f /dev/nullที่จะหยุดนี้ภาชนะที่เอ้อระเหยที่เราเปิดตัวในตัวอย่างก่อนหน้านี้มีคำสั่งที่ไม่มีที่สิ้นสุด

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