Docker menjalankan vs membuat

93

Apa perbedaan antara Perintah docker rundan docker create?

Saya biasanya menggunakan runtetapi terkadang dalam dokumentasi yang saya lihat create.

Docker --helpmemberi tahu

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

Apakah itu berarti itu rundigunakan ketika kita perlu meneruskan perintah ke penampung baru? Lalu apa tujuannya create?

Fred Mériot
sumber

Jawaban:

105

Dari dokumentasi buruh pelabuhan

Perintah pembuatan buruh pelabuhan membuat lapisan penampung yang dapat ditulisi di atas gambar yang ditentukan dan mempersiapkannya untuk menjalankan perintah yang ditentukan. ID kontainer kemudian dicetak ke STDOUT. Ini mirip dengan docker run -d kecuali container tidak pernah dimulai . Anda kemudian dapat menggunakan perintah docker start untuk memulai penampung kapan saja.

Hal ini berguna ketika Anda ingin mendirikan sebuah wadah konfigurasi depan waktu sehingga siap untuk memulai ketika Anda membutuhkannya. Status awal penampung baru dibuat.

DAXaholic
sumber
2
Menekankan kesamaan, --run menerima SEMUA argumen yang sama dengan --create (dengan tambahan just --detach, --detach-keys, dan --sig-proxy), lihat docs.docker.com/v17.09 / engine / reference / commandline / run /…
Marvin
118

Secara teknis, docker run= docker create+ docker start.

sriram926
sumber
43
Sebenarnya, dan saya hanya menghabiskan beberapa jam mempelajari ini, docker run= docker create+ docker start+ docker attach. Tanpa attach, penampung yang dimulai berjalan di latar belakang
webbower
19

docker createperintah membuat wadah yang dapat ditulisi dari gambar dan mempersiapkannya untuk dijalankan .

docker runperintah membuat wadah (sama seperti docker create) dan memulainya .

NetworkMeister
sumber
1
U menulis "buruh pelabuhan membuat penampung (sama seperti buruh pelabuhan membuat) dan menjalankannya." <--- definisi melingkar, dan Anda belum menetapkan perbedaan antara exec dan start, dan apa yang Anda sebut sebagai "menjalankannya". (Dan ketika Anda mengatakan "menjalankannya" jika kita melihat definisi Anda tentang run in docker run, itu berarti membuat dan menjalankan, jadi Anda akan berakhir dengan jumlah tak terbatas .. jadi mungkin maksud Anda kurang dari itu ketika Anda mengatakan "menjalankannya" .. tetapi Anda harus membedakan "menjalankan" dari exec dan start, maksud Anda mulai dan exec atau hanya mulai). Mungkin -d berarti mulai tanpa eksekutif. dan tanpa -d mulai dan exec
barlop
8

Jawaban lain telah mencakup ini, tetapi saya pikir saya akan menunjukkan baris perintah shell yang setara karena membuatnya sangat jelas:

$ docker run myimage

sama dengan

$ docker start -a $(docker create myimage)

Di sini, docker createdigunakan untuk membuat wadah dari gambar bernama dan mengeluarkan id wadah yang dibuat dan docker startdigunakan untuk memulai wadah dengan id itu. The -apilihan menyebabkan terminal untuk melampirkan sehingga wadah berjalan di latar depan yang merupakan perilaku default docker run.

Penampung yang telah dibuat tetapi tidak pernah dimulai akan memiliki Createdstatus; ini bisa dilihat dengan docker container ls -a.

starfry
sumber
6

Saya baru mengenal buruh pelabuhan dan baru saja bermain dengannya;

Saya ambil adalah bahwa buruh pelabuhan menjalankan dasarnya melakukan hal berikut: (dalam urutan ..) docker membuat , buruh pelabuhan awal , buruh pelabuhan melampirkan , karena segera menempel ke shell aktif setelah Anda melakukan 'run' perintah.

aaronlhe
sumber
1
Baru saja memposting komentar di atas tentang ini sebelum saya melihat jawaban Anda. Saya berharap saya telah melihat ini sekitar satu jam yang lalu.
webbower
-3

Docker run pada dasarnya untuk menjalankan perintah di dalam container.

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

Di atas adalah untuk membuat terminal bash. Dan buat kami menggunakan perintah bash di container.

Pembuatan Docker adalah membuat kontainer dari Gambar Docker.

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

Di atas adalah untuk membuat buruh pelabuhan sebuah wadah dengan nama "docker-ubuntu" dari gambar "ubuntu"

Venkat Sudharsanam
sumber
1
Anda dapat melakukannya docker run -it <Container name>tanpa melakukan / bin / bash. Misalnya ruby ​​akan menjalankan secara otomatis sebuah executable bernama irb. Juga, Anda dapat melakukan run -d, yang dilakukan dengan dockersamples / static-site yang tidak masuk. Jadi saya pikir itu tidak melakukan exec tetapi itu hanya memulainya.
barlop
dengan 'docker run' Anda dapat menjalankan jika container sudah dibuat dan membuat kemudian dijalankan jika tidak
Sergii Getman