Bagaimana cara saya masuk ke dalam cangkang wadah Docker?


1163

Saya mulai bekerja dengan Docker. Saya menggunakan gambar dasar WordPress dan komposisi buruh pelabuhan.

Saya mencoba ssh ke salah satu wadah untuk memeriksa file / direktori yang dibuat pada awal pembuatan. Saya mencoba lari docker-compose run containername ls -la, tetapi itu tidak melakukan apa-apa. Bahkan jika itu terjadi, saya lebih suka memiliki konsol di mana saya dapat melintasi struktur direktori, daripada menjalankan satu perintah. Apa cara yang tepat untuk melakukan ini dengan Docker?


Jadi sepertinya jawabannya adalah docker attach. Tapi bagaimana saya bisa mendapatkan itu dari komposisi buruh pelabuhan?
Andrew

3
Gunakan docker exec askubuntu.com/a/543057/35816 . Dapatkan id wadah menggunakandocker ps
Mauricio Scheffer

26
sudo docker run -it --entrypoint /bin/bash <container_name>membawa Anda ke wadah secara interaktif. Kemudian orang dapat memeriksa sistem file dalam wadah menggunakancd <path>
Sergei

Jawaban:


1736

docker attachakan memungkinkan Anda terhubung ke wadah Docker Anda, tetapi ini tidak benar-benar sama dengan ssh. Jika wadah Anda menjalankan server web, misalnya, docker attachmungkin akan menghubungkan Anda ke stdout dari proses server web. Itu tidak akan selalu memberi Anda shell.

The docker execperintah mungkin apa yang Anda cari; ini akan memungkinkan Anda menjalankan perintah sewenang-wenang di dalam wadah yang ada. Sebagai contoh:

docker exec -it <mycontainer> bash

Tentu saja, perintah apa pun yang Anda jalankan harus ada di sistem file wadah.

Dalam perintah di atas <mycontainer>adalah nama atau ID wadah target. Tidak masalah apakah Anda menggunakan atau tidak docker compose; jalankan docker psdan gunakan ID (string heksadesimal yang ditampilkan di kolom pertama) atau nama (ditampilkan di kolom terakhir). Misalnya, diberikan:

$ docker ps
d2d4a89aaee9        larsks/mini-httpd   "mini_httpd -d /cont   7 days ago          Up 7 days                               web                 

Saya bisa berlari:

$ docker exec -it web ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
18: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.3/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe11:3/64 scope link 
       valid_lft forever preferred_lft forever

Saya bisa mencapai hal yang sama dengan menjalankan:

$ docker exec -it d2d4a89aaee9 ip addr

Demikian pula, saya dapat memulai sebuah shell di wadah;

$ docker exec -it web sh
/ # echo This is inside the container.
This is inside the container.
/ # exit
$

76
Juga, docker exechanya berfungsi pada wadah yang sedang berjalan (jika tidak gunakan docker run -it --entrypoint /bin/bashatau serupa).
L0j1k

59
untuk kenyamanan Anda, -itmerupakan kombinasi dari -idan -tyang masing-masing --interactive("Biarkan STDIN tetap terbuka meskipun tidak terpasang") --tty("Alokasikan pseudo-TTY").
Adrian Föder

23
Pada kontainer berbasis Alpine Linux Anda mungkin tidak memiliki bash, jadi jika demikian, gunakan sh sebagai gantinya.
Robin Green

9
@ L0j1k itu docker run -it --entrypoint /bin/bash <imageid> --any --more --args, hanya untuk memperjelas orang
Alexander Mills

2
@AlexanderMills Ya, dan untuk mengklarifikasi lebih lanjut, yang --any --more --argsAnda miliki akan dimasukkan ke dalam gambar apa pun yang telah didefinisikan sebagai CMDdan bukan Docker (atau jika gambar Anda hanya menentukan ENTRYPOINTdan tidak CMD, maka opsi ini akan dimasukkan /bin/bashseperti yang telah Anda tentukan di sini ). Jadi misalnya docker runopsi lain (misalnya --net "host") harus pergi sebelum <imageid>.
L0j1k

302

Untuk menabrak wadah yang sedang berjalan, ketikkan ini:

docker exec -t -i container_name /bin/bash

atau

docker exec -ti container_name /bin/bash

atau

docker exec -ti container_name sh

Menganggap itu adalah wadah Linux?
Peter Mortensen

5
/ bin / bash tidak diperlukan hanya bash melakukannya untuk saya
Anand Varkey Philips

6
Saya lebih suka docker exec -itdaripadadocker exec -t -i
VaTo

apa bedanya @VaTo
AATHITH RAJENDRAN

@AATHITHRAJENDRANI hanya lebih suka bentuk perintah yang lebih pendek daripada memiliki dua flag, Anda dapat memasukkan dua opsi dalam argumen yang sama -itu.
VaTo

85

Katakanlah, karena alasan Anda sendiri, Anda benar-benar ingin menggunakan SSH. Dibutuhkan beberapa langkah, tetapi bisa dilakukan. Berikut adalah perintah yang akan Anda jalankan di dalam wadah untuk mengaturnya ...

apt-get update
apt-get install openssh-server

mkdir /var/run/sshd
chmod 0755 /var/run/sshd
/usr/sbin/sshd

useradd --create-home --shell /bin/bash --groups sudo username ## includes 'sudo'
passwd username ## Enter a password

apt-get install x11-apps ## X11 demo applications (optional)
ifconfig | awk '/inet addr/{print substr($2,6)}' ## Display IP address (optional)

Sekarang Anda bahkan dapat menjalankan aplikasi grafis (jika diinstal di wadah) menggunakan penerusan X11 ke klien SSH:

ssh -X username@IPADDRESS
xeyes ## run an X11 demo app in the client

Berikut ini beberapa sumber terkait:


34

Jika Anda di sini mencari Docker Compose-spesifik jawaban seperti saya, itu memberikan cara mudah tanpa harus mencari ID kontainer yang dihasilkan.

docker-compose execmengambil nama layanan sesuai docker-compose.ymlfile Anda .

Jadi untuk mendapatkan shell Bash untuk layanan 'web' Anda, Anda dapat melakukan:

$ docker-compose exec web bash

docker-compose runberfungsi juga, jika wadah Anda belum ada.
Paul

23

Perhatikan : jawaban ini mempromosikan alat yang saya tulis.

Saya telah membuat server SSH kemas yang dapat Anda 'tempelkan' ke wadah yang sedang berjalan. Dengan cara ini Anda dapat membuat komposisi dengan setiap wadah. Satu-satunya persyaratan adalah bahwa wadah tersebut memiliki Bash.

Contoh berikut akan memulai server SSH yang terpasang pada sebuah wadah dengan nama 'wadah-saya'.

docker run -d -p 2222:22 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -e CONTAINER=my-container -e AUTH_MECHANISM=noAuth \
  jeroenpeeters/docker-ssh

ssh localhost -p 2222

Saat Anda terhubung ke layanan SSH ini (dengan klien SSH pilihan Anda), sesi Bash akan dimulai dalam wadah dengan nama 'wadah-saya'.

Untuk petunjuk dan dokumentasi lebih lanjut, lihat: https://github.com/jeroenpeeters/docker-ssh


1
Itu manis sekali. Keuntungan besar melakukannya dengan cara ini adalah Anda mendapatkan terminal yang berfungsi penuh. Ketika saya menggunakan pendekatan "docker exec" maka saya tidak bisa menghapus konten terminal, lessmenunjukkan peringatan setiap kali saya menjalankannya dll. Menggunakan wadah Jeroen memberi saya pengalaman yang jauh lebih baik sejauh ini. Pastikan untuk memeriksa dokumentasinya . Perintah sampel dalam respons tampaknya tidak valid lagi.
Rafał G.

1
itu adalah alat yang hebat. Apakah Anda tahu bagaimana saya bisa menggunakannya sebagai agen buruh pelabuhan pipa jenkins? Saya ingin jenkins mentransfer beberapa file oleh SCP ke host jarak jauh dan mengeksekusinya dengan SSH
Gilson

21

Jika Anda menggunakan Docker di Windows dan ingin mendapatkan akses shell ke sebuah wadah, gunakan ini:

winpty docker exec -it <container_id> sh

Kemungkinan besar, Anda sudah menginstal Git Bash . Jika tidak, pastikan untuk menginstalnya.


1
Menganggap kontainer Linux Docker?
Peter Mortensen

1
docker exec -ti <container_id> cmd berfungsi dengan baik
PBo

17

Jika wadah sudah keluar (mungkin karena kesalahan), Anda bisa melakukannya

$ docker run --rm -it --entrypoint /bin/ash image_name

atau

$ docker run --rm -it --entrypoint /bin/sh image_name

atau

$ docker run --rm -it --entrypoint /bin/bash image_name

untuk membuat wadah baru dan memasukkan shell ke dalamnya. Karena Anda menentukan --rm, wadah akan dihapus ketika Anda keluar dari shell.


16

Dalam beberapa kasus, gambar Anda dapat berbasis Alpine. Dalam hal ini ia akan melempar:

OCI runtime exec gagal: exec gagal: container_linux.go: 348: memulai proses kontainer disebabkan "exec: \" bash \ ": file yang dapat dieksekusi tidak ditemukan dalam $ PATH": tidak diketahui

Karena /bin/bashtidak ada. Alih-alih ini, Anda harus menggunakan:

docker exec -it 9f7d99aa6625 ash

atau

docker exec -it 9f7d99aa6625 sh

15

SSH ke dalam wadah Docker menggunakan perintah ini:

sudo docker exec -i -t (container ID) bash

12

Untuk terhubung ke cmd dalam wadah Windows, gunakan

docker exec -it d8c25fde2769 cmd

Di mana d8c25fde2769 adalah id wadah.


11

Itu sederhana !

Buat daftar semua gambar Docker Anda:

sudo docker images

Pada sistem saya itu menunjukkan output berikut:

REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
bash                latest              922b9cc3ea5e        9 hours ago
14.03 MB
ubuntu              latest              7feff7652c69        5 weeks ago         81.15 MB

Saya memiliki dua gambar Docker di PC saya. Katakanlah saya ingin menjalankan yang pertama.

sudo docker run -i -t ubuntu:latest /bin/bash

Ini akan memberi Anda kontrol terminal wadah. Sekarang Anda dapat melakukan semua jenis operasi shell di dalam wadah. Seperti melakukan lsakan menampilkan semua folder di root dari sistem file.

bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

11

Untuk memeriksa file, jalankan docker run -it <image> /bin/shuntuk mendapatkan terminal interaktif. Daftar gambar dapat diperoleh dengan docker images. Berbeda dengan docker execsolusi ini juga berfungsi jika gambar tidak mulai (atau berhenti segera setelah berjalan).


Menganggap gambar Linux Docker?
Peter Mortensen

10

SOLUSI GOINSIDE

instal goinsidealat baris perintah dengan:

sudo npm install -g goinside

dan masuk ke dalam wadah buruh pelabuhan dengan ukuran terminal yang tepat dengan:

goinside docker_container_name

jawaban lama

Kami telah memasukkan cuplikan ini ~/.profile:

goinside(){
    docker exec -it $1 bash -c "stty cols $COLUMNS rows $LINES && bash";
}
export -f goinside

Hal ini tidak hanya membuat semua orang bisa masuk ke dalam wadah berlari dengan:

goinside containername

Ini juga memecahkan masalah berumur panjang tentang ukuran terminal kontainer Docker tetap . Yang sangat menjengkelkan jika kamu menghadapinya.

Juga jika Anda mengikuti tautan Anda akan memiliki perintah selesai untuk nama kontainer buruh pelabuhan Anda juga.


1
Terima kasih. Ini berfungsi seperti pesona, setidaknya untuk gambar-gambar yang sudah termasuk bash. Namun, mungkin tidak berfungsi untuk gambar berbasis alpine, dapat diperbaiki dengan fungsi berbeda yang ditulis khusus untuk sh / ash dll.
Gaurav Bhaskar

8
$ docker exec -it <Container-Id> /bin/bash

Atau tergantung pada shell, bisa jadi

$ docker exec -it <Container-Id> /bin/sh

Anda bisa mendapatkan id kontainer melalui docker psperintah

-i = interaktif

-t = untuk mengalokasikan psuedo-TTY


8

Saya telah membuat fungsi terminal untuk memudahkan akses ke terminal kontainer. Mungkin ini berguna bagi kalian juga:

Jadi hasilnya, alih-alih mengetik:

docker exec -it [container_id] /bin/bash

Anda akan menulis:

dbash [container_id]

Masukkan yang berikut ini di ~ / .bash_profile Anda (atau apa pun yang cocok untuk Anda), lalu buka jendela terminal baru dan nikmati pintasannya:

#usage: dbash [container_id]
dbash() {
    docker exec -it "$1" /bin/bash
}

7

Anda dapat berinteraksi dengan terminal dalam wadah buruh pelabuhan dengan melewatkan opsi -ti

docker run --rm -ti <image-name>
eg: docker run --rm -ti ubuntu

-t singkatan terminal -i singkatan interaktif


6

docker execpasti akan menjadi solusi. Cara mudah untuk bekerja dengan pertanyaan yang Anda ajukan adalah dengan memasang direktori di dalam Docker ke direktori sistem lokal .

Sehingga Anda dapat melihat perubahan di jalur lokal secara instan.

docker run -v /Users/<path>:/<container path> 

1
perintah Anda sebenarnya sedang memasang direktori host ke dalam wadah.
Demonbane

Ya! Ambil cadangan ke direktori lain lalu pasang volumenya, lalu pindahkan cadangan ke folder yang dipasang.
Pratik

6

Menggunakan:

docker attach <container name/id here>

Cara lain, meskipun ada bahaya untuk itu, adalah menggunakan attach, tetapi jika Anda Ctrl+ Ckeluar dari sesi, Anda juga akan menghentikan wadah. Jika Anda hanya ingin melihat apa yang terjadi, gunakan docker logs -f.

:~$ docker attach --help
Usage:  docker attach [OPTIONS] CONTAINER

Attach to a running container

Options:
      --detach-keys string   Override the key sequence for detaching a container
      --help                 Print usage
      --no-stdin             Do not attach STDIN
      --sig-proxy            Proxy all received signals to the process (default true)


4

Jika Anda memiliki Docker terpasang Kitematic, Anda dapat menggunakan GUI. Buka Kitematicdari ikon Docker dan di Kitematicjendela pilih wadah Anda, lalu klik execikon.

Anda dapat melihat log kontainer dan banyak informasi kontainer (di tab pengaturan) di GUI ini juga.

Pilih Kitematic from menu

Klik pada exec


2

Dalam kasus saya, untuk beberapa alasan saya perlu memeriksa semua informasi jaringan yang terlibat dalam setiap wadah. Jadi perintah berikut harus valid dalam sebuah wadah ...

ip
route
netstat
ps
...

Saya memeriksa semua jawaban ini, tidak ada yang membantu saya. Saya telah mencari informasi di situs web lain. Saya tidak akan menambahkan tautan super di sini, karena ini tidak ditulis dalam bahasa Inggris. Jadi saya hanya memasang posting ini dengan solusi ringkasan untuk orang-orang yang memiliki persyaratan yang sama dengan saya.

Katakanlah Anda memiliki satu wadah berjalan bernama uji-cahaya. Ikuti langkah-langkah di bawah ini.

  • docker inspect light-test -f {{.NetworkSettings.SandboxKey}}. Perintah ini akan mendapat balasan seperti /var/run/docker/netns/xxxx.
  • Lalu ln -s /var/run/docker/netns/xxxx /var/run/netns/xxxx. Direktori mungkin tidak ada, lakukan mkdir /var/run/netnsdulu.
  • Sekarang Anda dapat mengeksekusi ip netns exec xxxx ip addr showuntuk menjelajahi dunia jaringan dalam wadah.

PS. xxxxselalu nilai yang sama yang diterima dari perintah pertama. Dan tentu saja, perintah lain yang valid, yaitu ip netns exec xxxx netstat -antp|grep 8080.


1

Pilihan lain adalah menggunakan nsenter .

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

2
Ada sejumlah masalah dengan nsenter. Yang pertama adalah bahwa Anda harus memiliki akses fisik ke host buruh pelabuhan, yang bukan diberikan (Anda mungkin bekerja dengan API buruh pelabuhan jarak jauh). Juga, menjalankan di bawah nsentermembebaskan Anda dari beberapa pembatasan keamanan dan sumber daya yang diberlakukan Docker (yang bisa pro atau kontra, tergantung pada lingkungan Anda).
larsks

1
Bahkan penulis nsenter mengatakan untuk menggunakan docker exechari ini.
L0j1k

1
@ larsks Ya, keduanya memiliki manfaatnya sendiri. Misalnya, ini adalah manfaat dari nsenter over docker exec. docker execterlihat lebih elegan bagiku.
xuhdev

2
@ L0j1k Agar tidak membingungkan: postingan yang Anda referensikan bukan oleh penulis nsenter, tetapi penulis gambar Docker yang menjalankan nsenter.
xuhdev

1

Jika Anda menggunakan Docker Compose maka ini akan membawa Anda ke dalam wadah Docker.

docker-compose run container_name /bin/bash

Di dalam wadah itu akan membawa Anda ke WORKDIR yang ditentukan di Dockerfile. Anda dapat mengubah direktori kerja Anda dengan

WORKDIR directory_path # E.g  /usr/src -> container's path

0

Untuk mengeksekusi ke wadah berjalan bernama test, di bawah ini adalah perintah berikut

Jika wadah memiliki bashcangkang

docker exec -it test /bin/bash

Jika wadah memiliki bournecangkang dan sebagian besar kasing ada

docker run -it test /bin/sh

-3

Untuk docker-compose up (Docker4Drupal)

docker-compose exec php bash

Saya menggunakan Docker untuk Drupal di laptop Linux. Setelah menjalankan wadah saya menggunakan ' docker-compose exec php bash' untuk terhubung dengan wadah sehingga saya dapat menjalankan komando drush. Ini bekerja dengan baik untuk saya.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.