Pertanyaan Bagaimana cara mendapatkan bash atau ssh ke penampung yang berjalan dalam mode latar belakang?


Saya ingin ssh atau bash ke dalam wadah galangan yang sedang berjalan. Silakan, lihat contoh:

$ sudo docker run -d webserver
webserver is clean image from ubuntu:14.04
$ sudo docker ps
CONTAINER ID  IMAGE            COMMAND    CREATED STATUS  PORTS          NAMES
665b4a1e17b6  webserver:latest /bin/bash  ...     ...     22/tcp, 80/tcp loving_heisenberg 

sekarang saya ingin mendapatkan sesuatu seperti ini (masuk ke dalam wadah yang berjalan):

$ sudo docker run -t -i webserver (or maybe 665b4a1e17b6 instead)
$ root@665b4a1e17b6:/# 
However when I run the line above I get new CONTAINER ID
$ root@42f1e37bd0e5:/#

Saya menggunakan Vagrant dan saya ingin mendapatkan perilaku yang sama dengan vagrant ssh.


795
2017-08-01 16:19


asal


kalau tidak sudo docker exec -i -t 665b4a1e17b6 /bin/sh untuk dapat menginstal program dan paket apt - fonjeekay


Jawaban:


Jawabannya adalah Docker attach perintah. Jadi untuk contoh saya di atas, solusinya adalah:

$ sudo docker attach 665b4a1e17b6 #by ID
or
$ sudo docker attach loving_heisenberg #by Name
$ root@665b4a1e17b6:/#

Untuk Docker versi 1.3 atau lebih baru: Terima kasih kepada pengguna WiR3D yang menyarankan cara lain untuk mendapatkan shell kontainer. Jika kita gunakan attach kita hanya bisa menggunakan satu cangkang. Jadi jika kita ingin membuka terminal baru dengan contoh baru dari shell kontainer, kita hanya perlu menjalankan yang berikut:

$ sudo docker exec -i -t 665b4a1e17b6 /bin/bash #by ID

atau

$ sudo docker exec -i -t loving_heisenberg /bin/bash #by Name
$ root@665b4a1e17b6:/#

1178
2017-08-05 06:01



Atau, jalankan sudo docker attach loving_heisenberg - thiagowfx
perintah melampirkan tidak bekerja untuk saya, itu menyebabkan buruh galangan untuk membekukan .. setiap ide mengapa itu terjadi? - Mo J. Mughrabi
Pengingat untuk pengguna boot2docker: hapus sudo :) - Henno
-i -t sama -it - pasha.zhukov
Ini adalah jawaban yang berbahaya untuk dipilih dan sangat terpilih. docker attaching ke instance MongoDB, misalnya, akan membunuh instance. Sebagaimana dijelaskan lebih detail di pertanyaan ini  attach dan exec adalah binatang yang berbeda. - fwc


Dari Docker 1.3 dan seterusnya:

docker exec -it <containerIdOrName> bash

Pada dasarnya, jika kontainer Docker mulai menggunakan /bin/bash perintah Anda dapat mengaksesnya menggunakan attach. Jika tidak, maka Anda perlu menjalankan perintah untuk membuat contoh Bash di dalam wadah menggunakan exec.

Juga untuk keluar dari Bash tanpa meninggalkan Bash berlari dalam proses jahat:

exit

Ya, itu sesederhana itu.


585
2017-10-29 07:46



masih belum tahu cara membuat nano berfungsi. Think yang mungkin melibatkan docker-ssh dari phusion - WiR3D
Apakah ada cara untuk mengatur bash secara default di buruh pelabuhan? - ipeacocks
@ipeacocks ya, jika RUN perintah di dockerfile adalah /bin/bash. Tetapi tergantung apa yang Anda maksud. Jika Anda ingin menjalankan penampung dan langsung tersedia di terminal yang sama lalu menjalankannya -it harus melakukannya - WiR3D
Menggunakan kelompok buruh pelabuhan adalah praktik yang buruk. Setiap pengguna yang berada dalam kelompok docker pada dasarnya digunakan dengan izin root tanpa perlu menggunakan sudo. projectatomic.io/blog/2015/08/… - Maiku Mori
Saya pikir itu tidak membuat banyak perbedaan, dari sudut pandang keamanan tuan rumah, apakah Anda menggunakan sudo vs docker kelompok. Either way, ada lubang keamanan dibangun ke docker yang dapat memberikan hak penuh dalam sistem file host dari tamu - terlepas dari apakah Anda menggunakan grup buruh pelabuhan atau sudo untuk meluncurkan wadah. - nobar


Meskipun penulis pertanyaan tersebut secara khusus mengatakan bahwa mereka tertarik dengan wadah yang sedang berjalan, juga perlu dicatat bahwa jika penampung tidak berjalan, tetapi Anda ingin menjalankannya untuk mengaduk-aduk Anda dapat menjalankan:

docker run -i -t --entrypoint /bin/bash <imageID>


101
2017-11-07 18:46



Itu memberikan wadah yang berbeda, seperti jawaban @kraxor. - Blaisorblade


Coba ini:

sudo docker run -i -t webserver /bin/bash

Sumber: https://docs.docker.com/articles/basics/#running-an-interactive-shell


24
2017-08-01 16:29



Ini tidak cocok, karena saya mendapatkan ID CONTAINER yang berbeda (root@42f1e37bd0e5:/# dan tidak root@665b4a1e17b6:/#) - Timur Fayzrakhmanov
tautan sudah mati, Anda harus memperbarui - Ahmet Karakaya


Berdasarkan jawaban @ Timur saya telah membuat yang berikut ini skrip yang berguna

Mempersiapkan

Taruh docker-ssh file di Anda $PATH dengan isi sebagai berikut

#!/bin/bash -xe

# docker container id or name might be given as a parameter
CONTAINER=$1

if [[ "$CONTAINER" == "" ]]; then
  # if no id given simply just connect to the first running container
  CONTAINER=$(docker ps | grep -Eo "^[0-9a-z]{8,}\b")
fi

# start an interactive bash inside the container
# note some containers don't have bash, then try: ash (alpine), or simply sh
# the -l at the end stands for login shell that reads profile files (read man)
docker exec -i -t $CONTAINER bash -l

Catatan: Beberapa kontainer tidak mengandung bash, tapi ash, sh dll. Dalam kasus ini bash harus diganti dalam naskah di atas.

Pemakaian

Jika Anda memiliki satu contoh berjalan cukup jalankan

$> docker-ssh 

Jika tidak, berikan dengan parmeter ID docker yang Anda dapatkan docker ps (Kol pertama)

$> docker-ssh 50m3r4nd0m1d

13
2018-04-20 11:39



Bolehkah saya tahu mengapa kita perlu pada akhirnya? - Nam G VU
untuk memulai bash sebagai shell login, membaca parameter lingkungan (dijelaskan pada baris di atas perintah) - Matyas


Saya telah membuat server SSH dalam peti kemas yang menyediakan kemampuan SSH untuk menjalankan kontainer apa pun. Anda tidak perlu mengubah penampung Anda. Satu-satunya persyaratan adalah bahwa wadah tersebut memiliki bash.

Jika Anda memiliki wadah dengan nama 'web-server1'. Perintah menjalankan docker berikut akan memulai kontainer kedua yang akan memberikan SSH untuk kontainer pertama.

docker run -ti --name sshd-web-server1 -e CONTAINER=web-server1 -p 2222:22 \
-v /var/run/docker.sock:/var/run/docker.sock -v $(which docker):/usr/bin/docker \
jeroenpeeters/docker-ssh

Untuk petunjuk lebih lanjut, periksa https://github.com/jeroenpeeters/docker-ssh


8
2017-10-03 16:20



Ini harus menjadi jawaban yang diterima ^ - Nam G VU
By the way, bagaimana kita bisa. Bashrc auto dimuat ketika memulai sesi ssh menggunakan solusi Anda? Juga memposting masalah di github github.com/jeroenpeeters/docker-ssh/issues/30 - Nam G VU


@jpetazzo memiliki posting mengagumkan tentang subjek ini. Jawaban singkatnya akan digunakan nsenter:

PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>)
nsenter --target $PID --mount --uts --ipc --net --pid

P.S .: Jangan lupa untuk memeriksa diskusi di komentar dari posting ...

Tepuk tangan


5
2018-03-14 10:12



Itu posting yang agak lama itu tidak lagi benar-benar diperlukan. @ WiR3D docker exec solusinya agak lebih nyaman. - drevicko