Perbedaan antara Menjalankan dan Memulai wadah Docker

307

Dalam praktiknya untuk memulai wadah saya lakukan:

docker run a8asd8f9asdf0

Jika demikian, apa yang terjadi:

docker start

melakukan?

Dalam manual itu tertulis

Mulai satu atau lebih kontainer yang berhenti

mskw
sumber
101
run = create + start
Fumisky Wells
4
Saya berharap OP juga memasukkan 'eksekusi'
Monica Heddneck
Mungkin bisa membantu: chat.stackoverflow.com/transcript/76919
Shubham
@MonicaHeddneck Ada buruh pelabuhan execute?
Koray Tugay
Anda menggunakan mulai dari wadah, jika Anda sebelumnya telah menghentikan wadah ini. Anda menggunakan lari ke gambar, jika Anda sebelumnya telah menghapus wadah gambar ini. Ini adalah penggunaan dasar yang saya pikir.
CodeSlave

Jawaban:

351

Ini adalah pertanyaan yang sangat penting dan jawabannya sangat sederhana, tetapi mendasar:

  1. Jalankan: buat wadah baru dari sebuah gambar, dan jalankan wadah. Anda dapat membuat klon N dari gambar yang sama. Perintahnya adalah: docker run IMAGE_ID dan tidak docker run CONTAINER_ID

masukkan deskripsi gambar di sini

  1. Mulai: Luncurkan wadah yang sebelumnya berhenti. Misalnya, jika Anda telah menghentikan database dengan perintah docker stop CONTAINER_ID, Anda dapat meluncurkan kembali wadah yang sama dengan perintah docker start CONTAINER_ID, dan data dan pengaturan akan sama.

masukkan deskripsi gambar di sini

daniele3004
sumber
1
Apakah volume perlu dibuat untuk wadah yang dihentikan agar data tetap ada?
Logan Phillips
@LoganPhillips Perbedaan siklus hidup antara file yang ditulis ke layer default filesystem union penyimpan dan file yang ditulis ke volume adalah: data layer filesystem union penyimpan selalu hilang saat melepaskan wadah ( docker rm container_id). Di sisi lain, volume data selamat dari penghapusan wadah kecuali jika -vopsi secara eksplisit diberikan pada baris perintah. Lokasi volume pada sistem host dapat diperiksa secara langsung. Lihat artikel ini
Stphane
Soal proses, perlu & di akhir runbaris perintah? Saya membutuhkannya sebagai layanan (24 jam) yang tak terhitung jumlahnya
Peter Krauss
Lalu apa tujuan dari "buruh pelabuhan membuat"? Bagaimana / kapan itu digunakan?
Joseph Gagnon
100
  • runmenjalankan gambar
  • startmemulai sebuah wadah .

The docker rundoc tidak menyebutkan:

The docker runPerintah pertama menciptakan wadah lapisan ditulisi atas gambar yang ditentukan, dan kemudian mulai menggunakan perintah yang ditentukan.

Artinya, buruh pelabuhan menjalankan setara dengan API /containers/createitu /containers/(id)/start.

Anda tidak menjalankan kontainer yang sudah ada, Anda perlu buruh pelabuhan (karena buruh pelabuhan 1.3) .
Anda dapat memulai kembali wadah yang sudah keluar .

VONC
sumber
@Tarik Anda tidak perlu menambahkan -iuntuk docker rununtuk proses interaktif? Maksud saya, buruh pelabuhan membutuhkan gambar untuk menjalankan wadah.
VonC
10
Tampaknya ada ruang bagi seseorang untuk menulis respons yang lebih rumit. Jawabannya tidak terlihat sangat jelas.
qartal
4
Pertanyaan berikutnya bagi saya adalah whats-the-difference-antara-container-and-an-image stackoverflow.com/questions/21498832/…
Alex Punnen
18

Penjelasan dengan contoh:

Anggap Anda memiliki gambar permainan (iso) di komputer Anda.

Saat Anda run(me-mount gambar Anda sebagai drive virtual), drive virtual dibuat dengan semua konten game di drive virtual dan file instalasi game diluncurkan secara otomatis. [Menjalankan gambar buruh pelabuhan Anda - membuat wadah dan kemudian memulainya.]

Tetapi ketika Anda stop(mirip dengan buruh pelabuhan berhenti) itu, drive virtual masih ada tetapi menghentikan semua proses. [Seperti wadah ada sampai tidak dihapus]

Dan ketika Anda melakukannya start(mirip dengan docker start), dari drive virtual file game memulai eksekusi. [memulai wadah yang ada]

Dalam contoh ini - Gambar permainan adalah gambar Docker Anda dan drive virtual adalah wadah Anda.

Apb
sumber
8

Jawaban daniele3004 sudah cukup bagus.

Hanya formula cepat dan kotor untuk orang-orang seperti saya yang campur aduk rundan startdari waktu ke waktu:

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

Bowen
sumber
2
Ini tidak sepenuhnya benar. Menurut dokumen resmi, "...docker run is equivalent to the API /containers/create then /containers/(id)/start.(sumber: docs.docker.com/engine/reference/commandline/run )
sshh
2

runperintah menciptakan sebuah wadah dari gambar dan kemudian memulai proses root pada wadah ini. Menjalankannya dengan run --rmbendera akan menyelamatkan Anda dari kesulitan mengeluarkan wadah mati yang tidak berguna sesudahnya dan akan memungkinkan Anda untuk mengabaikan keberadaandocker start dan docker removesekaligus.

masukkan deskripsi gambar di sini

run perintah melakukan beberapa hal berbeda:

docker run --name dname image_name bash -c "whoami"
  1. Membuat Kontainer dari gambar. Pada titik ini wadah akan memiliki id, mungkin memiliki nama jika diberikan, akan muncul didocker ps
  2. Mulai / jalankan proses root wadah. Dalam kode di atas itu akan dijalankanbash -c "whoami" . Jika seseorang berjalan docker run --name dname image_nametanpa perintah untuk menjalankan kontainer akan langsung berhenti.
  3. Setelah proses root selesai, wadah dihentikan. Pada titik ini, ini cukup berguna. Seseorang tidak dapat melakukan apa-apa lagi atau menghidupkan kembali wadah. Pada dasarnya ada 2 cara keluar dari keadaan berhenti: menghapus wadah atau membuat pos pemeriksaan (yaitu gambar) dari wadah berhenti untuk menjalankan sesuatu yang lain. Kita harus menjalankan docker removesebelum meluncurkan wadah dengan nama yang sama.

Bagaimana cara menghapus wadah setelah dihentikan secara otomatis? Tambahkan--rmbendera kerunperintah:

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

Bagaimana cara menjalankan banyak perintah dalam satu wadah? Dengan mencegah proses root dari sekarat. Ini dapat dilakukan dengan menjalankan beberapa perintah yang tidak berguna di mulai dengan--detachedflag dan kemudian menggunakan "eksekusi" untuk menjalankan perintah yang sebenarnya:

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'"

Mengapa kita membutuhkannya docker stop? Untuk menghentikan wadah yang tersisa yang kami luncurkan di cuplikan sebelumnya dengan perintah tanpa akhirtail -f /dev/null.

y.selivonchyk
sumber