GNU/Linux >> Belajar Linux >  >> Panels >> Docker

Panduan Definitif tentang Pencadangan dan Pemulihan Wadah Docker [Pendekatan Cloud + Lokal untuk Server Mandiri]

Seperti yang mungkin pernah Anda dengar ungkapan cadangan tidak baik jika tidak dapat dipulihkan .

Ada berbagai cara untuk melakukan pencadangan file penting Anda di server cloud. Namun yang juga penting adalah Anda selalu memiliki salinan terbaru dari file tersebut di lokal . Anda sistem.

Mencadangkannya di cloud tidak masalah. Tetapi cadangan yang sebenarnya hanyalah salinan yang baru dan diperbarui secara berkala yang tersedia di pihak Anda setiap saat. Mengapa? Karena ini adalah data ANDA!

Dua tantangan yang akan saya tangani dalam hal ini adalah :

  1. Perlunya menghentikan kontainer Docker di server produksi untuk menghindari kemungkinan kerusakan data (terutama database) saat melakukan pencadangan. File pada wadah produksi langsung terus ditulis.
  2. Menghentikan container Docker juga mengakibatkan waktu henti, dan Anda tidak dapat melakukannya, terutama jika Anda sedang dalam produksi.

Masalah ini dapat diatasi dengan menggunakan cluster alih-alih server tunggal. Tapi di sini, Saya fokus pada server tunggal dan bukan cluster untuk menjaga pengeluaran layanan cloud serendah mungkin.

Saya terus bertanya-tanya bagaimana cara menangani dua tantangan di atas. Kemudian saya tersadar bahwa kita dapat menggunakan kombinasi cloud dan solusi lokal.

Yang saya maksud dengan solusi berbasis cloud adalah layanan backup yang disediakan oleh penyedia layanan cloud seperti Linode, Digital Ocean dan lainnya. Dalam panduan ini, saya akan menggunakan Linode.

Dengan solusi yang dilokalkan, maksud saya penggunaan baris perintah atau alat berbasis GUI untuk mengunduh cadangan dari server cloud ke sistem/desktop lokal Anda. Di sini, saya menggunakan sftp (berbasis perintah).

Pertama, saya akan membahas cara melakukan backup diikuti dengan cara mengembalikannya juga.

Prosedur Pencadangan Berbasis Cloud + Lokal

Mari kita lihat prosedur pencadangannya terlebih dahulu.

Aktifkan pencadangan di server produksi Linode (jika Anda belum melakukannya)

Jika Anda menggunakan server produksi di Linode, sangat disarankan agar Anda mengaktifkan pencadangan untuknya setiap kali pertama kali digunakan. Disebut "nanode", hadir dengan RAM 1 GB dan menawarkan paket pencadangan berikut:

Semua solusi pencadangan lainnya menawarkan fitur serupa tetapi dengan tarif yang lebih tinggi. Pastikan Anda mengaktifkannya.

Ambil snapshot manual sebagai cadangan di cloud

Masukkan tanggal untuk referensi di masa mendatang. Di sini, saya menyebutnya "manual-snapshot-11-05-21".

Segera setelah Anda mengkliknya, Anda akan dimintai konfirmasi:

Saat mengonfirmasi, Anda akan menemukan notifikasi di bagian bawah di sebelah kanan:

Anda dapat memantau perkembangannya di halaman yang sama, di sebelahnya tertulis bahwa server Anda sedang berjalan (kiri atas):

Setelah selesai, Anda akan melihat cadangan sebagai yang keempat dalam daftar.

Klon server produksi

Meskipun Anda dapat langsung mengkloning server (berdasarkan pencadangan terjadwal sebelumnya) dari panel Linode, saya sarankan Anda menggunakan pencadangan manual seperti yang dibahas pada langkah di atas.

Jadi, untuk melanjutkan membuat klon berdasarkan cadangan manual terbaru yang Anda buat, pastikan Anda mengikuti petunjuk di bawah ini:

Buka panel Linode dan klik "Buat":

Pilih "Linode":

Pilih tab "Cadangan":

Perhatikan bahwa snapshot yang Anda ambil didasarkan pada Linode 2 GB. Pilih snapshot manual yang baru saja Anda buat:

Sekarang, pastikan Anda memilih spesifikasi yang sama (Paket Linode 2 GB) untuk klon Anda:

Setelah Anda membuat server baru berdasarkan cadangan server produksi, Anda akan memiliki tiruan dari server produksi yang tersedia untuk Anda.

Login ke clone melalui ssh dan hentikan semua container

Anda seharusnya tidak mengalami masalah saat masuk ke klon baru melalui ssh karena menggunakan kunci publik yang sama dengan server produksi. Anda hanya perlu menggunakan IP baru klon. Saya berasumsi Anda menggunakan ssh saja dan otentikasi berbasis kata sandi dinonaktifkan, bukan? Baca panduan keamanan ssh ini jika Anda belum melakukannya.

Setelah login, hentikan semua container yang datanya ingin Anda backup. Biasanya, Anda akan pindah ke direktori aplikasi masing-masing dan menggunakan perintah docker-compose down. Pada lingkungan produksi biasa, Anda selalu diharapkan untuk menggunakan Docker Compose alih-alih docker stop konvensional perintah yang sebaiknya dipilih selama pengujian saja.

Misalnya, jika saya menjalankan Ghost dengan wadah basis data yang sesuai, pertama-tama saya akan memeriksa informasinya masing-masing:

[email protected]:~$ docker ps
CONTAINER ID   IMAGE                                    COMMAND                  CREATED        STATUS       PORTS                                      NAMES
6a3aafe12434   ghost:4.4.0                              "docker-entrypoint.s…"   7 days ago     Up 7 days    2368/tcp                                   ghost_ghost_2
95c560c0dbc7   jrcs/letsencrypt-nginx-proxy-companion   "/bin/bash /app/entr…"   6 weeks ago    Up 10 days                                              letsencrypt-proxy-companion
6679bd4596ba   jwilder/nginx-proxy                      "/app/docker-entrypo…"   6 weeks ago    Up 10 days   0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   jwilder-nginx-proxy
1770dbb5ba32   mariadb:10.5.3                           "docker-entrypoint.s…"   3 months ago   Up 10 days                                              ghost_db_1

Seperti yang Anda lihat di sini, nama wadahnya adalah ghost_ghost_2 dan ghost_db_1 masing-masing berjalan di bawah proxy terbalik. Ayo hentikan mereka.

[email protected]:~$ cd ghost
[email protected]:~/ghost$ docker-compose down
Stopping ghost_ghost_2 ... done
Stopping ghost_db_1    ... done
Network net is external, skipping
[email protected]:~/ghost$ 

Jika Anda memiliki lebih banyak aplikasi yang berjalan di belakang konfigurasi proxy terbalik nginx, gunakan prosedur yang sama dengan nama direktori masing-masing yang ditetapkan untuk aplikasi. Hentikan mereka semua satu per satu.

Volume dan setelan cadangan sebagai arsip gzip

Sekarang mari kita lihat proses pencadangan manual.

Cadangkan volume bernama

Saat Anda berurusan dengan volume Docker bernama, catat apakah volume telah dibuat secara manual atau apakah itu didasarkan pada konfigurasi Docker Compose generik, aplikasi pertama kali di-deploy.

Konfigurasi umum di bagian volume terlihat seperti:

volumes:
  ghost:
  ghostdb:

Skenario di atas dikelola oleh Docker Compose, dan nama volume aktual yang Anda perlukan untuk pencadangan adalah ghost_ghost dan ghost_ghostdb .

Jika volume dibuat secara manual dengan docker volume create volume-name , konfigurasinya akan terlihat seperti berikut dan benar-benar menjadi ghost dan ghostdb sendirian:

volumes:
  ghost:
    external: true
  ghostdb:
    external: true

Meskipun demikian, Anda harus mencadangkannya dalam kedua kasus, dan Anda juga perlu memeriksa jalur pada wadah saat volume dipasang. Misalnya, pada konfigurasi Ghost biasa dengan MariaDB, jalur dapat diketahui dengan melihat subbagian volume di dalam definisi layanan. Berikut kutipan untuk menunjukkan kepada Anda apa yang saya maksud:

    ghostdb:
        volumes:
            - ghostdb:/var/lib/mysql

Konfigurasi di atas adalah bagian dari layanan database dan container terkait yang akan dibuat setelah di-deploy.

Demikian pula, untuk layanan hantu itu sendiri, jalurnya adalah /var/lib/ghost/content :

    ghost:
        volumes:
            - ghost:/var/lib/ghost/content

Anda perlu mengetahui jalur ini untuk mencadangkan volume Anda.

Gunakan docker volume ls perintah untuk memeriksa ulang nama volume yang ada di server kloning.

[email protected]:~/ghost$ docker volume ls
DRIVER    VOLUME NAME
local     ghost
local     ghostdb
local     nginx-with-ssl_acme
local     nginx-with-ssl_certs
local     nginx-with-ssl_dhparam
local     nginx-with-ssl_html
local     nginx-with-ssl_vhost

Jadi, Anda dapat mengonfirmasi bahwa volumenya memang ghost dan ghostdb .

Waktu untuk mendukung mereka! Pada klon produksi, sekarang mari kita buat direktori cadangan di dalam direktori pengguna Anda:

mkdir ~/backup

Sekarang, saya akan menggunakan perintah berikut untuk mencadangkan konten volume di dalam arsip tar:

docker run --rm -v ghostdb:/var/lib/mysql -v ~/backup:/backup ubuntu bash -c "cd /var/lib/mysql && tar cvzf /backup/ghostdb.tar.gz ."

Pada perintah di atas, dengan -v atau --volume , saya memasang volume buruh pelabuhan yang ada ke wadah Ubuntu baru dan juga mengikat mount direktori cadangan yang baru saja saya buat. Kemudian, saya pindah ke direktori database di dalam wadah dan menggunakan tar untuk mengarsipkan isinya. --rm digunakan untuk membersihkan container secara otomatis dan menghapus sistem filenya saat container keluar (karena Anda menginginkannya hanya selama pekerjaan pencadangan atau pemulihan selesai).

Perhatikan titik di akhir perintah di atas sebelum kutipan (") berakhir. Ini memastikan arsip menyertakan apa yang ada di dalam /var/lib/ghost/content sendiri dan tidak termasuk seluruh jalur itu sendiri sebagai sub-direktori. Yang terakhir akan menyebabkan masalah saat memulihkan arsip ke volume baru di server baru. Jadi, harap diingat.

Sekarang, saya memiliki arsip volume database MariaDB yang digunakan oleh blog Ghost kami. Demikian pula, saya telah membuat cadangan volume hantu juga:

docker run --rm -v ghost:/var/lib/ghost/content -v ~/backup:/backup ubuntu bash -c "cd /var/lib/ghost/content && tar cvzf /backup/ghost.tar.gz ."

Ingatlah bahwa perintah pencadangan di atas didasarkan pada volume eksternal yang awalnya dibuat secara manual. Untuk volume umum yang dibuat dan dikelola oleh Docker Compose, nama volume sebenarnya adalah ghost_ghost dan ghost_ghostdb masing-masing. Misalnya, untuk ghost_ghostdb , ghost awalan mengacu pada nama direktori aplikasi tempat Anda memiliki file konfigurasi Docker Compose dan ghostdb mengacu pada nama volume yang telah Anda atur dalam konfigurasi Docker Compose Anda.

Setelan cadangan dengan atau tanpa pengikat ikatan

Perhatikan juga bahwa Anda harus mengarsipkan direktori penulisan ghost docker terlepas dari apakah Anda menggunakan bind mount atau volume bernama karena file konfigurasi Anda disimpan di sini.

Jika Anda menggunakan bind mount dan tidak bernama volume Docker, seluruh direktori akan diarsipkan termasuk bind mount. Di sini, saya menyebutnya ghost-docker-compose.tar.gz untuk menghindari kebingungan:

[email protected]:~/ghost$ sudo tar cvzf ~/backup/ghost-docker-compose.tar.gz .

Volume yang dipasang mengikat tidak memerlukan bagian volume terpisah dalam file Docker Compose. Mereka hanya ingin yang berikut ini ketika didefinisikan di dalam layanan:

    ghost:
        volumes:
            - ./ghost:/var/lib/ghost/content

Demikian pula, volume basis data yang dipasang di bind akan terlihat seperti:

    ghostdb:
        volumes:
            - ./ghostdb:/var/lib/mysql

"./" menunjukkan direktori yang dipasang di bind di dalam direktori hantu yang sama dengan yang baru saja kita "cd" d. Oleh karena itu, Anda membuat cadangan lengkap semua file dalam kasus ini (termasuk volume dan file konfigurasi).

Backup bind dipasang seperti volume bernama

Sebagai alternatif, Anda juga dapat membuat cadangan satu per satu bind mount. Ini memberi Anda opsi untuk memilih apakah Anda ingin server baru Anda memiliki pengikatan terpasang atau konfigurasi volume bernama di Docker. Alasannya, arsip dicadangkan dengan cara yang sama seperti volume bernama yang dibahas di atas. Untuk melakukannya, Anda perlu "cd" ke direktori aplikasi dan database (bind mounts) satu per satu.

cd ~/ghost/ghost
sudo tar cvzf ~/backup/ghost.tar.gz .
cd ~/ghost/ghostdb
sudo tar cvzf ~/backup/ghostdb.tar.gz .

Baik bind mount maupun volume bernama memiliki pro dan kontra sendiri. Pertanyaan tentang mana di antara mereka yang paling ideal bervariasi dari satu aplikasi ke aplikasi lainnya. Misalnya, pengembang Nextcloud menyarankan volume bernama, sedangkan pengembang Rocket.Chat menyarankan pengikatan.

Selanjutnya, inilah saatnya Anda mengambil arsip tersebut di akhir Anda.

Unduh arsip ke sistem lokal Anda menggunakan sftp

Menggunakan sftp, Anda dapat langsung mengunduh arsip Anda ke sistem lokal Anda. Di sini saya menggunakan port 4480 dan IP 12.3.1.4 sebagai contoh. Ini merujuk ke port yang sama yang digunakan oleh ssh.

[email protected]:~$ sftp -oPort=4480 [email protected]
Connected to 12.3.1.4.
sftp> get /home/avimanyu/backup/ghost.tar.gz /home/user/Downloads
Fetching /home/avimanyu/backup/ghost.tar.gz to /home/user/Downloads/ghost.tar.gz
/home/avimanyu/backup/ghost.tar.gz                                                                                                                                                                                                                                                         100%  233MB   6.9MB/s   00:34    
sftp> get /home/avimanyu/backup/ghostdb.tar.gz /home/user/Downloads
Fetching /home/avimanyu/backup/ghostdb.tar.gz to /home/user/Downloads/ghostdb.tar.gz
/home/avimanyu/backup/ghostdb.tar.gz                                                                                                                                                                                                                                                       100%   26MB   6.5MB/s   00:03  
sftp> get /home/avimanyu/backup/ghost-docker-compose.tar.gz /home/user/Downloads
Fetching /home/avimanyu/backup/ghost-docker-compose.tar.gz to /home/user/Downloads/ghost-docker-compose.tar.gz
/home/avimanyu/backup/ghost-docker-compose.tar.gz                                                                                                                                                                                                                                          100%  880     6.0KB/s   00:00
sftp> exit
[email protected]:~$

Seperti yang Anda lihat di sini, get perintah di sftp jauh lebih cepat dari rsync atau scp . Sekali unduhan selesai, Anda akan diperlihatkan prompt sftp di mana Anda dapat memasukkan exit dan keluar dari konsol sftp. File yang diunduh akan tersedia di /home/user/Downloads .

Pada titik ini, Anda dapat mengatakan bahwa Anda telah mengambil cadangan lengkap dari aplikasi buruh pelabuhan Anda.

Tapi seperti yang harus saya katakan lagi, tidak ada gunanya kecuali Anda dapat memulihkannya.

Prosedur Pemulihan

Sekarang setelah Anda mengetahui cara melakukan pencadangan, sekarang saatnya untuk melihat cara memulihkan dari pencadangan.

Buat server baru di awan

Buat server baru yang segar dari dasbor layanan Cloud Anda. Saya membahas ini di bagian cadangan kami. Di Linode, tampilannya seperti:

Disarankan untuk menjaga spesifikasi server tetap sama dengan server asli tempat arsip dicadangkan (disebutkan sebelumnya).

Unggah arsip cadangan ke server baru

Dengan asumsi Anda sekarang dapat masuk ke server baru berdasarkan pengaturan ssh yang disimpan di penyedia layanan cloud Anda, unggah file ke server dengan put sftp perintah:

[email protected]:~$ sftp -oPort=4480 [email protected]
Connected to 12.3.1.5.
sftp> put /home/user/Downloads/ghostdb.tar.gz /home/avimanyu
Uploading /home/user/Downloads/ghostdb.tar.gz to /home/avimanyu/ghostdb.tar.gz
/home/iborg/Downloads/ghostdb.tar.gz                                                                                                                                                                                                                                                       100%   26MB   6.2MB/s   00:04    
sftp> put /home/user/Downloads/ghost.tar.gz /home/avimanyu
Uploading /home/user/Downloads/ghost.tar.gz to /home/avimanyu/ghost.tar.gz
/home/iborg/Downloads/ghost.tar.gz                                                                                                                                                                                                                                                         100%  233MB   7.2MB/s   00:32  
sftp> put /home/user/Downloads/ghost-docker-compose.tar.gz /home/avimanyu
Uploading /home/user/Downloads/ghost-docker-compose.tar.gz to /home/avimanyu/ghost-docker-compose.tar.gz
/home/iborg/Downloads/ghost-docker-compose.tar.gz                                                                                                                                                                                                                                          100%  880    22.6KB/s   00:00 
sftp> exit
[email protected]:~$ 

Jika Anda lebih suka menggunakan GUI untuk mengunggah, Anda masih dapat menggunakan FileZilla.

Pulihkan pengaturan dan volume

Pertama, pulihkan direktori penulisan buruh pelabuhan dari konfigurasi Ghost Anda.

mkdir ghost
cd ghost
sudo tar xvf ~/backup/ghost-docker-compose.tar.gz

Sebagai alternatif, Anda juga dapat mencoba memulihkan kepemilikan pengguna (izin telah dipertahankan) yang mungkin berguna saat memulihkan direktori yang dipasang di bind (sudah ada di arsip), dengan --same-owner :

sudo tar --same-owner -xvf ~/backup/ghost-docker-compose.tar.gz

Jika Anda ingin mengandalkan Docker Compose untuk mengelola volume baru, buatlah terlebih dahulu. Sesuai diskusi kami di bagian volume cadangan di atas, Anda jelas harus mengikuti konvensi penamaan yang diperlukan:

docker volume create ghost_ghost
docker volume create ghost_ghostdb

Jika Anda ingin menetapkannya sebagai eksternal dalam konfigurasi Docker Compose Anda, namanya harus berbeda (revisi dua perintah di atas):

docker volume create ghost
docker volume create ghostdb

Untuk memulihkan volume MariaDB untuk Ghost:

docker run --rm -v ghostdb:/restore -v ~/backup:/backup ubuntu bash -c "cd /restore && tar xvf /backup/ghostdb.tar.gz"

Untuk memulihkan volume Ghost itu sendiri:

docker run --rm -v ghost:/restore -v ~/backup:/backup ubuntu bash -c "cd /restore && tar xvf /backup/ghost.tar.gz"

Pastikan pengaturan DNS dipulihkan berdasarkan IP baru

Karena Anda menggunakan server baru, IP pasti telah berubah dan karenanya harus direvisi untuk domain Anda. Anda dapat memeriksa prasyarat buruh pelabuhan proxy terbalik nginx ini sebagai referensi yang telah dibahas.

Luncurkan penampung baru dengan setelan yang diperlukan dan volume yang dipulihkan

Sekarang luncurkan kembali konfigurasi di server baru:

docker-compose up -d

Jika Anda mengikuti semua petunjuk di atas dengan tekun, Anda sekarang akan memiliki aplikasi web Docker yang dipulihkan sepenuhnya berdasarkan cadangan Anda.

Hancurkan Klon

Setelah Anda yakin bahwa tujuan Anda tercapai, memiliki klon tidak lagi diperlukan kecuali Anda ingin menyimpannya untuk pengujian. Jadi jika Anda tidak menginginkannya lagi, harap hapus Linode (PERIKSA GANDA!):

Pemikiran Terakhir

Sudah banyak solusi yang memanfaatkan cara-cara seperti itu secara part dan part. Tapi itu menuntut waktu henti karena kontainer harus dihentikan. Tantangan tersebut diatasi dengan menggunakan cadangan cloud dari klon produksi dan bukan dari server produksi itu sendiri.

Alih-alih menggunakan server tambahan 24/7 sebagai kluster untuk pencadangan tanpa waktu henti, kami hanya menggunakannya sebentar untuk memastikan hal yang sama. Ini memungkinkan FinOps yang lebih baik.

Jika Anda lebih suka menggunakan GUI untuk mengunduh atau mengunggah cadangan, Anda dapat menggunakan sftp melalui FileZilla.

Karena Anda mencadangkan file di server kloning dan bukan di server produksi itu sendiri, Anda menghemat waktu aktif yang berharga, selain menghindari cegukan tak terduga yang mungkin Anda temui selama proses. Sejujurnya, Anda dapat bebas dari kekhawatiran dan bermain-main dengannya tanpa ketegangan sama sekali karena Anda tidak menyentuh server produksi;)

Tidak dapat disangkal bahwa seluruh prosesnya cukup komprehensif, tetapi itu pasti menjaga tujuan kami. Melihat lebih jauh, prosedur ini juga dapat sepenuhnya otomatis di masa mendatang, dengan sinkronisasi yang cermat antara cloud dan sistem lokal Anda.

Jika Anda memiliki saran lebih lanjut tentang pencadangan dan pemulihan Docker tanpa waktu henti, silakan bagikan pemikiran Anda di bagian di bawah ini. Umpan balik atau komentar lainnya sangat diharapkan.


Docker
  1. Menjalankan PostgreSQL di Docker, Panduan Cepat dan Praktis

  2. Host Banyak Situs Web di Docker Containers

  3. Cara Menginstal Docker dan Menjalankan Wadah Docker di Ubuntu

  1. Panduan untuk Meningkatkan ke MongoDB 5.0 dan Rocket.Chat 4.0 di Docker

  2. Aturan cadangan 3-2-1 untuk cloud

  3. Cara mencadangkan dan memulihkan wadah Docker

  1. Apa itu Docker Container:Panduan Pengantar untuk Pemula

  2. Cara Mengekspor dan Mengimpor Kontainer Docker

  3. Cara Menjeda dan Melanjutkan Wadah Docker