Saya perhatikan dengan buruh pelabuhan bahwa saya perlu memahami apa yang terjadi di dalam wadah atau file apa yang ada di sana. Salah satu contohnya adalah mengunduh gambar dari indeks buruh pelabuhan - Anda tidak memiliki petunjuk tentang isi gambar sehingga tidak mungkin untuk memulai aplikasi.
Apa yang ideal adalah untuk dapat ssh ke mereka atau setara. Apakah ada alat untuk melakukan ini, atau konsep saya tentang buruh pelabuhan salah dalam berpikir saya harus bisa melakukan ini.
linux
docker
filesystems
pengguna2668128
sumber
sumber
docker exec <container> bash
. Jadi, Anda hanya membuka cangkang di dalam wadah.docker exec <container> ls <dir path>
dandocker exec <container> cat <file path>
. Namun untuk bash, tambahkan-it
opsi.docker image save image_name > image.tar
sebagaimana ditunjukkan dalam respons dari @ Gaurav24.Jawaban:
PEMBARUAN
Metode termudah: Menggunakan docker exec
Docker versi 1.3 atau yang lebih baru mendukung perintah
exec
yang berperilaku mirip dengannsenter
. Perintah ini dapat menjalankan proses baru dalam wadah yang sudah berjalan (wadah harus sudah menjalankan proses PID 1). Anda dapat berlari/bin/bash
untuk menjelajahi keadaan wadah:lihat dokumentasi baris perintah Docker
Metode alternatif 1
Snapshotting
Anda dapat mengevaluasi sistem file kontainer dengan cara ini:
Dengan cara ini, Anda dapat mengevaluasi sistem file wadah yang sedang berjalan pada saat yang tepat. Kontainer masih berjalan, tidak ada perubahan di masa depan yang disertakan.
Anda nanti dapat menghapus snapshot menggunakan (filesystem wadah yang sedang berjalan tidak terpengaruh!):
Metode alternatif 2
ssh
Jika Anda memerlukan akses terus menerus, Anda dapat menginstal sshd ke wadah Anda dan menjalankan daemon sshd:
Dengan cara ini, Anda dapat menjalankan aplikasi menggunakan ssh (hubungkan dan jalankan apa yang Anda inginkan).
UPDATE: Alternatif metode 3
nsenter
Gunakan
nsenter
, lihat https://web.archive.org/web/20160305150559/http://blog.docker.com/2014/06/why-you-dont-need-to-run-sshd-in-docker/sumber
Option 1
.RUN apk update && apk add bash
(ukuran: ~ 4MB)docker exec -t -i mycontainer /bin/sh
PEMBARUAN: MENJELAJAHI!
Perintah ini memungkinkan Anda menjelajahi wadah buruh pelabuhan yang sedang beroperasi :
Persamaan untuk ini dalam komposisi buruh pelabuhan adalah:
(web adalah nama layanan dalam kasus ini dan memiliki tty secara default.)
Setelah Anda berada di dalam, lakukan:
atau perintah bash lainnya seperti:
Perintah ini memungkinkan Anda menjelajahi gambar buruh pelabuhan :
sekali di dalam do:
atau perintah bash lainnya seperti:
The
-it
singkatan interaktif ... dan tty.Perintah ini harus memungkinkan Anda memeriksa wadah buruh pelabuhan atau gambar :
docker inspect name-of-container-or-image
Anda mungkin ingin melakukan ini dan mencari tahu apakah ada
bash
ataush
di sana. Cari entrypoint atau cmd di json return.lihat dokumentasi exec buruh pelabuhan
lihat dokumentasi exec buruh pelabuhan
lihat buruh pelabuhan memeriksa dokumentasi
sumber
docker exec -ti <name> powershell
( sumber )docker exec -ti <name> cmd
berfungsi. Dan untuk pemula lain seperti saya pastikan untuk menggunakan nama instance wadah daridocker ps
(sesuatu seperti 070494393ca5) daripada nama yang dapat dibaca yang Anda tetapkan.Jika wadah Anda dihentikan atau tidak memiliki cangkang (misalnya
hello-world
disebutkan dalam panduan instalasi , atau bukanalpine
traefik
), ini mungkin satu-satunya metode yang mungkin untuk menjelajahi sistem file.Anda dapat mengarsipkan sistem file wadah Anda ke file tar:
Atau daftar file:
Perhatikan, bahwa tergantung pada gambar, mungkin butuh waktu dan ruang disk.
sumber
export
contoh di atas menyentuh titik:docker export adoring_kowalevski | tar tf -
f -
di akhir perintah Anda, tar membaca dari input standar secara default. Cukupdocker export adoring_kowalevski | tar t
berhasil.tar f
bergantung pada konfigurasi seseorang. Satu bagian adalahTAPE
variabel lingkungan. Yang lain dikendalikan sebagai bagian dari bangunan. Efek bersihnya adalah bahwa seseorang tidak boleh menganggap itu membaca stdin atau menulis stdout tetapi selalu menyatakannya secara eksplisit.Sistem file wadah ada di folder data buruh pelabuhan, biasanya di / var / lib / docker. Untuk memulai dan memeriksa sistem file kontainer yang berjalan, lakukan hal berikut:
Dan sekarang direktori kerja saat ini adalah akar dari wadah.
sumber
Sebelum Pembuatan Wadah:
Jika Anda menjelajahi struktur gambar yang dipasang di dalam wadah, Anda bisa melakukannya
Ini akan memberi Anda visibilitas semua lapisan gambar dan konfigurasinya yang hadir dalam file json.
Setelah pembuatan wadah:
Untuk ini sudah ada banyak jawaban di atas. cara pilihan saya untuk melakukan ini adalah -
sumber
Jawaban yang paling banyak dipilih adalah bekerja untuk saya ketika wadah benar-benar dimulai, tetapi ketika itu tidak mungkin dijalankan dan Anda misalnya ingin menyalin file dari wadah ini telah menyelamatkan saya sebelumnya:
Berkat docker cp ( tautan ) Anda dapat menyalin langsung dari wadah karena itu adalah bagian lain dari sistem file Anda. Misalnya, memulihkan semua file di dalam sebuah wadah:
Perhatikan bahwa Anda tidak perlu menentukan bahwa Anda ingin menyalin secara rekursif.
sumber
Pada Ubuntu 14.04 menjalankan Docker 1.3.1 , saya menemukan filesystem root kontainer pada mesin host di direktori berikut:
Informasi versi Docker lengkap:
sumber
devicemapper
direktori). File ada di bawah/var/lib/docker/overlay/<a sha256 apparently/<upper or merged>/...
. Saya tidak yakin seberapa portabel / amannya mengakses file di sanadirect-lvm
misalnya.Coba gunakan
Mungkin ada kemungkinan bash tidak diterapkan. untuk itu bisa kamu gunakan
sumber
Saya menggunakan trik kotor lain yaitu aufs / devicemapper agnostic.
Saya melihat perintah bahwa wadah berjalan misalnya
docker ps
dan jika itu adalah apache ataujava
saya hanya melakukan hal berikut:dan kau ada di dalam wadah.
Pada dasarnya Anda dapat me-root cd ke
/proc/<PID>/root/
folder selama proses itu dijalankan oleh kontainer. Waspadalah symlink tidak akan masuk akal menggunakan mode itu.sumber
Jawaban yang paling banyak dipilih adalah baik kecuali jika wadah Anda bukan sistem Linux yang sebenarnya.
Banyak kontainer (terutama yang berbasis go) tidak memiliki biner standar (tidak
/bin/bash
atau/bin/sh
). Dalam hal ini, Anda perlu mengakses file kontainer yang sebenarnya secara langsung:Bekerja seperti pesona:
Catatan: Anda harus menjalankannya sebagai root.
sumber
Dalam kasus saya tidak ada cangkang didukung dalam wadah kecuali
sh
. Jadi, ini bekerja seperti pesonasumber
Anda dapat menggunakan dive untuk melihat konten gambar secara interaktif dengan TUI
https://github.com/wagoodman/dive
sumber
Ini akan meluncurkan sesi bash untuk gambar:
run docker --rm -it --entrypoint = / bin / bash
sumber
Bagi saya, ini berfungsi dengan baik (berkat komentar terakhir untuk menunjukkan direktori / var / lib / docker / ):
Di sini, 2465790aa2c4 adalah ID pendek dari wadah yang sedang berjalan (seperti yang ditampilkan oleh buruh pelabuhan ps ), diikuti oleh bintang.
sumber
Pada versi Docker yang lebih baru Anda dapat menjalankan
docker exec [container_name]
yang menjalankan shell di dalam wadah AndaJadi untuk mendapatkan daftar semua file dalam suatu wadah jalankan saja
docker exec [container_name] ls
sumber
Untuk driver buruh pelabuhan:
Script akan menemukan direktori root kontainer (Tes pada buruh pelabuhan 1.7.1 dan 1.10.3)
sumber
Tidak satu pun dari jawaban yang ada menangani wadah yang keluar (dan tidak dapat dimulai kembali) dan / atau tidak memiliki shell yang terpasang (mis. Yang tidak distro). Yang ini berfungsi selama Anda memiliki akses root ke host Docker.
Untuk inspeksi manual nyata, cari tahu ID lapisan pertama:
Dalam output, Anda akan melihat sesuatu seperti
Arahkan ke folder ini (sebagai root) untuk menemukan keadaan sistem file kontainer yang terlihat saat ini.
sumber
Jawaban ini akan membantu mereka (seperti saya) yang ingin menjelajahi sistem file volume buruh pelabuhan bahkan jika wadah tidak berjalan.
Daftar wadah buruh pelabuhan yang sedang beroperasi:
docker ps
=> ID KONTAINER "4c721f1985bd"
Lihatlah titik pemasangan volume buruh pelabuhan di mesin fisik lokal Anda ( https://docs.docker.com/engine/tutorials/dockervolumes/ ):
docker inspect -f {{.Mounts}} 4c721f1985bd
=> [{/ tmp / container-garren / tmp true rprivate}]
Ini memberitahu saya bahwa direktori mesin fisik lokal / tmp / container-garren dipetakan ke / volume tujuan docker docker.
Mengetahui direktori mesin fisik lokal (/ tmp / container-garren) berarti saya dapat menjelajahi filesystem apakah wadah buruh pelabuhan berjalan atau tidak. Ini penting untuk membantu saya mengetahui bahwa ada beberapa data residual yang seharusnya tidak bertahan bahkan setelah wadah tidak berjalan.
sumber
Trik lain adalah dengan menggunakan alat atom untuk melakukan sesuatu seperti:
Gambar Docker akan dipasang ke / path / ke / mnt untuk Anda memeriksanya.
sumber
Hanya untuk LINUX
Cara paling sederhana yang saya gunakan adalah menggunakan proc, yang merupakan wadah harus dijalankan untuk memeriksa file kontainer buruh pelabuhan.
Cari tahu id proses (PID) dari wadah dan simpan ke dalam beberapa variabel
Pastikan proses penampung berjalan, dan gunakan nama variabel untuk masuk ke folder penampung
Jika Anda ingin melewati dir tanpa mengetahui nomor PID hanya dengan menggunakan perintah panjang ini
Kiat:
Setelah Anda masuk ke dalam wadah, semua yang Anda lakukan akan memengaruhi proses aktual wadah tersebut, seperti menghentikan layanan atau mengubah nomor port.
Semoga ini bisa membantu
catatan:
Metode ini hanya berfungsi jika wadah masih berjalan, jika tidak direktori tidak akan ada lagi jika wadah sudah berhenti atau dihapus
sumber
Cara pilihan saya untuk memahami apa yang terjadi di dalam wadah adalah:
mengekspos -p 8000
Mulai server di dalamnya
sumber
Untuk wadah yang sudah berjalan, Anda dapat melakukan:
Anda harus menjadi root untuk melakukan cd ke dir itu. Jika Anda tidak root, coba 'sudo su' sebelum menjalankan perintah.
Sunting: Mengikuti v1.3, lihat jawaban Jiri - lebih baik.
sumber
Jika Anda menggunakan Docker v19.03, Anda ikuti langkah-langkah di bawah ini.
sumber
Jika Anda menggunakan driver penyimpanan AUFS, Anda dapat menggunakan skrip docker-layer saya untuk menemukan root sistem file (mnt) kontener dan baca-tulis layer:
Sunting 2018-03-28:
docker-layer telah digantikan oleh docker-backup
sumber
The
docker exec
perintah untuk menjalankan perintah dalam wadah berjalan dapat membantu dalam beberapa kasus.Sebagai contoh :
1) Mengakses secara bash ke sistem file container yang sedang berjalan:
2) Mengakses secara bash ke sistem file container yang sedang berjalan sebagai root untuk dapat memiliki hak yang diperlukan:
Ini sangat berguna untuk dapat melakukan beberapa pemrosesan sebagai root di wadah.
3) Mengakses secara bash ke sistem file kontainer yang sedang berjalan dengan direktori kerja tertentu:
sumber
Anda dapat menjalankan bash di dalam wadah dengan ini:
$ docker run -it ubuntu /bin/bash
sumber