Setelah mengevaluasi jawaban dan mempelajari topik yang ingin saya rangkum.
Cara Docker untuk memutakhirkan kontainer tampaknya sebagai berikut:
Wadah aplikasi tidak boleh menyimpan data aplikasi . Dengan cara ini Anda dapat mengganti wadah aplikasi dengan versi yang lebih baru kapan saja dengan menjalankan sesuatu seperti ini:
docker pull mysql
docker stop my-mysql-container
docker rm my-mysql-container
docker run --name=my-mysql-container --restart=always \
-e MYSQL_ROOT_PASSWORD=mypwd -v /my/data/dir:/var/lib/mysql -d mysql
Anda dapat menyimpan data di host (dalam direktori yang dipasang sebagai volume) atau dalam wadah khusus data saja . Baca lebih lanjut tentang itu
Meng-upgrade aplikasi (mis. Dengan peningkatan yum / apt-get) dalam wadah dianggap sebagai anti-pola . Wadah aplikasi seharusnya tidak berubah , yang akan menjamin perilaku yang dapat direproduksi. Beberapa gambar aplikasi resmi (khususnya mysql: 5.6) bahkan tidak dirancang untuk memperbarui sendiri (pemutakhiran apt-get tidak akan berfungsi).
Saya ingin mengucapkan terima kasih kepada semua orang yang memberikan jawaban mereka, sehingga kami dapat melihat semua pendekatan yang berbeda.
Yaroslav Stavnichiy
sumber
docker rename my-mysql-container trash-container
sebelum membuat yang baru?Saya tidak suka memasang volume sebagai tautan ke direktori host, jadi saya membuat pola untuk memutakhirkan wadah buruh pelabuhan dengan wadah yang sepenuhnya dikelola buruh pelabuhan. Membuat wadah buruh pelabuhan baru dengan
--volumes-from <container>
akan memberikan wadah baru dengan gambar yang diperbarui milik bersama volume yang dikelola buruh pelabuhan.Dengan tidak segera menghapus yang asli
my_mysql_container
, Anda memiliki kemampuan untuk kembali ke wadah yang dikenal jika wadah yang ditingkatkan tidak memiliki data yang tepat, atau gagal dalam tes kewarasan.Pada titik ini, saya biasanya akan menjalankan skrip cadangan apa pun yang saya miliki untuk wadah untuk memberi saya jaring pengaman jika terjadi kesalahan
Sekarang Anda memiliki kesempatan untuk memastikan data yang Anda harapkan ada di wadah baru dan menjalankan pemeriksaan kewarasan.
Volume buruh pelabuhan akan bertahan selama wadah apa pun menggunakannya, sehingga Anda dapat menghapus wadah asli dengan aman. Setelah wadah asli dihapus, wadah baru dapat mengasumsikan senama dari aslinya untuk membuat semuanya seindah itu dimulai.
Ada dua keuntungan utama menggunakan pola ini untuk meningkatkan wadah buruh pelabuhan. Pertama, ini menghilangkan kebutuhan untuk me-mount volume ke direktori host dengan memungkinkan volume untuk langsung ditransfer ke kontainer yang ditingkatkan. Kedua, Anda tidak pernah dalam posisi di mana tidak ada wadah buruh pelabuhan yang berfungsi; jadi jika pemutakhiran gagal, Anda dapat dengan mudah kembali ke cara kerjanya sebelumnya dengan memutar wadah buruh pelabuhan yang asli lagi.
sumber
./postgres-data/:/var/lib/postgres/data
- yaitu memasang dir host./postgres-data/
, di dalam wadah PostgreSQL saya.)Hanya untuk memberikan jawaban yang lebih umum (bukan spesifik mysql) ...
Sinkronisasi dengan registri gambar layanan ( https://docs.docker.com/compose/compose-file/#image ):
Menciptakan wadah jika file atau gambar pembuat galangan telah berubah:
Pengelolaan gambar wadah adalah salah satu alasan untuk menggunakan komposisi buruh pelabuhan (lihat https://docs.docker.com/compose/reference/up/ )
Aspek manajemen data juga dicakup oleh komposisi buruh pelabuhan melalui "volume" eksternal yang terpasang (Lihat https://docs.docker.com/compose/compose-file/#volumes ) atau wadah data.
Hal ini membuat potensi kompatibilitas mundur dan masalah migrasi data tidak tersentuh, tetapi ini adalah masalah "aplikatif", bukan spesifik Docker, yang harus diperiksa dengan catatan rilis dan pengujian ...
sumber
Saya ingin menambahkan bahwa jika Anda ingin melakukan proses ini secara otomatis (unduh, hentikan, dan mulai ulang wadah baru dengan pengaturan yang sama seperti yang dijelaskan oleh @Yaroslav) Anda dapat menggunakan WatchTower. Sebuah program yang secara otomatis memperbarui wadah Anda ketika mereka diubah https://github.com/v2tec/watchtower
sumber
Pertimbangkan untuk jawaban ini:
app_schema
app_db
root123
Cara memperbarui MySQL saat menyimpan data aplikasi di dalam wadah
Ini dianggap praktik yang buruk , karena jika Anda kehilangan wadah, Anda akan kehilangan datanya. Meskipun ini adalah praktik yang buruk, berikut adalah cara yang mungkin untuk melakukannya:
1) Lakukan dump database sebagai SQL:
2) Perbarui gambar:
3) Perbarui wadah:
4) Kembalikan dump database:
Cara memperbarui wadah MySQL menggunakan volume eksternal
Menggunakan volume eksternal adalah cara yang lebih baik untuk mengelola data, dan membuatnya lebih mudah untuk memperbarui MySQL. Kehilangan wadah tidak akan kehilangan data apa pun. Anda dapat menggunakan docker-compose untuk memfasilitasi mengelola aplikasi Docker multi-kontainer dalam satu host:
1) Buat
docker-compose.yml
file untuk mengelola aplikasi Anda:2) Perbarui MySQL (dari folder yang sama dengan
docker-compose.yml
file):Catatan: perintah terakhir di atas akan memperbarui gambar MySQL, membuat ulang dan memulai wadah dengan gambar baru.
sumber
docker-compose
, akankah ini berhasil? stackoverflow.com/a/31485685/65313volumes_from
kunci sekarang ditinggalkan (bahkan dihapus dalam versi 3 file penulisan) mendukungvolumes
kunci baru .docker pull image_uri:tag && docker restart container_running_that_image
bekerja untukku. Tidak perludocker-compose pull && docker-compose up -d
.Jawaban yang mirip dengan di atas
sumber
Inilah yang terlihat seperti menggunakan
docker-compose
saat membangun kebiasaanDockerfile
.docker build -t imagename:version .
Ini akan menyimpan versi baru Anda secara lokal.docker-compose down
docker-compose.yml
file Anda untuk mencerminkan nama gambar baru yang Anda atur pada langkah 1.docker-compose up -d
. Ini akan mencari gambar secara lokal dan menggunakan yang ditingkatkan.-EDIT-
Langkah-langkah saya di atas lebih verbal daripada yang seharusnya. Saya telah mengoptimalkan alur kerja saya dengan memasukkan
build: .
parameter ke file komposisi buruh pelabuhan saya. Langkah-langkahnya terlihat sekarang:docker-compose build
docker-compose up -d
Saya tidak menyadarinya saat itu, tetapi komposisi buruh pelabuhan cukup pintar untuk hanya memperbarui wadah saya ke gambar baru dengan satu perintah, daripada harus menurunkannya terlebih dahulu.
sumber
docker-compose up -d
tanpa harus menghentikan semuanya terlebih dahulu.Jika Anda tidak ingin menggunakan Docker Compose, saya dapat merekomendasikan portainer . Ini memiliki fungsi buat ulang yang memungkinkan Anda membuat ulang wadah sambil menarik gambar terbaru.
sumber
Anda harus membangun kembali semua gambar dan memulai kembali semua wadah, atau entah bagaimana memperbarui perangkat lunak dan memulai kembali database. Tidak ada jalur peningkatan tetapi Anda mendesain sendiri.
sumber
docker restart
perintah, tapi saya tidak yakin itu akan mengambil perubahan gambar. Dan apa yang terjadi pada data saya di dalam wadah?Mengambil dari http://blog.stefanxo.com/2014/08/update-all-docker-images-at-once/
Anda dapat memperbarui semua gambar Anda yang ada menggunakan pipa perintah berikut:
sumber
Pastikan Anda menggunakan volume untuk semua data persisten (konfigurasi, log, atau data aplikasi) yang Anda simpan di wadah terkait dengan keadaan proses di dalam wadah itu. Perbarui Dockerfile Anda dan bangun kembali gambar dengan perubahan yang Anda inginkan, dan mulai kembali wadah dengan volume Anda terpasang di tempat yang sesuai.
sumber
Ini adalah sesuatu yang juga saya perjuangkan untuk gambar saya sendiri. Saya memiliki lingkungan server tempat saya membuat gambar Docker. Ketika saya memperbarui server, saya ingin semua pengguna yang menjalankan kontainer berdasarkan gambar Docker saya untuk dapat meningkatkan ke server terbaru.
Idealnya, saya lebih suka membuat versi baru dari gambar Docker dan memiliki semua wadah berdasarkan versi sebelumnya dari gambar yang secara otomatis diperbarui ke gambar baru "di tempat." Tetapi mekanisme ini tampaknya tidak ada.
Jadi desain terbaik berikutnya yang dapat saya buat sejauh ini adalah menyediakan cara untuk memiliki pembaruan kontainer itu sendiri - mirip dengan bagaimana aplikasi desktop memeriksa pembaruan dan kemudian meningkatkannya sendiri. Dalam kasus saya, ini mungkin berarti membuat skrip yang melibatkan Git pull dari tag terkenal.
Gambar / wadah tidak benar-benar berubah, tetapi "internal" wadah itu berubah. Anda dapat membayangkan melakukan hal yang sama dengan apt-get, yum, atau apa pun yang sesuai untuk lingkungan Anda. Bersamaan dengan ini, saya akan memperbarui server saya: gambar terbaru dalam registri sehingga setiap wadah baru akan didasarkan pada gambar terbaru.
Saya akan tertarik mendengar apakah ada seni sebelumnya yang membahas skenario ini.
sumber
Memperbarui
Ini terutama untuk meminta wadah tidak memperbarui karena membangun gambar adalah cara yang harus dilakukan
Saya memiliki masalah yang sama sehingga saya membuat docker-run , alat baris perintah yang sangat sederhana yang berjalan di dalam container docker untuk memperbarui paket dalam kontainer yang sedang berjalan lainnya.
Ini menggunakan docker-py untuk berkomunikasi dengan menjalankan wadah buruh pelabuhan dan memperbarui paket atau menjalankan perintah tunggal sewenang-wenang
Contoh:
docker run --rm -v /var/run/docker.sock:/tmp/docker.sock itech/docker-run exec
secara default ini akan menjalankan
date
perintah di semua wadah yang berjalan dan mengembalikan hasil tetapi Anda dapat mengeluarkan perintah apa pun misalnyadocker-run exec "uname -a"
Untuk memperbarui paket (saat ini hanya menggunakan apt-get):
docker run --rm -v /var/run/docker.sock:/tmp/docker.sock itech/docker-run update
Anda dapat membuat dan alias dan menggunakannya sebagai baris perintah biasa misalnya
alias docker-run='docker run --rm -v /var/run/docker.sock:/tmp/docker.sock itech/docker-run'
sumber
apt update; apt upgrade
, gambar akan tumbuh.)