1. Adım: Proje Klasörünü Oluştur
Terraform, çalıştığı dizindeki .tf uzantılı dosyaları okuyarak işlem yapar. Bu yüzden temiz ve düzenli bir klasör oluşturuyoruz.
Komutlar:
mkdir ~/terraform-docker-demo
cd ~/terraform-docker-demoSonuç:
Artık şu konumda olmalısın:root@srv-netbox:~/terraform-docker-demo# (veya kendi kullanıcı adınla)
2. Adım: main.tf Dosyasını Oluştur
Terraform konfigürasyon dosyamızı (main.tf) oluşturuyoruz. Bu dosyada Docker provider’ını tanımlayıp, Nginx imajını ve bir konteyneri belirteceğiz.
Komut (tamamı tek blok halinde çalıştır):
cat <<EOF > main.tf
terraform {
required_providers {
docker = {
source = "kreuzwerker/docker"
version = "~> 3.0"
}
}
}
provider "docker" {}
resource "docker_image" "nginx" {
name = "nginx:latest"
keep_locally = false
}
resource "docker_container" "web" {
name = "terraform-nginx"
image = docker_image.nginx.image_id
ports {
internal = 80
external = 8080
}
}
EOFNe yapıyor?
- Docker provider’ını projeye ekler.
nginx:latestimajını çeker.terraform-nginxadlı bir konteyner başlatır ve sunucunun 8080 portunu konteynerin 80 portuna yönlendirir.
1. Adım: Proje Klasörünü Oluştur
Terraform, çalıştığı dizindeki .tf uzantılı dosyaları okuyarak işlem yapar. Bu yüzden temiz ve düzenli bir klasör oluşturuyoruz.
Komutlar:
mkdir ~/terraform-docker-demo
cd ~/terraform-docker-demo
Sonuç:
Artık şu konumda olmalısın:root@srv-netbox:~/terraform-docker-demo# (veya kendi kullanıcı adınla)
2. Adım: main.tf Dosyasını Oluştur
Terraform konfigürasyon dosyamızı (main.tf) oluşturuyoruz. Bu dosyada Docker provider’ını tanımlayıp, Nginx imajını ve bir konteyneri belirteceğiz.
Komut (tamamı tek blok halinde çalıştır):
cat <<EOF > main.tf
terraform {
required_providers {
docker = {
source = "kreuzwerker/docker"
version = "~> 3.0"
}
}
}
provider "docker" {}
resource "docker_image" "nginx" {
name = "nginx:latest"
keep_locally = false
}
resource "docker_container" "web" {
name = "terraform-nginx"
image = docker_image.nginx.image_id
ports {
internal = 80
external = 8080
}
}
EOF
Ne yapıyor?
- Docker provider’ını projeye ekler.
nginx:latestimajını çeker.terraform-nginxadlı bir konteyner başlatır ve sunucunun 8080 portunu konteynerin 80 portuna yönlendirir.
Hadi bu dosyayı parçalarına ayıralım:
Terraform Blok (Gereksinimler)
terraform {
required_providers {
docker = {
source = "kreuzwerker/docker"
version = "~> 3.0"
}
}
}
Terraform’un kendisi aslında Docker, AWS veya Azure’un nasıl çalıştığını bilmez. Onlarla konuşabilmek için “Provider” dediğimiz eklentilere ihtiyaç duyar.
source: Bu eklentiyi nereden indireceğini söyler (Terraform Registry).version: Hangi sürümü kullanacağını belirler.~> 3.0demek, “3.0 ve üstü ama 4.0 olmayan en güncel sürümü kullan” demektir.
Peki Source ve Version bilgilerini nereden buluruz ?
Terraform dünyasında her şeyin merkezi Terraform Registry adresidir. Burası, Terraform’un “kütüphanesidir”.
- Source Nereden Geliyor?: Registry’ye gidip arama kutusuna “Docker” yazdığında karşına çıkan ilk sonuç genellikle resmi veya en çok kullanılan topluluk paketidir.
kreuzwerker/dockerşu an Docker için standart kabul edilen provider’dır. Sayfasına girdiğinde sağ üst köşede “USE PROVIDER” butonu bulunur; ona tıkladığında sana tam olarak osourceveversionbloğunu kopyalaman için verir. - Hangi Versiyonu Seçmelisin?: Genelde en güncel (latest) ana sürümü seçmek iyidir. Eğer yeni başlıyorsan, Registry’deki en son sürüm numarasını (örneğin 3.0.12) yazabilirsin.
~> 3.0yazarsan, “3.x serisindeki en son özellikleri al ama 4.0 gelirse yapımı bozma, oraya geçme” demiş olursun.
Provider Blok (Bağlantı)
provider "docker" {}
Burada Terraform’a “Tamam, Docker eklentisini indirdik, şimdi bu eklentiyi kullan” diyorsun. Eğer Docker bir uzak sunucuda olsaydı, buraya IP adresi veya sertifika bilgilerini yazman gerekirdi. Boş bırakman, “benim bilgisayarımdaki (lokal) Docker’ı kullan” anlamına gelir.
Resource: Docker Image (Malzeme)
resource "docker_image" "nginx" {
name = "nginx:latest"
keep_locally = false
}
Bir konteyner çalıştırmak için önce imajına ihtiyacın var.
docker_image: Kaynağın tipi (Docker imajı)."nginx": Terraform içinde bu kaynağa verdiğin takma isim.keep_locally = false: Terraform’u sildiğinde (terraform destroy), bilgisayarındaki bu imaj dosyasının da temizlenmesini sağlar.
resource "docker_image" "nginx" Nedir?
Bu satırı bir kimlik kartı gibi düşünebilirsin.
docker_image(Resource Type): Bu bir anahtar (key) değeridir ama kafana göre belirleyemezsin. Bu, kullandığın Provider (Docker eklentisi) tarafından önceden tanımlanmıştır. “Ben Docker dünyasından bir imaj objesi oluşturmak istiyorum” demenin Terraform dilindeki karşılığıdır."nginx"(Local Name): Bu senin bu kaynağa verdiğin takma isimdir. Terraform içinde başka bir yerde bu imaja atıfta bulunmak istersen (örneğin konteyner oluştururken) bu ismi kullanırsın. Buna “ali”, “veli” de diyebilirsin ama “nginx” demek en mantıklısıdır.
name = "nginx:latest" Kısmı Nedir?
Buradaki name, Docker Hub üzerindeki gerçek imaj adıdır.
- Eğer buraya
ubuntu:latestyazsaydın, Terraform gidip Ubuntu imajını indirecekti. - Yani
docker_imagebloğu, aslında terminale yazdığındocker pull nginx:latestkomutunun Terraform’ca söylenmiş halidir.
Resource: Docker Container (Üretim)
resource "docker_container" "web" {
name = "terraform-nginx"
image = docker_image.nginx.image_id
ports {
internal = 80
external = 8080
}
}
İşte asıl işi yapan yer burası.
- Bağımlılık Hattı:
image = docker_image.nginx.image_idsatırı çok kritiktir. Burada Terraform’a şunu diyorsun: “Yukarıdakinginxisimli kaynaktan gelecek olanimage_idneyse onu kullan.” Bu sayede Terraform, önce imajı indirmesi gerektiğini otomatik anlar. - Portlar: Klasik Docker port yönlendirmesi. Docker’ın içindeki 80 portunu, senin bilgisayarındaki 8080 portuna bağlar.
Özetle Ne Oluyor?
terraform init: Gerekli Docker eklentisini indirir.terraform plan: “Ben bir imaj çekeceğim ve bir konteyner oluşturacağım, onaylıyor musun?” diye sana sorar.terraform apply: Kodu gerçeğe dönüştürür.- Önce Docker Hub’dan
nginx:latestimajını çeker. - Ardından bu imajı kullanarak
terraform-nginxisimli konteynerı başlatır.
- Önce Docker Hub’dan
3. Adım: Terraform’u Başlat (Init)
Terraform’un provider’ları (bu durumda Docker provider) indirmesi ve projeyi hazırlaması gerekir.
Komut:
terraform init
Beklenen Çıktı:
Initializing the backend...
Initializing provider plugins...
- Finding kreuzwerker/docker versions matching "~> 3.0"...
- Installing kreuzwerker/docker v3.x.x...
Terraform has been successfully initialized!
4. Adım: Plan Oluştur (Önizleme)
Terraform’un ne yapacağını önceden görmek için plan komutunu çalıştırıyoruz. Hiçbir değişiklik yapılmaz, sadece simülasyon gösterilir.
Komut:
terraform plan
Beklenen Çıktı (özet):
Plan: 2 to add, 0 to change, 0 to destroy.
+ resource "docker_image" "nginx" { ... }
+ resource "docker_container" "web" { ... }
Not: Bu aşamada Docker daemon’un çalışıyor ve erişilebilir olması gerekir.
5. Adım: Uygula (Apply)
Planı onaylayarak gerçek değişiklikleri yapıyoruz.
Komut:
terraform apply
Ne yapmalısın?
- Plan tekrar gösterilecek.
- En altta
Do you want to perform these actions?sorusu gelecek. yesyazıp Enter’a bas.
Beklenen Sonuç:
Apply complete! Resources: 2 added, 0 changed, 0 destroyed.
6. Adım: Sonuçları Doğrula
Oluşturulan konteynerin çalıştığını ve Nginx’in yanıt verdiğini kontrol edelim.
1. Çalışan konteynerleri listele:
docker ps
Beklenen:terraform-nginx adlı konteyner ve 0.0.0.0:8080->80/tcp port mapping’i görünmeli.
2. Nginx sayfasına istek at:
curl localhost:8080
Beklenen:
Nginx’in varsayılan hoş geldiniz HTML sayfası (uzun bir HTML çıktısı) gelmeli.
7. Adım: Kaynakları Yok Et (Destroy)
İşimiz bittiğinde oluşturduğumuz kaynakları temizlemek Terraform’un en güçlü özelliklerinden biridir.
Komut:
terraform destroy
Ne yapmalısın?
- Silinecek kaynakların planı gösterilecek.
Do you really want to destroy all resources?sorusunayesyazıp Enter’a bas.
Beklenen Sonuç:
Destroy complete! Resources: 2 destroyed.
Tebrikler! Tamamladığın Döngü (Terraform Lifecycle)
Bu demo ile şu temel döngüyü başarıyla uyguladın:
- Kod yaz →
main.tf(Infrastructure as Code) - Başlat →
terraform init - Planla →
terraform plan - Uygula →
terraform apply - Doğrula →
docker ps&curl - Temizle →
terraform destroy
Bu aynı döngü, ileride AWS EC2 instance’ları, VPC’ler, veritabanları veya Kubernetes cluster’ları yönetirken de kullanılacak. Altyapıyı kodla yönetmenin gücü burada yatıyor!
3. Adım: Terraform’u Başlat (Init)
Terraform’un provider’ları (bu durumda Docker provider) indirmesi ve projeyi hazırlaması gerekir.
Komut:
terraform initBeklenen Çıktı:
Initializing the backend...
Initializing provider plugins...
- Finding kreuzwerker/docker versions matching "~> 3.0"...
- Installing kreuzwerker/docker v3.x.x...
Terraform has been successfully initialized!4. Adım: Plan Oluştur (Önizleme)
Terraform’un ne yapacağını önceden görmek için plan komutunu çalıştırıyoruz. Hiçbir değişiklik yapılmaz, sadece simülasyon gösterilir.
Komut:
terraform planBeklenen Çıktı (özet):
Plan: 2 to add, 0 to change, 0 to destroy.
+ resource "docker_image" "nginx" { ... }
+ resource "docker_container" "web" { ... }Not: Bu aşamada Docker daemon’un çalışıyor ve erişilebilir olması gerekir.
5. Adım: Uygula (Apply)
Planı onaylayarak gerçek değişiklikleri yapıyoruz.
Komut:
terraform applyNe yapmalısın?
- Plan tekrar gösterilecek.
- En altta
Do you want to perform these actions?sorusu gelecek. yesyazıp Enter’a bas.
Beklenen Sonuç:
Apply complete! Resources: 2 added, 0 changed, 0 destroyed.6. Adım: Sonuçları Doğrula
Oluşturulan konteynerin çalıştığını ve Nginx’in yanıt verdiğini kontrol edelim.
1. Çalışan konteynerleri listele:
docker psBeklenen:terraform-nginx adlı konteyner ve 0.0.0.0:8080->80/tcp port mapping’i görünmeli.
2. Nginx sayfasına istek at:
curl localhost:8080Beklenen:
Nginx’in varsayılan hoş geldiniz HTML sayfası (uzun bir HTML çıktısı) gelmeli.
7. Adım: Kaynakları Yok Et (Destroy)
İşimiz bittiğinde oluşturduğumuz kaynakları temizlemek Terraform’un en güçlü özelliklerinden biridir.
Komut:
terraform destroyNe yapmalısın?
- Silinecek kaynakların planı gösterilecek.
Do you really want to destroy all resources?sorusunayesyazıp Enter’a bas.
Beklenen Sonuç:
Destroy complete! Resources: 2 destroyed.