1. Docker Nedir?
Docker, uygulamaları izole ve taşınabilir hale getiren bir platformdur. Uygulamalar ve bağımlılıkları, Docker container’larında paketlenir ve bu container’lar her türlü işletim sistemi veya bulut altyapısında çalıştırılabilir. Docker’ın sağladığı bu taşınabilirlik, uygulamaların bir sunucudan başka bir sunucuya sorunsuz bir şekilde taşınmasına olanak tanır.
2. Neden Docker Container Taşıma İhtiyacı Duyulur?
Çeşitli senaryolarda Docker container’larını bir sistemden başka bir sisteme taşımak gerekebilir:
- Geliştirme ortamından test ya da prodüksiyon ortamına geçiş yaparken,
- Bir sunucuyu değiştirme veya yükseltme sırasında,
- Uygulamanın bir Linux sunucusundan bir Windows sunucusuna aktarılması gerektiğinde.
Bu taşıma işlemi sırasında, Docker container imajlarını ve bu container’larla bağlı volume’leri eksiksiz bir şekilde taşımalısınız.
3. Taşıma İşlemleri için Script Yapısı
Şimdi bu taşıma işlemini iki farklı senaryo için gerçekleştirecek script’ler oluşturalım. Birinci senaryomuzda Linux’tan Linux’a taşıma, İkinci senaryomuzda Windows üzerinden Linux’tan Windows’a taşıma işlemini gerçekleştirelim.
Öncelikle taşımak istediğimiz container adını ve image bilgilerini alalım ve container çalışır durumda ise durduralım.
#bu komut ile sistemimize kurulu olan tüm container'ların listesini alalım
docker ps -a
Örnek olarak container adımız mywebcontainer ve container imagesi mywebimage olsun. Çalışıyor ise container’imizi aşağıdaki komut ile durduralım.
#çalışan containeri durdur
docker stop mywebcontainer
Container’ a bağlı volume’lar ve kullanılar portları öğrenmek için aşağıdaki komutu kullanalım.
docker inspect mywebcontainer
Bu komut Json yapısında container ile ilgili bilgiler verecektir. Burada bize gerekli olan volume ve port ayarlarını not edelim.
"Mounts": [
{
"Type": "volume",
"Name": "mywebvolume",
"Source": "/var/lib/docker/volumes/mywebvolume/_data",
"Destination": "/app/data",
"Driver": "local",
"Mode": "rw",
"RW": true,
"Propagation": ""
}
]
..
"Ports": {
"80/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "8080"
}
],
"443/tcp": null
}
Gereken bilgileri topladıktan sonra scriptlerimizi hazırlayalım.
3.1 Linux’tan Linux’a Taşıma
Linux sunucular arasında Docker container ve volume taşımak için aşağıdakine benzer bash script’i kullanabilirsiniz. Bu script, mevcut container’dan yeni bir Docker imajı oluşturur (Bunun nedeni container içinde yapmış olduğumuz değişikliklerin veya kurulan uygulamaların aktarılmasının sağlanmasıdır), imajı ve volume’ü yedekler, yedeklenen dosyaları hedef sunucuya kopyalar ve orada container’ı tekrar oluşturur.
Bir editor uygulaması ile aşağıdaki script’i oluşturalım. Bunun için nano veya vim kullanabilirsiniz.
nano transfer_container.sh
Aşağıdaki script’i editörümüze kopyalayıp değişkenler üzerinde kendi sistemimize göre değişiklikleri yaptıktan sonra kayıt edip çıkalım.
#!/bin/bash
# Değişkenleri tanımla
SOURCE_CONTAINER="mywebcontainer"
SOURCE_IMAGE="mywebimage"
UPDATED_IMAGE_TAG="updated"
VOLUME_NAME="mywebvolume"
DESTINATION_SERVER="root@hedef sunucu ip adresi" # Kullanıcı adımız örneğimizde root olsun
DESTINATION_PATH="/root/tmp"
IMAGE_FILE="mywebimage_updated.tar"
VOLUME_FILE="mywebvolume.tar.gz"
CONTAINER_PORT="80"
CONTAINER_INTERNAL_PORT="8080"
VOLUME_MOUNT_PATH="/app"
# 1. Güncel imajı oluştur
echo "Container'dan yeni imaj oluşturuluyor..."
docker commit $SOURCE_CONTAINER "$SOURCE_IMAGE:$UPDATED_IMAGE_TAG"
# 2. İmajı sıkıştır
echo "Güncellenmiş imaj sıkıştırılıyor..."
docker save -o $IMAGE_FILE "$SOURCE_IMAGE:$UPDATED_IMAGE_TAG"
# 3. Volume'ü sıkıştır
echo "Volume sıkıştırılıyor..."
tar -czvf $VOLUME_FILE -C /var/lib/docker/volumes/$VOLUME_NAME _data
# 4. İmaj ve volume'u hedef sunucuya kopyala
echo "İmaj ve volume dosyaları hedef sunucuya aktarılıyor..."
scp $IMAGE_FILE $VOLUME_FILE $DESTINATION_SERVER:$DESTINATION_PATH
# 5. Hedef sunucuda imajı ve volume'u aç
echo "Hedef sunucuda imaj ve volume açılıyor..."
ssh -t $DESTINATION_SERVER << EOF
docker load -i $DESTINATION_PATH/$IMAGE_FILE
mkdir -p /var/lib/docker/volumes/$VOLUME_NAME/_data
tar -xzvf $DESTINATION_PATH/$VOLUME_FILE -C /var/lib/docker/volumes/$VOLUME_NAME
docker run -d --name $SOURCE_CONTAINER -p $CONTAINER_PORT:$CONTAINER_INTERNAL_PORT -v $VOLUME_NAME:$VOLUME_MOUNT_PATH $SOURCE_IMAGE:$UPDATED_IMAGE_TAG
EOF
# 6. Temizlik işlemi
echo "Geçici dosyalar temizleniyor..."
rm -f $IMAGE_FILE $VOLUME_FILE
echo "İşlem tamamlandı. Container başarıyla taşındı ve hedef sunucuda başlatıldı."
Oluşturduğumuz script’e çalışma izni vermemiz gerekiyor.
#script e çalışma izni ver
chmod +x transfer_container.sh
Ardından script’imizi çalıştırıp taşıma işlemini gerçekleştirelim.
#script i çalıştır
./transfer_container.sh
Bu script, taşıma işlemlerini otomatik hale getirir. Öne çıkan adımlar:
- Dosyaların aktarımı ve açılması: SCP kullanılarak hedef sunucuya dosyalar gönderilir ve orada tekrar açılarak yeni container başlatılır.
- Container’dan yeni bir imaj oluşturuluyor: docker commit komutuyla mevcut container’ın güncel haliyle bir imaj oluşturulur.
- Volume ve imaj dosyaları sıkıştırılıyor: tar komutu ile volume dosyaları sıkıştırılır ve docker save ile imaj tar dosyası olarak kaydedilir
3.2 Linux’tan Windows’a Taşıma
Eğer bir Docker container’ını Linux sunucusundan Windows sunucusuna taşımak istiyorsanız, işlem adımları benzer olacak ancak bazı değişiklikler gerekecektir. Özellikle volume verilerinin Windows’a uygun bir dizine taşınması gerekecek.
Aşağıda, PowerShell üzerinden Linux makinedeki container ve volume’ü yedekleyen ve ardından Windows makinesine aktararak container’ı başlatan bir örnek script verilmiştir:
Öncesinde powershell’i yönetici olarak çalıştırın. ardından notepad ile uzantısı .ps1 olacak şekilde script dosyanızı oluşturun. Script dosyamız docker_transfer.ps1 olsun.
# Değişkenleri tanımla
$SOURCE_LINUX_SERVER = "root@kaynakip adresi" # Linux makine IP adresi ve kullanıcı
$SOURCE_CONTAINER = "mywebcontainer"
$SOURCE_IMAGE = "mywebimage"
$UPDATED_IMAGE_TAG = "updated"
$VOLUME_NAME = "mywebvolume"
$LINUX_VOLUME_PATH = "/var/lib/docker/volumes/$VOLUME_NAME/_data"
$WINDOWS_VOLUME_MOUNT_PATH = "C:\docker_volumes\asos_extern_test"
$IMAGE_FILE = "C:\docker_backup\mywebimage_updated.tar"
$VOLUME_FILE = "C:\docker_backup\mywebvolume.tar.gz"
$CONTAINER_PORT = 80
$CONTAINER_INTERNAL_PORT = 8080
$VOLUME_MOUNT_PATH = "/app"
$LINUX_BACKUP_PATH = "/root/docker_backup"
# 1. Linux makineden imaj ve volume dosyalarını yedekle ve aktar
Write-Host "Linux makinede container'dan yeni imaj oluşturuluyor..."
ssh $SOURCE_LINUX_SERVER "docker commit $SOURCE_CONTAINER $SOURCE_IMAGE:$UPDATED_IMAGE_TAG"
Write-Host "Güncellenmiş imaj sıkıştırılıyor..."
ssh $SOURCE_LINUX_SERVER "docker save -o $LINUX_BACKUP_PATH/mywebimage_updated.tar $SOURCE_IMAGE:$UPDATED_IMAGE_TAG"
Write-Host "Volume sıkıştırılıyor..."
ssh $SOURCE_LINUX_SERVER "tar -czvf $LINUX_BACKUP_PATH/mywebvolume.tar.gz -C /var/lib/docker/volumes/$VOLUME_NAME _data"
Write-Host "Yedek dosyaları Windows makineye aktarılıyor..."
scp $SOURCE_LINUX_SERVER:$LINUX_BACKUP_PATH/mywebimage_updated.tar $IMAGE_FILE
scp $SOURCE_LINUX_SERVER:$LINUX_BACKUP_PATH/mywebvolume.tar.gz $VOLUME_FILE
# 2. Windows makinede imaj ve volume dosyalarını aç
Write-Host "Windows makinede imaj ve volume açılıyor..."
docker load -i $IMAGE_FILE
# Windows üzerinde volume dizinini oluştur
if (-Not (Test-Path -Path $WINDOWS_VOLUME_MOUNT_PATH)) {
Write-Host "Volume dizini oluşturuluyor..."
New-Item -ItemType Directory -Path $WINDOWS_VOLUME_MOUNT_PATH
}
Write-Host "Volume dosyası çıkarılıyor..."
tar -xzvf $VOLUME_FILE -C $WINDOWS_VOLUME_MOUNT_PATH
# 3. Windows makinede container'ı başlat
Write-Host "Container başlatılıyor..."
docker run -d --name $SOURCE_CONTAINER -p $CONTAINER_PORT:$CONTAINER_INTERNAL_PORT -v $WINDOWS_VOLUME_MOUNT_PATH:$VOLUME_MOUNT_PATH $SOURCE_IMAGE:$UPDATED_IMAGE_TAG
# 4. Temizlik işlemi (İstersen dosyaları temizleyebilirsin)
Write-Host "Geçici dosyalar temizleniyor..."
Remove-Item $IMAGE_FILE
Remove-Item $VOLUME_FILE
Write-Host "İşlem tamamlandı. Container başarıyla taşındı ve Windows sunucuda başlatıldı."
Script’i çalıştırabilmek için PowerShell script çalıştırma ilkelerini kontrol edin. Varsayılan olarak, script’lerin çalıştırılmasına izin verilmez. Bunu geçici olarak şu komutla değiştirebilirsiniz ve ardından çalıştırabilirsiniz.
Set-ExecutionPolicy RemoteSigned #geçici izin verme
.\docker_transfer.ps1 #çalıştırma
Açıklamalar
- PowerShell’de SSH ve SCP: Windows’da PowerShell’de SSH ve SCP komutlarını kullanarak Linux sunucuya bağlanıyor ve dosyaları yedekliyoruz. Bunun için Windows 10 ve üzeri işletim sistemlerinde SSH istemcisinin yüklü olduğundan emin olun.
- Docker Komutları: Linux makinede Docker komutları
ssh
üzerinden çalıştırılıyor ve yedekleme işlemi yapılır. İmaj ve volume dosyaları Windows makineyescp
ile aktarılıyor. - Volume Mount: Windows’da Docker volume dosyasını doğru bir dizine çıkarıp ardından container oluştururken bu volume’ü mount ediyoruz.
Gereksinimler
- PowerShell SSH Client: Windows üzerinde SSH ve SCP komutlarını çalıştırabilmek için
OpenSSH Client
yüklü olmalıdır. BunuSettings > Apps > Optional Features
altında bulabilirsiniz. - Docker for Windows: Windows üzerinde Docker Desktop yüklü olmalıdır.
4. Sonuç
Bu script yapıları ile Docker container’larını Linux sunucular arasında ya da Linux’tan Windows’a taşımak oldukça kolay hale geliyor. Docker imajlarını ve volume’lerini taşırken, imajlarınızı güncelleyebilir, volume’lerinizi eksiksiz yedekleyebilir ve herhangi bir ortamda hızla yeni bir container oluşturabilirsiniz.
Bu yöntem, Docker’ın sağladığı taşınabilirlik avantajlarını tam anlamıyla kullanarak, sunucular arasında sorunsuz geçişler sağlar.
Bir yanıt bırakın