Saya kehilangan data saya ketika wadah keluar

394

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.

iman
sumber
10
Itu tidak bisa disebut " wadah keluar ", Anda hanya membuat wadah baru, menggunakan kata keluar dapat membingungkan banyak (saya bingung karena itu juga).
Mohammed Noureldin
1
@MohammedNoureldin, Anda benar, keluar tidak benar, tapi ini persis apa yang Anda, saya dan orang lain pikirkan. Jadi itu kata yang lebih baik dalam pertanyaan, hasil edit Anda membuat pertanyaan menjadi jawaban! Pencari baru tidak akan menemukan di sini!
Iman
Pada titik awal saya dengan Docker, saya berpikir bahwa sebenarnya karena pertanyaan ANDA, saya menemukan bahwa alamat itu SALAH. judul baru ditinjau dan diterima, saya tidak mengerti mengapa seseorang harus bersikeras pada judul yang salah, itu adalah pertanyaan Anda, dan keputusan Anda.
Mohammed Noureldin
3
Saya setuju dengan @MohammedNoureldin. Kombinasi dari judul spesifik, contoh dan jawaban yang diterima tidak membantu pembaca masa depan dan terutama pemula memahami 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? :-)
tgogos
2
Saya memiliki masalah ini ... setiap kali Anda keluar, Anda harus memulai wadah Anda tidak menjalankannya ... menjalankan gambar agane membuat wadah baru ini akan membantu buruh pelabuhan mulai <container id> buruh pelabuhan melampirkan <container id>
fatemeh

Jawaban:

399

Anda perlu melakukan perubahan yang Anda buat pada wadah dan kemudian menjalankannya. Coba ini:

sudo docker pull ubuntu

sudo docker run ubuntu apt-get install -y ping

Lalu dapatkan id wadah menggunakan perintah ini:

sudo docker ps -l

Mengkomit perubahan pada wadah:

sudo docker commit <container_id> iman/ping 

Kemudian jalankan wadah:

sudo docker run iman/ping ping www.google.com

Ini seharusnya bekerja.

Unferth
sumber
9
Jadi saya harus menggunakan komit setelah setiap run untuk menyimpan data.
iman
5
Komit harus digunakan hanya ketika Anda membuat PERUBAHAN dalam wadah (seperti memasang alat atau data baru) sehingga perubahan tersebut disimpan dan saat berikutnya Anda menjalankan wadah baru dari Gambar itu, itu akan mulai dari titik penyimpanan terakhir atau berkomitmen, menjaga data Anda.
Unferth
7
@Unferth bagaimana jika saya ingin terus melakukan perubahan? Sejauh ini ia menciptakan lebih banyak gambar <none>. Bagaimana saya terus menambahkan komit di atas gambar yang ada?
Marconi
62
Perubahan yang dilakukan secara bertahap bukanlah "cara buruh pelabuhan". Gunakan DOCKERFILE.
user2105103
23
Bagaimana komitmen Anda dari dalam wadah? Pertimbangkan skenario berikut: 1) Saya menjalankan wadah seperti ini: buruh pelabuhan menjalankan -i -t myimage / bin / bash 2) Saya membuat beberapa perubahan 3) Saya tidak dapat melakukan dari dalam wadah, jadi ketika saya keluar dari wadah, saya akan kehilangan semua data saya, tanpa memiliki kesempatan untuk melakukan perubahan sebelumnya
qgicup
375

Ketika Anda menggunakan docker rununtuk 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.

docker start f357e2faab77 # restart it in the background
docker attach f357e2faab77 # reattach the terminal & stdin
Zeiss
sumber
89
docker pshanya menunjukkan Anda menjalankan wadah buruh pelabuhan. docker ps -amenunjukkan 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.
user1278519
2
Pertanyaan tolong, jadi jika saya mengunduh jenkinsserver 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 menggunakan jenkinsburuh pelabuhan misalnya untuk memudahkan instalasi jenkins saya di CI?
Jas
2
@Jas Jika Anda tetap pada wadah yang sama dan tidak membuat yang baru, tidak ada masalah. Docker saat ini memiliki kebijakan mulai ulang, sehingga Anda dapat mengonfigurasinya untuk memulai ulang wadah yang sama pada saat reboot mesin. Saya juga menyarankan Anda untuk menempatkan rumah jenkins Anda ke dalam volume untuk dapat mengaksesnya dari luar (backup dll).
ZeissS
7
Berikut cara mudah untuk menyalin file dari wadah begitu Anda keluar:docker cp $(docker ps -alq):/path/to/file .
Josh Habdas
3
Anda juga dapat memulai dan melampirkan wadah dengan namanya. (mis. docker run -it --name my_debian debiandan setelah docker start my_debian && docker attach my_debian)
Johnny Willer
128

Ada beberapa cara berikut untuk bertahan data wadah:

  1. Volume buruh pelabuhan

  2. Docker melakukan

    a) membuat wadah dari gambar ubuntu dan menjalankan terminal bash.

       $ docker run -i -t ubuntu:14.04 /bin/bash
    

    b) Di dalam terminal, pasang ikal

       # apt-get update
       # apt-get install curl
    

    c) Keluar dari terminal kontainer

       # exit
    

    d) Catat id kontainer Anda dengan menjalankan perintah berikut:

       $ docker ps -a
    

    e) menyimpan wadah sebagai gambar baru

       $ docker commit <container_id> new_image_name:tag_name(optional)
    

    f) verifikasi bahwa Anda dapat melihat gambar baru Anda dengan ikal terpasang.

       $ docker images           
    
       $ docker run -it new_image_name:tag_name bash
          # which curl
            /usr/bin/curl
    
kalyani chaudhari
sumber
Apakah perlu exitsebelumnya docker commit? Terima kasih.
Abhishek Anand
2
@AbhishekAndan ya, karena dengan docker runperintah Anda menjalankan bash di wadah dan Anda tetap di sana karena -idan -topsi (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 harus exit(atau Ctrl + D) shell penampung. Perhatikan juga #dan $dalam jawaban, yang menunjukkan cangkang yang berbeda dengan perintah yang dituliskan.
Erik
Pertanyaan cepat: Jika saya tidak melakukan, saya kehilangan data. Itu sudah jelas. Tetapi ketika saya mengubah konfigurasi nginx, mengapa tetap diperbarui? (tidak perlu komit) @Erik
grep
@grep jika Anda memiliki MWE yang jelas dan dapat direproduksi, tanyakan pertanyaan baru tentang hal itu, jika belum ada satu pun tentang kasus penggunaan khusus ini.
Erik
3. docker stopdiikuti oleh docker start.
carillonator
59

Selain jawaban Unferth , disarankan untuk membuat Dockerfile .

Di direktori kosong, buat file bernama "Dockerfile" dengan konten berikut.

FROM ubuntu
RUN apt-get install ping
ENTRYPOINT ["ping"]

Buat gambar menggunakan Dockerfile . Mari kita gunakan tag sehingga kita tidak perlu mengingat nomor gambar heksadesimal.

$ docker build -t iman/ping .

Dan kemudian jalankan gambar dalam wadah.

$ docker run iman/ping stackoverflow.com
salathe
sumber
1
Tidak harus melakukannya secara manual lebih dari satu kali adalah titik yang tepat dari buruh pelabuhan. Buat buruh pelabuhan, komit dan unggah gambar yang dihasilkan. Tarik kata gambar ke depan.
Brandon Bertelsen
11

Saya sudah mendapat jawaban yang lebih sederhana untuk pertanyaan Anda, jalankan dua perintah berikut

sudo docker run -t -d ubuntu --name mycontainername /bin/bash
sudo docker ps -a

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'.

sudo docker exec -ti mycontainername bash

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 curldi 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:

sudo docker start mycontainername

sudo docker exec -ti mycontainername bash

Contoh lain dengan port dan ruang bersama yang diberikan di bawah ini:

docker run -t -d --name mycontainername -p 5000:5000 -v ~/PROJECTS/SPACE:/PROJECTSPACE 7efe2989e877 /bin/bash

Dalam kasus saya: 7efe2989e877 - adalah imageid dari wadah berjalan sebelumnya yang saya peroleh menggunakan

buruh pelabuhan ps -a

Magnus Melwin
sumber
4
Dengan Docker 18.09.2 di Ubuntu 18.04 tidak berfungsi sebagaimana mestinya. Ini berfungsi jika saya meletakkan --nameopsi dan sebelum nama gambar, seperti ini:docker run --name mycontainername -t -d ubuntu /bin/bash
Stéphane Gourichon
9

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

Kudzanayi Mutamba
sumber
3

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

Cam T
sumber
3

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:

  • Gambar buruh pelabuhan dapat :
    1. dibuat-dari-wadah-yang diberikan
    2. dihapus
    3. digunakan-untuk-membuat-jumlah-dari-wadah
  • Wadah buruh pelabuhan dapat :
    1. dibuat-dari-an-gambar
    2. mulai
    3. berhenti
    4. dimulai kembali
    5. dihapus
    6. digunakan-untuk-membuat-berapa pun jumlah gambar
  • Perintah buruh pelabuhan menjalankan ini :
    1. Unduh gambar atau gunakan gambar yang di-cache
    2. Membuat wadah baru darinya
    3. Mulai wadah
  • Ketika Dockerfile digunakan untuk membuat gambar :
    1. Sudah diketahui bahwa gambar pada akhirnya akan digunakan untuk menjalankan wadah buruh pelabuhan.
    2. Setelah mengeluarkan perintah membangun buruh pelabuhan, buruh pelabuhan di belakang layar membuat wadah berjalan dengan sistem file-dasar dan mengikuti langkah-langkah di dalam Dockerfile untuk mengkonfigurasi wadah itu sesuai kebutuhan pengembang.
    3. Setelah wadah dikonfigurasi dengan spesifikasi Dockerfile, wadah tersebut akan dikomit sebagai gambar.
    4. Gambar bersiap-siap untuk rock & roll!

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 --alluntuk 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 runperintah, 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 runperintah & perhatikan baik-baik .

kiran dahibhate
sumber
1

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 --norcagar 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:toolchainedlihat tautan ini di cara mendapatkan containerID yang tepat

tahap 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

Oleg Kokorin
sumber
1

jawaban yang brilian di sini Bagaimana melanjutkan buruh pelabuhan yang keluar dari pengguna kg

docker start $(docker ps -a -q --filter "status=exited")
(or in this case just docker start $(docker ps -ql) 'cos you don't want to start all of them)

docker exec -it <container-id> /bin/bash

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.

barlop
sumber
0

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:

  • Restart berulang
  • Kesalahan sebagian
Minh Nghĩa
sumber