นักเทียบท่าวิ่งกับสร้าง


93

ความแตกต่างระหว่างdocker runและdocker createคำสั่งคืออะไร?

ผมมักจะใช้แต่บางครั้งในเอกสารที่ฉันเห็นruncreate

นักเทียบท่า--helpบอก

create    Create a new container
run       Run a command in a new container

หมายความว่าrunใช้เมื่อเราต้องการส่งคำสั่งไปยังคอนเทนเนอร์ใหม่หรือไม่? แล้วจุดมุ่งหมายcreateคืออะไร?

คำตอบ:


105

จากเอกสารนักเทียบท่า

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

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


2
เน้นความคล้ายคลึงกัน --run ยอมรับอาร์กิวเมนต์เดียวกับ - สร้าง (ด้วยการเพิ่มเพียง --detach, --detach-keys และ --sig-proxy) โปรดดูdocs.docker.com/v17.09 / engine / reference / commandline / run / …
Marvin

118

เทคนิคdocker run= +docker createdocker start


43
ที่จริงและฉันเพียงแค่ใช้เวลาสองสามชั่วโมงการเรียนรู้นี้docker run= docker create+ +docker start docker attachหากไม่มีattachคอนเทนเนอร์เริ่มต้นจะทำงานในพื้นหลัง
webbower

19

docker createคำสั่งสร้างภาชนะเขียนได้จากภาพและเตรียมความพร้อมสำหรับการทำงาน

docker runคำสั่งสร้างภาชนะ (เหมือนdocker create) และเริ่มต้นมัน


1
คุณเขียนว่า "นักเทียบท่าวิ่งสร้างคอนเทนเนอร์ (เหมือนกับนักเทียบท่าสร้าง) และเรียกใช้" <--- คำจำกัดความแบบวงกลมและคุณยังไม่ได้กำหนดความแตกต่างระหว่าง exec และ start และสิ่งที่คุณเรียกว่า "run it" (และเมื่อคุณพูดว่า "วิ่ง" ถ้าเราดูคำจำกัดความของคุณในการวิ่งในท่าเทียบเรือนั่นหมายถึงสร้างและเรียกใช้ดังนั้นคุณจะลงเอยด้วยจำนวนอนันต์ .. ดังนั้นคุณอาจหมายถึงสิ่งที่น้อยกว่านั้นเมื่อคุณพูด "run it" .. แต่คุณควรแยกแยะ "run it" จาก exec และ start คุณหมายถึง start and exec หรือ just start) บางที -d หมายถึงเริ่มไม่มีผู้บริหาร และไม่มี -d จะเริ่มและดำเนินการ
barlop

8

คำตอบอื่น ๆ ครอบคลุมสิ่งนี้ แต่ฉันคิดว่าฉันจะแสดงบรรทัดคำสั่งเชลล์ที่เทียบเท่าเพราะมันทำให้ชัดเจนจริงๆ:

$ docker run myimage

เหมือนกับ

$ docker start -a $(docker create myimage)

ที่นี่docker createใช้เพื่อสร้างคอนเทนเนอร์จากอิมเมจที่ตั้งชื่อและส่งออกรหัสคอนเทนเนอร์ที่สร้างขึ้นและdocker startใช้เพื่อเริ่มคอนเทนเนอร์ด้วย id นั้น ตัวเลือกที่ทำให้เกิดขั้วที่จะแนบเพื่อให้วิ่งภาชนะในเบื้องหน้าซึ่งเป็นพฤติกรรมที่เริ่มต้นของ-adocker run

คอนเทนเนอร์ที่สร้างขึ้น แต่ไม่เคยเริ่มต้นจะมีCreatedสถานะ docker container ls -aนี้สามารถมองเห็นได้ด้วย


6

ฉันยังใหม่กับนักเทียบท่าและเพิ่งเริ่มเล่นกับมัน

สิ่งที่ฉันทำคือนักเทียบท่าทำงานโดยพื้นฐานแล้วจะทำสิ่งต่อไปนี้: (ตามลำดับของ .. ) สร้างนักเทียบท่า , นักเทียบท่าเริ่มต้น , นักเทียบท่าแนบเนื่องจากมันจะเชื่อมต่อกับเชลล์ที่ใช้งานอยู่ทันทีหลังจากที่คุณทำคำสั่ง'วิ่ง'


1
เพิ่งโพสต์ความคิดเห็นด้านบนเกี่ยวกับเรื่องนี้ก่อนที่ฉันจะสังเกตเห็นคำตอบของคุณ ฉันหวังว่าฉันจะได้เห็นสิ่งนี้สักชั่วโมงก่อน
webbower

-3

Docker runเป็นพื้นฐานสำหรับการรันคำสั่งในคอนเทนเนอร์

docker run -it <Container Name> /bin/bash

ด้านบนใช้สำหรับสร้าง bash terminal และทำให้เราใช้คำสั่ง bash ในคอนเทนเนอร์

Docker createคือการสร้างคอนเทนเนอร์จาก Docker Image

docker create -d /var/lib:/var/lib --name docker-ubuntu ubuntu

ข้างบนนี้คือการสร้าง docker โดยใช้ container ชื่อ "docker-ubuntu" จากอิมเมจ "ubuntu"


1
คุณสามารถทำได้docker run -it <Container name>โดยไม่ต้องทำ / bin / bash ตัวอย่างเช่นทับทิมจะเรียกใช้ไฟล์ปฏิบัติการที่เรียกว่า irb โดยอัตโนมัติ นอกจากนี้คุณสามารถรัน -d ซึ่งทำได้ด้วย dockersamples / static-site ที่ไม่ได้ล็อกออน ดังนั้นฉันคิดว่ามันไม่ได้ทำ exec แต่มันเพิ่งเริ่มต้น
barlop

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