- چطور میتوان یک کانتینر داکر را کامل و امن به سرور دیگر منتقل کرد؟
- کلیات و پیشنیازها
- استراتژیهای بکاپ و مهاجرت — انتخاب روش مناسب
- سناریو 1 — image محلی و volume نامدار (مثال وباپ + MySQL)
- سناریو 2 — کانتینر با bind mount (پوشه میزبان)
- سناریو 3 — مهاجرت بدون downtime برای دیتابیسهای حساس
- مقایسه گزینههای انتقال (مزایا/معایب)
- نکات امنیتی (بسیار مهم)
- نکات عملی و بهینهسازی برای دادههای بزرگ
- سازگاری Docker و نسخهها
- انتخاب لوکیشن و نوع سرور برای مهاجرت
- مثال کامل: انتقال وب + MySQL با docker-compose
- چکلیست نهایی قبل از cutover
- Часто задаваемые вопросы
چطور میتوان یک کانتینر داکر را کامل و امن به سرور دیگر منتقل کرد؟
بکاپ و انتقال کامل یک کانتینتر داکر شامل سه جزء اصلی است: изображение, data (volumes یا bind mounts) и پیکربندی/متادیتا. در این راهنما گامبهگام روشهای امن، کمخطا و قابل بازگشت برای مهاجرت سرویسهای کانتینری (از جمله وباپها و دیتابیسها) توضیح داده شدهاند.
کلیات و پیشنیازها
قبل از شروع مطمئن شوید که موارد زیر فراهم است:
- доступ по SSH به هر دو سرور با کاربر مناسب یا root.
- نصب Docker (و در صورت نیاز docker-compose) روی مبدا و مقصد. مثال نصب سریع:
curl -fsSL https://get.docker.com | sh
# or follow your distribution guide- بررسی فضای دیسک کافی برای آرشیوها.
- کلید SSH برای انتقال امن و ابزارهایی مثل rsync Или SCP-1811.
- برنامهریزی برای زمانبندی قطع سرویس یا روشهای کمقطعی.
دستورات اولیه جهت بررسی:
docker ps -a
docker volume ls
df -h
du -sh /var/lib/docker/volumes/*استراتژیهای بکاپ و مهاجرت — انتخاب روش مناسب
سه جزء اصلی برای انتقال کامل:
- Image کانتینر (کد/باینریها)
- دادههای پایدار (volumes یا bind mounts)
- پیکربندیها و متادیتا (docker-compose.yml, env files, شبکهها، secrets)
روشهای معمول:
- docker export / docker import: شامل فایلسیستم کانتینر است اما متادیتا و volumes نامدار را منتقل نمیکند.
- docker save / docker load: مناسب برای تصاویر ساختهشده (images).
- پشتیبانگیری از volumes به صورت tar و انتقال با rsync/scp یا آپلود به S3.
- استفاده از Registry خصوصی برای push/pull تصاویر.
- استفاده از ابزارهای مدیریت مثل docker-compose یا Kubernetes برای بازسازی سرویس با تعریفها.
سناریو 1 — image محلی و volume نامدار (مثال وباپ + MySQL)
فرض: کانتینر وب و MySQL با volume نامدار mysql_data. گامها به ترتیب:
۱) گرفتن image کانتینر
اگر image محلی دارید یا تغییرات در کانتینر صورت گرفته، ابتدا نام image و ID کانتینر را پیدا کنید و در صورت نیاز کانتینر را commit و save کنید.
docker ps --no-trunc --format '{{.Image}} {{.ID}}'
docker commit CONTAINER_ID myapp:backup-2026-07-14
docker save -o /tmp/myapp_backup_image.tar myapp:backup-2026-07-14۲) بکاپ volume نامدار
روش امن با یک helper container که محتویات volume را در میزبان tar میکند:
docker run --rm \
-v mysql_data:/data \
-v /tmp/backup:/backup \
ubuntu \
bash -lc "cd /data && tar czf /backup/mysql_data.tar.gz ."برای دادههای بزرگ میتوانید از فشردهساز سریعتر مثل zstd استفاده کنید:
docker run --rm -v mysql_data:/data -v /tmp/backup:/backup ubuntu bash -lc "cd /data && tar -I 'zstd -19' -cf /backup/mysql_data.tar.zst ."۳) بکاپ دیتابیس (ترجیحی)
برای اطمینان از سازگاری و یکپارچگی دیتابیس بهتر است dump منطقی بگیرید:
docker exec CONTAINER_ID sh -c 'exec mysqldump --all-databases --single-transaction -u root -p"$MYSQL_ROOT_PASSWORD"' > /tmp/all_databases.sqlОбъяснение: این روش وابستگی به فایلسیستمی volume را حذف کرده و dump منطقی سالم تولید میکند.
۴) انتقال به سرور مقصد
استفاده از rsync برای انتقال امن و قابل ادامه؛ بهویژه برای فایلهای بزرگ پیشنهاد میشود.
rsync -avP -e "ssh -p 22" /tmp/myapp_backup_image.tar user@target:/tmp/
rsync -avP -e "ssh -p 22" /tmp/mysql_data.tar.gz user@target:/tmp/یا سادهتر با scp:
scp /tmp/myapp_backup_image.tar user@target:/tmp/Примечание: برای انتقالهای بزرگ از rsync –partial –progress یا ابزارهایی مانند rclone به S3/MinIO استفاده کنید.
۵) بازیابی در سرور مقصد
بارگذاری image و ریستور volume سپس راهاندازی سرویس با docker-compose:
docker load -i /tmp/myapp_backup_image.tar
docker volume create --name mysql_data
docker run --rm -v mysql_data:/data -v /tmp/backup:/backup ubuntu bash -lc "cd /data && tar xzf /backup/mysql_data.tar.gz"اگر از dump SQL استفاده کردهاید، یک container موقتی mysql بسازید و import را انجام دهید:
docker run --name mysql-temp -e MYSQL_ROOT_PASSWORD=yourpassword -d mysql:8
cat /tmp/all_databases.sql | docker exec -i mysql-temp sh -c 'mysql -u root -p"$MYSQL_ROOT_PASSWORD"'سپس فایلهای docker-compose.yml و env را قرار داده و سرویس را بالا بیاورید:
docker-compose -f docker-compose.yml up -d۶) تست و بررسی
بررسی لاگها، صحت دادهها و checksumها را فراموش نکنید:
docker logs -f CONTAINER
sha256sum /tmp/mysql_data.tar.gz
sha256sum /tmp/backup/mysql_data.tar.gzسناریو 2 — کانتینر با bind mount (پوشه میزبان)
اگر کانتینر از bind mount استفاده میکند (مثلاً /srv/app/data روی میزبان)، کافی است مسیر میزبان را rsync یا tar کنید و روی مقصد همان مسیر را آماده و کانتینر را راهاندازی کنید.
rsync -avP -e "ssh" /srv/app/data/ user@target:/srv/app/data/سپس کانتینر روی مقصد را با همان bind mount path راهاندازی کنید.
سناریو 3 — مهاجرت بدون downtime برای دیتابیسهای حساس
برای کاهش قطعی سرویس:
- Replication (MySQL replication یا PostgreSQL streaming) پیادهسازی کنید و پس از همگامسازی، cutover انجام دهید.
- rsync اولیه و نهایی: rsync اولیه برای داده سنگین، سپس rsync نهایی با –inplace و –delete برای هماهنگسازی تغییرات کوچک.
rsync -azP --delete --inplace /var/lib/docker/volumes/mysql_data/_data/ user@target:/var/lib/docker/volumes/mysql_data/_data/پس از rsync نهایی، برای چند ثانیه سرویس را متوقف کرده و سپس آن را روی مقصد بالا بیاورید.
مقایسه گزینههای انتقال (مزایا/معایب)
- docker save/load: سریع برای تصاویر، اما شامل volumes نیست.
- docker export/import: شامل فایلسیستم کانتینری است ولی متادیتا و volumes را از دست میدهد.
- rsync روی volumes: کنترل دقیق و resume، اما نیاز به مدیریت و تست دارد.
- dump منطقی دیتابیس: قابلاعتماد و مناسب برای migration بین نسخههای مختلف DB.
- رجیستری خصوصی: بهترین روش برای توزیع تصاویر بین چند سرور؛ دادههای پایدار باید جداگانه منتقل شوند.
نکات امنیتی (بسیار مهم)
چند نکته امنیتی عملی:
- از SSH با کلید خصوصی محافظتشده و محدودیت دسترسی استفاده کنید.
- دادههای حساس را قبل از انتقال با ابزارهایی مثل gpg Или age رمزنگاری کنید. نمونه:
gpg --encrypt --recipient [email protected] /tmp/mysql_data.tar.gzپس از انتقال همیشه صحت فایلها را با sha256sum Проверять.
در مقصد قبل از بالا آوردن سرویس، فایروال و محدودیت پورت را بررسی کنید و در صورت نیاز دسترسیها را سختگیرانه تنظیم نمایید.
نکات عملی و بهینهسازی برای دادههای بزرگ
- فشردهسازی با zstd یا gzip با سطح مناسب: tar -I ‘zstd -19’ -cf backup.tar.zst /data
- استفاده از rsync با –partial برای resume در صورتی که اتصال ناپایدار است.
- برای انتقال چندین ترابایت، بررسی گزینه ارسال دیسک فیزیکی یا استفاده از object storage نزدیک به مقصد.
سازگاری Docker و نسخهها
قبل از مهاجرت نسخه Docker مبدا و مقصد را بررسی کنید. معمولاً images سازگارند اما برخی ویژگیهای جدید در Compose یا driverها ممکن است نیاز به تطبیق داشته باشند.
انتخاب لوکیشن و نوع سرور برای مهاجرت
انتخاب لوکیشن دیتاسنتر و نوع سرور به کاربرد بستگی دارد:
- ترید و فارکس: لوکیشن نزدیک به سرورهای صرافی برای کمترین پینگ.
- Игра: لوکیشنهای مناسب در Europe/US یا نزدیک به پلیرها با Anti-DDoS.
- Искусственный интеллект и рендеринг: سرورهای GPU و NVMe برای IO بالا.
- وبسایتها: سرور ابری با CDN و لوکیشن نزدیک به کاربران اصلی.
شرکت ما بیش از 85 لوکیشن جهانی، سرورهای GPU و شبکه BGP ارائه میدهد که میتواند نیازهای مختلف مهاجرت را پوشش دهد.
مثال کامل: انتقال وب + MySQL با docker-compose
خلاصه گامها:
- خروجی تنظیمات docker-compose و ساخت image محلی:
docker-compose -f docker-compose.yml config > /tmp/compose_config.yml
docker-compose build
docker save $(docker-compose images -q web) -o /tmp/web_image.tar- بکاپ volumes:
docker run --rm -v project_mysql:/data -v /tmp/backup:/backup ubuntu bash -lc "cd /data && tar czf /backup/mysql_data.tar.gz ."- انتقال فایلها با rsync به مقصد و سپس بازیابی و راهاندازی docker-compose روی مقصد.
چکلیست نهایی قبل از cutover
- بکاپ تصویر و volumes گرفته شده و checksum بررسی شده است.
- env و secrets امن شده یا در vault قرار گرفتهاند.
- نسخههای Docker و Compose بررسی شدهاند.
- شبکه و فایروال مقصد پیکربندی شدهاند.
- سناریوی rollback تعریف شده است.
- زمانبندی قطعی اطلاعرسانی شده و مانیتورینگ آماده است.








