ในทางปฏิบัติเพื่อเริ่มภาชนะฉันจะ:
docker run a8asd8f9asdf0
หากเป็นเช่นนั้นจะเกิดอะไรขึ้น:
docker start
ทำ?
ในคู่มือบอกว่า
เริ่มคอนเทนเนอร์ที่หยุดทำงานตั้งแต่หนึ่งรายการขึ้นไป
executeไหม?
ในทางปฏิบัติเพื่อเริ่มภาชนะฉันจะ:
docker run a8asd8f9asdf0
หากเป็นเช่นนั้นจะเกิดอะไรขึ้น:
docker start
ทำ?
ในคู่มือบอกว่า
เริ่มคอนเทนเนอร์ที่หยุดทำงานตั้งแต่หนึ่งรายการขึ้นไป
executeไหม?
คำตอบ:
นี่เป็นคำถามที่สำคัญมากและคำตอบนั้นง่ายมาก แต่เป็นพื้นฐาน:
docker run IMAGE_ID และไม่ docker run CONTAINER_IDdocker stop CONTAINER_IDคุณสามารถเรียกคืนคอนเทนเนอร์เดียวกันด้วยคำสั่งdocker start CONTAINER_IDและข้อมูลและการตั้งค่าจะเหมือนกันdocker rm container_id) ในทางกลับกันข้อมูลปริมาณอยู่รอดการลบของคอนเทนเนอร์เว้นแต่-vจะมีการระบุตัวเลือกในบรรทัดคำสั่ง สามารถตรวจสอบตำแหน่งปริมาณบนระบบโฮสต์ได้โดยตรง ดูบทความนี้
& ที่ส่วนท้ายของrunบรรทัดคำสั่งหรือไม่ ฉันต้องการมันเป็นบริการ (24 ชั่วโมง) ที่โดดเด่น
runเรียกใช้ภาพstartเริ่มภาชนะdocker rundocไม่เอ่ยถึง:
docker runคำสั่งแรกสร้างชั้นภาชนะเขียนได้มากกว่าภาพที่ระบุและจากนั้นจะเริ่มต้นได้โดยใช้คำสั่งที่ระบุนั่นคือนักเทียบท่าวิ่งเทียบเท่ากับ API แล้ว
/containers/create/containers/(id)/start
คุณไม่ได้เรียกใช้ภาชนะที่มีอยู่คุณนักเทียบท่า exec ไป (ตั้งแต่นักเทียบท่า 1.3)
คุณสามารถเริ่มต้นใหม่ที่เก็บออก
-iการdocker runสำหรับกระบวนการโต้ตอบหรือไม่? ฉันหมายถึงการทำงานของนักเทียบท่าต้องการภาพเพื่อเรียกใช้ภาชนะ
คำอธิบายพร้อมตัวอย่าง:
พิจารณาว่าคุณมีรูปเกม (iso) ในคอมพิวเตอร์ของคุณ
เมื่อคุณrun(เมานต์อิมเมจของคุณเป็นไดรฟ์เสมือน) ไดรฟ์เสมือนจะถูกสร้างขึ้นพร้อมเนื้อหาเกมทั้งหมดในไดรฟ์เสมือนและไฟล์การติดตั้งเกมจะเปิดขึ้นโดยอัตโนมัติ [ใช้ภาพนักเทียบท่าของคุณ - สร้างภาชนะแล้วเริ่มต้น]
แต่เมื่อคุณstop(คล้ายกับ docker stop) ไดร์ฟเสมือนจะยังคงมีอยู่ แต่หยุดกระบวนการทั้งหมด [เนื่องจากที่เก็บมีอยู่จนกว่าจะไม่ถูกลบ]
และเมื่อคุณทำstart(คล้ายกับจุดเริ่มต้นของนักเทียบท่า) จากไดรฟ์เสมือนไฟล์เกมจะเริ่มทำงาน [เริ่มภาชนะที่มีอยู่]
ในตัวอย่างนี้ - รูปเกมเป็นอิมเมจ Docker ของคุณและไดรฟ์เสมือนเป็นที่เก็บข้อมูลของคุณ
คำตอบของdaniele3004ค่อนข้างดีอยู่แล้ว
เพียงรวดเร็วและสกปรกสูตรสำหรับคนอย่างผมที่ผสมขึ้นrunและstartเมื่อเวลาผ่านไป:
docker run [...]= docker pull [...]+docker start [...]
"...docker run is equivalent to the API /containers/create then /containers/(id)/start.(ที่มา: docs.docker.com/engine/reference/commandline/run )
runคำสั่งสร้างคอนเทนเนอร์จากอิมเมจจากนั้นเริ่มต้นกระบวนการรูทบนคอนเทนเนอร์นี้ การรันด้วยการrun --rmตั้งค่าสถานะจะช่วยให้คุณประหยัดปัญหาในการลบที่เก็บไร้ประโยชน์ที่ตายแล้วในภายหลังและจะช่วยให้คุณสามารถละเว้นการมีอยู่ของdocker startและdocker removeโดยสิ้นเชิง
run คำสั่งทำบางสิ่งที่แตกต่าง:
docker run --name dname image_name bash -c "whoami"
docker psbash -c "whoami"ในโค้ดข้างต้นที่จะดำเนินการ หากหนึ่งรันdocker run --name dname image_nameโดยไม่มีคำสั่งเพื่อดำเนินการคอนเทนเนอร์จะเข้าสู่สถานะหยุดทันที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ที่จะหยุดนี้ภาชนะที่เอ้อระเหยที่เราเปิดตัวในตัวอย่างก่อนหน้านี้มีคำสั่งที่ไม่มีที่สิ้นสุด