perbedaan antara buruh pelabuhan melampirkan dan buruh pelabuhan exec

Keduanya akan dapat menjalankan perintah dalam container. Keduanya bisa melepaskan wadahnya.

Jadi apa perbedaan nyata antara docker exec dan docker lampirkan?


person MJL    schedule 21.06.2015    source sumber


Jawaban (4)


Ada commit PR yang ditambahkan ke dokumen:

Catatan: Perintah ini (attach) bukan untuk menjalankan proses baru dalam sebuah container. Lihat: docker exec.

Jawaban untuk "Docker. Bagaimana cara memasukkan bash\ssh ke dalam container yang dijalankan (run -d)?" menggambarkan perbedaannya:

(buruh pelabuhan >= 1.3) Jika kita menggunakan docker attach, kita bisa gunakan hanya satu instance shell.
Jadi jika kita ingin membuka terminal baru dengan instance shell container yang baru, kita hanya perlu menjalankan docker exec

jika container buruh pelabuhan dimulai menggunakan perintah /bin/bash, Anda dapat mengaksesnya menggunakan lampirkan, jika tidak maka Anda perlu menjalankan perintah untuk membuat instance bash di dalam container menggunakan exec.

Seperti yang disebutkan dalam masalah ini:

  • Lampirkan bukan untuk menjalankan hal tambahan dalam wadah, ini untuk melampirkan ke proses yang sedang berjalan.
  • "docker exec" khusus untuk menjalankan hal-hal baru dalam wadah yang sudah dimulai, baik itu shell atau proses lainnya.

Masalah yang sama menambahkan:

Meskipun attach tidak diberi nama dengan baik, terutama karena perintah LXC lxc-attach (yang lebih mirip docker exec <container> /bin/sh, tetapi spesifik untuk LXC), ia memiliki tujuan khusus untuk menghubungkan Anda dengan proses yang dimulai Docker.
Tergantung pada bagaimana prosesnya, perilakunya mungkin berbeda, misalnya melampirkan ke /bin/bash akan memberi Anda shell, tetapi melampirkan ke server redis akan seperti Anda baru saja memulai redis secara langsung tanpa melakukan daemonisasi.

person VonC    schedule 21.06.2015

Ketika sebuah container mulai menggunakan /bin/bash maka container tersebut menjadi PID 1 dan docker attachment digunakan untuk masuk ke dalam PID 1 dari sebuah container. Jadi buruh pelabuhan melampirkan ‹ container-id > akan membawa Anda ke dalam terminal bash karena PID 1 seperti yang kami sebutkan saat memulai wadah. Keluar dari wadah akan menghentikan wadah tersebut.

Sedangkan pada perintah docker exec Anda dapat menentukan shell mana yang ingin Anda masukkan. Ini tidak akan membawa Anda ke PID 1 kontainer. Ini akan membuat proses baru untuk bash. buruh pelabuhan exec -it ‹ container-id > bash. Keluar dari wadah tidak akan menghentikan wadah tersebut.

Anda juga dapat menggunakan nsenter untuk masuk ke dalam wadah. nsenter -m -u -n -p -i -t ‹ pid container > Anda dapat menemukan PID container menggunakan: docker check ‹ container-id > | ambil PID

Catatan: Jika Anda telah memulai penampung dengan tanda -d maka keluar dari penampung tidak akan menghentikan penampung, baik Anda menggunakan lampiran atau exec untuk masuk ke dalam.

person Samrat Priyadarshi    schedule 09.05.2017
comment
Ide menarik tentang penggunaan nsenter. Bisakah Anda menjelaskannya lebih lanjut? Menjelaskan pilihannya akan dilakukan secara berurutan. Mengapa tidak memasukkan semua namespace? Mengapa yang khusus ini? - person x-yuri; 29.06.2019

Seperti yang dinyatakan Michael Sun dalam jawabannya

docker exec menjalankan perintah baru/membuat proses baru di lingkungan container, sementara docker attach hanya menghubungkan input/output/kesalahan standar dari proses utama (dengan PID 1) di dalam container ke input/output/kesalahan standar yang sesuai dari terminal saat ini ( terminal yang Anda gunakan untuk menjalankan perintah).

Jawaban saya akan lebih fokus untuk memungkinkan Anda memvalidasi pernyataan di atas dan memahaminya dengan lebih jelas.

Buka jendela terminal dan jalankan perintah docker run -itd --name busybox busybox /bin/sh. Perintah tersebut akan menarik gambar busybox jika belum ada. Kemudian akan membuat wadah dengan nama busybox menggunakan gambar ini.

Anda dapat memeriksa status container Anda dengan menjalankan perintah docker ps -a | grep busybox.

Jika Anda menjalankan docker top busybox, Anda akan melihat keluaran seperti ini.

UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                7469                7451                0                   11:40               pts/0               00:00:00            /bin/sh

Tentu saja, nilai PID, PPID dan lainnya akan berbeda dalam kasus Anda. Anda juga dapat menggunakan alat dan utilitas lain seperti pstree, top, htop untuk melihat daftar PID dan PPID.

PID dan PPID berarti id proses dan id proses induk. Prosesnya dimulai saat kita membuat dan memulai container kita dengan perintah /bin/sh. Sekarang, jalankan perintah docker attach busybox. Ini akan melampirkan aliran input/output/kesalahan standar dari container ke terminal Anda.

Setelah memasang container, buat sesi shell dengan menjalankan perintah sh. Tekan urutan CTRL-p CTRL-q. Ini akan melepaskan terminal dari container dan menjaga container tetap berjalan. Jika sekarang Anda menjalankan docker top busybox, Anda akan melihat dua proses dalam daftar.

UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                7469                7451                0                   11:40               pts/0               00:00:00            /bin/sh
root                7737                7469                0                   11:43               pts/0               00:00:00            sh

Namun PPID dari kedua proses tersebut akan berbeda. Faktanya, PPID proses kedua akan sama dengan PID proses pertama. Proses pertama bertindak sebagai proses induk untuk sesi shell yang baru saja kita buat.

Sekarang, jalankan docker exec -it busybox sh. Setelah berada di dalam container, periksa daftar proses yang berjalan untuk container busybox di jendela terminal lain dengan menjalankan perintah docker top busybox. Anda akan melihat sesuatu seperti ini

UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                7469                7451                0                   11:40               pts/0               00:00:00            /bin/sh
root                7737                7469                0                   11:43               pts/0               00:00:00            sh
root                7880                7451                0                   11:45               pts/1               00:00:00            sh

PPID dari proses pertama dan ketiga akan sama, yang menegaskan bahwa docker exec membuat proses baru di lingkungan penampung sementara docker attach hanya menghubungkan input/output/kesalahan standar dari proses utama di dalam penampung ke input/output/standar yang sesuai kesalahan terminal saat ini.

person Kartik Chauhan    schedule 20.07.2019

Docker exec menjalankan perintah baru/membuat proses baru di lingkungan container, sedangkan docker attachment hanya menghubungkan input/output/kesalahan standar dari proses utama (dengan PID 1) di dalam container ke input/output/kesalahan standar yang sesuai saat ini terminal(terminal yang Anda gunakan untuk menjalankan perintah).

Kontainer adalah lingkungan yang terisolasi, dengan beberapa proses berjalan di lingkungan tersebut. Secara khusus, sebuah container memiliki ruang sistem file dan ruang PID sendiri yang diisolasi dari host dan container lainnya. Ketika container dimulai menggunakan “docker run –it…”, proses utama akan memiliki pseudo-tty dan STDIN tetap terbuka. Saat dipasang dalam mode tty, Anda dapat melepaskan diri dari wadah (dan membiarkannya berjalan) menggunakan rangkaian kunci yang dapat dikonfigurasi. Urutan defaultnya adalah CTRL-p CTRL-q. Anda mengonfigurasi urutan kunci menggunakan opsi --detach-keys atau file konfigurasi. Anda dapat menyambungkan kembali ke wadah terpisah dengan docker attachment.

Docker exec baru saja memulai proses baru, di dalam lingkungan container, yaitu milik ruang PID container.

Misalnya, jika Anda memulai container menggunakan “docker run –dit XXX /bin/bash”, Anda dapat melampirkan ke container (proses utama) menggunakan dua terminal berbeda. Saat Anda memasukkan input di satu terminal, Anda dapat melihatnya muncul di terminal lain, karena kedua terminal terhubung ke tty yang sama. Berhati-hatilah karena Anda sekarang berada dalam proses utama penampung, jika Anda mengetik "keluar", Anda akan keluar dari penampung (jadi hati-hati, gunakan tombol pelepasan untuk melepaskan), dan Anda akan melihat kedua terminal keluar. Tetapi jika Anda menjalankan “docker exec –it XXX /bin/bash” di dua terminal, Anda telah memulai dua proses baru di dalam container, dan keduanya tidak terkait satu sama lain dan dengan proses utama, dan Anda dapat keluar dengan aman dari proses tersebut. .

person Michael.Sun    schedule 06.09.2018