Pertanyaan Cara menangani penyimpanan persisten (mis. Database) di Docker


Bagaimana orang menangani penyimpanan persisten untuk kontainer Docker Anda?

Saat ini saya menggunakan pendekatan ini: buat gambar, mis. untuk PostgreSQL, dan kemudian mulai wadah dengan

docker run --volumes-from c0dbc34fd631 -d app_name/postgres

IMHO, yang memiliki kelemahan, bahwa saya tidak boleh (oleh kecelakaan) menghapus kontainer "c0dbc34fd631".

Ide lain adalah dengan me-mount volume host "-v" ke dalam wadah, namun, identitas pengguna dalam wadah tidak selalu sesuai dengan identitas pengguna dari host, lalu izin mungkin kacau.

Catatan: Alih-alih --volumes-from 'cryptic_id' Anda juga bisa menggunakan --volumes-from my-data-container dimana my-data-container adalah nama yang Anda tetapkan ke penampung data saja, mis. docker run --name my-data-container ... (lihat jawaban yang diterima)


837
2017-08-28 19:45


asal


Jawaban:


Docker 1.9.0 ke atas

Menggunakan API volume

docker volume create --name hello
docker run -d -v hello:/container/path/for/volume container_image my_command

Ini berarti bahwa pola wadah hanya-data harus ditinggalkan demi volume baru.

Sebenarnya API volume hanya cara yang lebih baik untuk mencapai apa pola wadah data.

Jika Anda membuat penampung dengan -v volume_name:/container/fs/path Docker secara otomatis akan membuat volume bernama untuk Anda yang dapat:

  1. Dicantumkan melalui docker volume ls
  2. Diidentifikasi melalui docker volume inspect volume_name
  3. Didukung sebagai direktori normal
  4. Didukung seperti sebelumnya melalui --volumes-from koneksi

API volume baru menambahkan perintah yang berguna yang memungkinkan Anda mengidentifikasi volume yang menggantung:

docker volume ls -f dangling=true

Lalu hapus melalui namanya:

docker volume rm <volume name>

Seperti yang dituliskan oleh @mpugach di komentar, Anda dapat membuang semua volume yang menjuntai dengan satu baris yang bagus:

docker volume rm $(docker volume ls -f dangling=true -q)
# Or using 1.13.x
docker volume prune

Docker 1.8.x dan di bawah

Pendekatan yang tampaknya berfungsi paling baik untuk produksi adalah menggunakan a hanya wadah data.

Satu-satunya wadah data dijalankan pada gambar barebone dan sebenarnya tidak melakukan apa-apa kecuali memaparkan volume data.

Kemudian Anda dapat menjalankan penampung lain untuk memiliki akses ke volume penampung data:

docker run --volumes-from data-container some-other-container command-to-execute
  • Sini Anda bisa mendapatkan gambaran yang bagus tentang bagaimana mengatur wadah yang berbeda.
  • Sini ada wawasan yang baik tentang cara kerja volume.

Di posting blog ini ada deskripsi yang bagus tentang apa yang disebut kontainer sebagai pola volume yang menjelaskan poin utama dari memiliki hanya wadah data.

Dokumentasi Docker sekarang memiliki deskripsi DEFINITIVE dari kontainer sebagai volume / s pola.

Berikut ini adalah prosedur backup / restore untuk Docker 1.8.x dan di bawah.

CADANGAN:

sudo docker run --rm --volumes-from DATA -v $(pwd):/backup busybox tar cvf /backup/backup.tar /data
  • --rm: hapus wadah saat keluar
  • --volume-from DATA: lampirkan ke volume yang dibagikan oleh penampung DATA
  • -v $ (pwd): / backup: bind mount direktori saat ini ke dalam wadah; untuk menulis file tar
  • busybox: gambar kecil yang lebih sederhana - bagus untuk perawatan cepat
  • tar cvf /backup/backup.tar / data: membuat file tar terkompresi dari semua file di direktori / data

MENGEMBALIKAN:

# Create a new data container
$ sudo docker run -v /data -name DATA2 busybox true
# untar the backup files into the new container᾿s data volume
$ sudo docker run --rm --volumes-from DATA2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar
data/
data/sven.txt
# Compare to the original container
$ sudo docker run --rm --volumes-from DATA -v `pwd`:/backup busybox ls /data
sven.txt

Ini bagus sekali artikel dari Brian Goff yang luar biasa menjelaskan mengapa baik menggunakan gambar yang sama untuk sebuah wadah dan wadah data.


885
2017-12-18 07:50



Di Docker melepaskan v1.0, mengikat mount file atau direktori pada mesin host dapat dilakukan dengan perintah yang diberikan:

$ docker run -v /host:/container ...

Volume di atas dapat digunakan sebagai penyimpanan persisten pada host yang menjalankan Docker.


58
2017-10-29 10:30



Pada Docker Compose 1.6, sekarang ada peningkatan dukungan untuk volume data di Docker Compose. File tulis berikut ini akan membuat gambar data yang akan bertahan antara restart (atau bahkan penghapusan) kontainer induk:

Berikut adalah pengumuman blog: Compose 1.6: File Compose baru untuk mendefinisikan jaringan dan volume

Berikut ini contoh file penulisan:

version: "2"

services:
  db:
    restart: on-failure:10
    image: postgres:9.4
    volumes:
      - "db-data:/var/lib/postgresql/data"
  web:
    restart: on-failure:10
    build: .
    command: gunicorn mypythonapp.wsgi:application -b :8000 --reload
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    links:
      - db

volumes:
  db-data:

Sejauh yang saya bisa mengerti: Ini akan membuat wadah volume data (db_data) yang akan bertahan antara restart.

Jika Anda menjalankan: docker volume ls Anda harus melihat volume Anda terdaftar:

local               mypthonapp_db-data
...

Anda dapat memperoleh beberapa detail lebih lanjut tentang volume data:

docker volume inspect mypthonapp_db-data
[
  {
    "Name": "mypthonapp_db-data",
    "Driver": "local",
    "Mountpoint": "/mnt/sda1/var/lib/docker/volumes/mypthonapp_db-data/_data"
  }
]

Beberapa pengujian:

# Start the containers
docker-compose up -d

# .. input some data into the database
docker-compose run --rm web python manage.py migrate
docker-compose run --rm web python manage.py createsuperuser
...

# Stop and remove the containers:
docker-compose stop
docker-compose rm -f

# Start it back up again
docker-compose up -d

# Verify the data is still there
...
(it is)

# Stop and remove with the -v (volumes) tag:

docker-compose stop
docker=compose rm -f -v

# Up again ..
docker-compose up -d

# Check the data is still there:
...
(it is).

Catatan:

  • Anda juga dapat menentukan berbagai driver di volumes blok. Misalnya, Anda dapat menentukan driver Flocker untuk db_data:

    volumes:
      db-data:
        driver: flocker
    
  • Ketika mereka meningkatkan integrasi antara Docker Swarm dan Docker Compose (dan mungkin mulai mengintegrasikan Flocker ke dalam sistem eko ​​Docker (saya mendengar desas-desus bahwa Docker telah membeli Flocker), saya pikir pendekatan ini akan menjadi semakin kuat.

Penolakan: Pendekatan ini menjanjikan, dan saya menggunakannya dengan sukses dalam lingkungan pengembangan. Saya akan khawatir untuk menggunakan ini dalam produksi dulu!


23
2018-04-15 08:15



Jika tidak jelas dari pembaruan 5 dari jawaban yang dipilih, seperti pada Docker 1.9, Anda dapat membuat volume yang dapat ada tanpa dikaitkan dengan penampung tertentu, sehingga membuat pola "wadah hanya data" menjadi usang.

Lihat Kontainer hanya-data usang dengan buruh pelabuhan 1.9.0? # 17798.

Saya pikir pengelola Docker menyadari pola wadah hanya-data adalah sedikit bau desain dan memutuskan untuk membuat volume menjadi entitas terpisah yang dapat ada tanpa wadah terkait.


15
2018-02-15 16:47



Sementara ini masih menjadi bagian dari Docker yang membutuhkan pekerjaan, Anda harus meletakkan volume di Dockerfile dengan instruksi VOLUME jadi Anda tidak perlu menyalin volume dari penampung lain.

Itu akan membuat kontainer Anda kurang saling bergantung dan Anda tidak perlu khawatir tentang penghapusan satu kontainer yang memengaruhi yang lain.


11
2017-09-12 19:10



Jawaban @ tommasop bagus, dan menjelaskan beberapa mekanisme penggunaan wadah hanya-data. Tetapi sebagai seseorang yang pada awalnya mengira bahwa wadah data adalah konyol ketika seseorang dapat mengikat volume ke host (seperti yang disarankan oleh beberapa jawaban lainnya), tetapi sekarang menyadari bahwa sebenarnya hanya data yang cukup rapi, saya dapat menyarankan milik saya sendiri. posting blog tentang topik ini: Mengapa Docker Data Containers (Volumes!) Baik

Lihat juga: Jawabanku untuk pertanyaan "Apa cara (terbaik) untuk mengelola izin untuk volume bersama Docker?"untuk contoh bagaimana menggunakan wadah data untuk menghindari masalah seperti perizinan dan pemetaan uid / gid dengan host.

Untuk mengatasi salah satu kekhawatiran asli OP: bahwa wadah data tidak boleh dihapus. Bahkan jika penampung data dihapus, data itu sendiri tidak akan hilang selama ada penampung yang memiliki referensi ke volume itu, yaitu penampung apa pun yang memasang volume melalui --volumes-from. Jadi kecuali semua kontainer terkait dihentikan dan dihapus (orang dapat menganggap ini setara dengan kecelakaan rm -fr /) datanya aman. Anda selalu dapat membuat ulang wadah data dengan melakukan --volumes-from wadah apa pun yang memiliki referensi ke volume itu.

Seperti biasa, buatlah backup!

PERBARUI: Docker sekarang memiliki volume yang dapat dikelola secara terpisah dari kontainer, yang selanjutnya membuatnya lebih mudah dikelola.


8
2017-11-21 15:32



Saat menggunakan Docker Tulis, cukup lampirkan volume yang dinamai, misalnya,

version: '2'
services:
  db:
    image: mysql:5.6
    volumes:
      - db_data:/var/lib/mysql:rw
    environment:
      MYSQL_ROOT_PASSWORD: root
volumes:
  db_data:

8
2018-01-31 09:27