Meskipun tutorial dan faq Docker's Interactive, saya kehilangan data saya ketika kontainer keluar.
Saya telah menginstal Docker seperti dijelaskan di sini: http://docs.docker.io/en/latest/installation/ubuntulinux tanpa masalah di ubuntu 13.04.
Tapi itu kehilangan semua data saat keluar.
iman@test:~$ sudo docker version
Client version: 0.6.4
Go version (client): go1.1.2
Git commit (client): 2f74b1c
Server version: 0.6.4
Git commit (server): 2f74b1c
Go version (server): go1.1.2
Last stable version: 0.6.4
iman@test:~$ sudo docker run ubuntu ping
2013/10/25 08:05:47 Unable to locate ping
iman@test:~$ sudo docker run ubuntu apt-get install ping
Reading package lists...
Building dependency tree...
The following NEW packages will be installed:
iputils-ping
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 56.1 kB of archives.
After this operation, 143 kB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu/ precise/main iputils-ping amd64 3:20101006-1ubuntu1 [56.1 kB]
debconf: delaying package configuration, since apt-utils is not installed
Fetched 56.1 kB in 0s (195 kB/s)
Selecting previously unselected package iputils-ping.
(Reading database ... 7545 files and directories currently installed.)
Unpacking iputils-ping (from .../iputils-ping_3%3a20101006-1ubuntu1_amd64.deb) ...
Setting up iputils-ping (3:20101006-1ubuntu1) ...
iman@test:~$ sudo docker run ubuntu ping
2013/10/25 08:06:11 Unable to locate ping
iman@test:~$ sudo docker run ubuntu touch /home/test
iman@test:~$ sudo docker run ubuntu ls /home/test
ls: cannot access /home/test: No such file or directory
Saya juga mengujinya dengan sesi interaktif dengan hasil yang sama. Apakah saya lupa sesuatu?
EDIT: PENTING UNTUK PENGGUNA DOCKER BARU
Seperti yang dikatakan @ mohammed-noureldin dan yang lainnya, sebenarnya ini BUKAN sebuah wadah yang keluar . Setiap kali itu hanya menciptakan wadah baru.
Docker
. Saya akan mengusulkan untuk menyimpan judul dan pertanyaan awal, karena pemula pasti akan mencari sesuatu seperti ini. Tapi, mengapa Anda tidak menambahkan sesuatu yang menggambarkan kesalahpahaman Anda pada saat Anda menulis posting. Ini akan membantu memperjelas. Ini adalah budaya kita di sini di SO ... bukan? :-)Jawaban:
Anda perlu melakukan perubahan yang Anda buat pada wadah dan kemudian menjalankannya. Coba ini:
Lalu dapatkan id wadah menggunakan perintah ini:
Mengkomit perubahan pada wadah:
Kemudian jalankan wadah:
Ini seharusnya bekerja.
sumber
<none>
. Bagaimana saya terus menambahkan komit di atas gambar yang ada?Ketika Anda menggunakan
docker run
untuk memulai sebuah wadah, itu benar-benar membuat wadah baru berdasarkan gambar yang Anda tentukan.Selain jawaban berguna lainnya di sini, perhatikan bahwa Anda dapat memulai kembali wadah yang sudah ada setelah keluar dan perubahan Anda masih ada.
sumber
docker ps
hanya menunjukkan Anda menjalankan wadah buruh pelabuhan.docker ps -a
menunjukkan Anda juga yang telah keluar - dan Anda dapat terus berlari. Komit hanya diperlukan setelah setiap kali dijalankan jika Anda ingin membuat snapshot di sana untuk digunakan di masa depan, jika tidak, wadah itu sendiri akan tetap ada agar Anda tetap menggunakannya.jenkins
server docker dan saya menjalankannya di host ci saya dan menjalankan beberapa pekerjaan yang saya miliki dan sebagai hasilnya server jenkins menulis ke disk beberapa log. sekarang jika server saya (yang meng-host docker saya) dihidupkan ulang dan saya mulai lagi docker jenkins saya apakah itu berarti saya kehilangan semua file log? jika begitu bagaimana saya bisa menggunakanjenkins
buruh pelabuhan misalnya untuk memudahkan instalasi jenkins saya di CI?docker cp $(docker ps -alq):/path/to/file .
docker run -it --name my_debian debian
dan setelahdocker start my_debian && docker attach my_debian
)Ada beberapa cara berikut untuk bertahan data wadah:
Volume buruh pelabuhan
Docker melakukan
a) membuat wadah dari gambar ubuntu dan menjalankan terminal bash.
b) Di dalam terminal, pasang ikal
c) Keluar dari terminal kontainer
d) Catat id kontainer Anda dengan menjalankan perintah berikut:
e) menyimpan wadah sebagai gambar baru
f) verifikasi bahwa Anda dapat melihat gambar baru Anda dengan ikal terpasang.
sumber
exit
sebelumnyadocker commit
? Terima kasih.docker run
perintah Anda menjalankan bash di wadah dan Anda tetap di sana karena-i
dan-t
opsi (interaktif dengan TTY). Namun, Docker berjalan pada mesin Anda, di luar wadah, jadi setelah membuat perubahan yang diperlukan pada wadah dari dalam, untuk kembali ke shell sistem Anda, Anda harusexit
(atau Ctrl + D) shell penampung. Perhatikan juga#
dan$
dalam jawaban, yang menunjukkan cangkang yang berbeda dengan perintah yang dituliskan.docker stop
diikuti olehdocker start
.Selain jawaban Unferth , disarankan untuk membuat Dockerfile .
Di direktori kosong, buat file bernama "Dockerfile" dengan konten berikut.
Buat gambar menggunakan Dockerfile . Mari kita gunakan tag sehingga kita tidak perlu mengingat nomor gambar heksadesimal.
Dan kemudian jalankan gambar dalam wadah.
sumber
Saya sudah mendapat jawaban yang lebih sederhana untuk pertanyaan Anda, jalankan dua perintah berikut
perintah ps -a di atas mengembalikan daftar semua kontainer. Ambil nama wadah yang merujuk nama gambar - 'ubuntu'. buruh pelabuhan otomatis menghasilkan nama untuk wadah misalnya -
'lightlyxuyzx'
, itu jika Anda tidak menggunakan opsi --name.Opsi -t dan -d penting, wadah yang dibuat terpisah dan dapat disambungkan kembali seperti yang diberikan di bawah ini dengan opsi -t.
Dengan opsi --name, Anda dapat memberi nama wadah Anda dalam kasus saya 'mycontainername'.
dan perintah di atas ini membantu Anda login ke wadah dengan bash shell. Dari titik ini pada setiap perubahan yang Anda buat dalam wadah secara otomatis disimpan oleh buruh pelabuhan. Misalnya -
apt-get install curl
di dalam wadah Anda dapat keluar dari wadah tanpa masalah, buruh pelabuhan otomatis menyimpan perubahannya.Pada penggunaan selanjutnya, yang harus Anda lakukan adalah, jalankan dua perintah ini setiap kali Anda ingin bekerja dengan wadah ini.
Perintah di bawah ini akan memulai wadah yang berhenti:
Contoh lain dengan port dan ruang bersama yang diberikan di bawah ini:
Dalam kasus saya: 7efe2989e877 - adalah imageid dari wadah berjalan sebelumnya yang saya peroleh menggunakan
sumber
--name
opsi dan sebelum nama gambar, seperti ini:docker run --name mycontainername -t -d ubuntu /bin/bash
Anda mungkin ingin melihat volume buruh pelabuhan jika Anda ingin mempertahankan data dalam wadah Anda. Kunjungi https://docs.docker.com/engine/tutorials/dockervolumes/ . Dokumentasi buruh pelabuhan adalah tempat yang sangat baik untuk memulai
sumber
Saran saya adalah mengelola buruh pelabuhan, dengan menulis buruh pelabuhan. Merupakan cara mudah untuk mengelola semua kontainer buruh pelabuhan untuk proyek Anda, Anda dapat memetakan versi dan menautkan kontainer yang berbeda untuk bekerja bersama.
Dokumen sangat mudah dipahami, lebih baik dari dok dok.
Dok Penulis-Docker
Terbaik
sumber
Ada jawaban yang sangat bagus di atas untuk pertanyaan yang diajukan. Mungkin tidak perlu untuk jawaban lain, tetapi saya masih ingin memberikan pendapat pribadi saya tentang topik dengan kata-kata sesederhana mungkin.
Berikut adalah beberapa poin tentang wadah & gambar yang akan membantu kami untuk kesimpulan:
Kesimpulan :
Seperti yang bisa kita lihat, wadah buruh pelabuhan tidak tergantung pada gambar buruh pelabuhan.
Sebuah wadah dapat dimulai kembali asalkan ID unik dari wadah itu [gunakan
docker ps --all
untuk mendapatkan id] .Operasi apa pun seperti membuat direktori baru, membuat file, menginstal alat, dll. Dapat dilakukan di dalam wadah ketika sedang berjalan. Setelah wadah dihentikan, itu tetap semua perubahan. Menghentikan dan memulai ulang kontainer seperti menyalakan ulang sistem komputer.
Wadah yang sudah dibuat selalu tersedia untuk memulai ulang tetapi ketika kami mengeluarkan
docker run
perintah, wadah baru dibuat dari gambar dan karenanya seperti sistem komputer baru. Perubahan yang dibuat di dalam wadah lama - seperti yang dapat kita pahami sekarang - tidak tersedia di wadah baru ini.Catatan terakhir :
Saya kira sekarang sudah jelas mengapa data tampaknya hilang namun selalu ada .. tetapi dalam wadah [lama] yang berbeda. Jadi, perhatikan perbedaan
docker start
&docker run
perintah & perhatikan baik-baik .sumber
masalah serupa (dan tidak mungkin Dockerfile sendiri dapat memperbaikinya) membawa saya ke halaman ini.
tahap 0: untuk semua, berharap Dockerfile dapat memperbaikinya: sampai --dns dan --dns-search akan muncul di dukungan Dockerfile - tidak ada cara untuk mengintegrasikan sumber daya berbasis intranet ke dalam.
tahap 1: setelah membangun gambar menggunakan Dockerfile (omong-omong itu kesalahan serius Dockerfile harus ada di folder saat ini ), memiliki gambar untuk menggunakan apa yang berbasis intranet, dengan menjalankan skrip run docker. contoh:
docker run -d \ --dns=${DNSLOCAL} \ --dns=${DNSGLOBAL} \ --dns-search=intranet \ -t pack/bsp \ --name packbsp-cont \ bash -c " \ wget -r --no-parent http://intranet/intranet-content.tar.gz \ tar -xvf intranet-content.tar.gz \ sudo -u ${USERNAME} bash --norc"
tahap 2: menerapkan skrip docker run dalam mode daemon yang menyediakan catatan dns lokal untuk dapat mengunduh dan menggunakan barang-barang lokal.
Poin penting: menjalankan skrip harus diakhiri dengan sesuatu seperti
/usr/bin/sudo -u ${USERNAME} bash --norc
agar wadah tetap berjalan bahkan setelah skrip instalasi selesai.tidak , itu tidak mungkin untuk menjalankan wadah dalam mode interaktif untuk masalah otomatisasi penuh karena akan tetap berada di dalam internal akan meminta prompt sampai CTRL-p CTRL-q ditekan.
tidak , jika bash yang berinteraksi tidak akan dieksekusi di akhir skrip instalasi, wadah akan berakhir segera setelah selesai skrip eksekusi, kehilangan semua hasil instalasi.
tahap 3: kontainer masih berjalan di latar belakang tetapi tidak jelas apakah kontainer telah mengakhiri prosedur instalasi atau belum. menggunakan blok berikut untuk menentukan prosedur eksekusi selesai:
while ! docker container top ${CONTNAME} | grep "00[[:space:]]\{12\}bash \--norc" - do echo "." sleep 5 done
skrip akan melanjutkan lebih lanjut hanya setelah instalasi selesai. dan ini adalah saat yang tepat untuk menelepon: komit , memberikan id wadah saat ini serta nama gambar tujuan (mungkin sama dengan pada prosedur build / run tetapi ditambahkan dengan tag tujuan instalasi lokal. contoh:.docker commit containerID pack/bsp:toolchained
lihat tautan ini di cara mendapatkan containerID yang tepattahap 4: kontainer telah diperbarui dengan pemasangan lokal serta telah dimasukkan ke dalam gambar yang baru ditugaskan (yang memiliki tag tujuan ditambahkan). sekarang aman untuk berhenti menjalankan kontainer. contoh:
docker stop packbsp-cont
stage5: setiap saat wadah dengan instalasi lokal harus dijalankan, mulailah dengan gambar yang sebelumnya disimpan. contoh:
docker run -d -t pack/bsp:toolchained
sumber
jawaban yang brilian di sini Bagaimana melanjutkan buruh pelabuhan yang keluar dari pengguna kg
Baris kedua itu sangat penting. Jadi exec digunakan sebagai ganti run, dan bukan pada gambar tetapi pada containerid. Dan Anda melakukannya setelah wadah sudah dimulai.
sumber
Tidak ada satu pun jawaban yang membahas tujuan dari pilihan desain ini. Saya pikir buruh pelabuhan bekerja dengan cara ini untuk mencegah 2 kesalahan ini:
sumber