ในทางปฏิบัติเพื่อเริ่มภาชนะฉันจะ:
docker run a8asd8f9asdf0
หากเป็นเช่นนั้นจะเกิดอะไรขึ้น:
docker start
ทำ?
ในคู่มือบอกว่า
เริ่มคอนเทนเนอร์ที่หยุดทำงานตั้งแต่หนึ่งรายการขึ้นไป
execute
ไหม?
ในทางปฏิบัติเพื่อเริ่มภาชนะฉันจะ:
docker run a8asd8f9asdf0
หากเป็นเช่นนั้นจะเกิดอะไรขึ้น:
docker start
ทำ?
ในคู่มือบอกว่า
เริ่มคอนเทนเนอร์ที่หยุดทำงานตั้งแต่หนึ่งรายการขึ้นไป
execute
ไหม?
คำตอบ:
นี่เป็นคำถามที่สำคัญมากและคำตอบนั้นง่ายมาก แต่เป็นพื้นฐาน:
docker run IMAGE_ID
และไม่ docker run CONTAINER_ID
docker stop CONTAINER_ID
คุณสามารถเรียกคืนคอนเทนเนอร์เดียวกันด้วยคำสั่งdocker start CONTAINER_ID
และข้อมูลและการตั้งค่าจะเหมือนกันdocker rm container_id
) ในทางกลับกันข้อมูลปริมาณอยู่รอดการลบของคอนเทนเนอร์เว้นแต่-v
จะมีการระบุตัวเลือกในบรรทัดคำสั่ง สามารถตรวจสอบตำแหน่งปริมาณบนระบบโฮสต์ได้โดยตรง ดูบทความนี้
&
ที่ส่วนท้ายของrun
บรรทัดคำสั่งหรือไม่ ฉันต้องการมันเป็นบริการ (24 ชั่วโมง) ที่โดดเด่น
run
เรียกใช้ภาพstart
เริ่มภาชนะdocker run
docไม่เอ่ยถึง:
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 ps
bash -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
ที่จะหยุดนี้ภาชนะที่เอ้อระเหยที่เราเปิดตัวในตัวอย่างก่อนหน้านี้มีคำสั่งที่ไม่มีที่สิ้นสุด