Docker Compose ile yayına alma#
Elinizde bir docker-compose.yml varsa şanslısınız: uygulamanızın nasıl çalışacağını zaten tarif etmişsiniz demektir. Geriye üç şey kalıyor - sunucuya Docker kurmak, servisi kalıcı hale getirmek ve dışarıya güvenli biçimde açmak.
1. Docker kurun#
Dağıtımların kendi depolarındaki Docker paketi genelde eskidir; resmi kurulum betiğini kullanın.
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER
Grup değişikliğinin geçerli olması için oturumu kapatıp açın, sonra doğrulayın:
docker --version
docker compose version
docker run --rm hello-world
Morpheus ile
"sunucuma Docker ve Docker Compose kur"
docker-compose değil docker compose
Tire olan eski v1 sürümüdür ve artık desteklenmiyor. Modern sürüm boşluklu: docker compose up. Eski rehberlerde tireli hali görürseniz kafanız karışmasın.
2. Projeyi sunucuya alın#
sudo mkdir -p /opt/uygulamam
sudo chown -R $USER:$USER /opt/uygulamam
cd /opt/uygulamam
git clone https://github.com/kullanici/repo.git .
Ortam değişkenleri için .env dosyasını sunucuda oluşturun:
nano /opt/uygulamam/.env
chmod 600 /opt/uygulamam/.env
3. Portları içeri kapatın#
Bu sayfadaki en önemli adım ve en sık atlanan yer burası.
Bir compose dosyasında şunu yazarsanız:
ports:
- "8080:8080"
konteyner tüm ağ arayüzlerinde 8080'i dinler ve sunucunuzun IP'sine giden herkes doğrudan erişir. Firewall'unuz varsa bile bu genelde işe yaramaz, çünkü Docker kendi iptables kurallarını yazar ve ufw'yi baypas eder.
Docker ufw'yi baypas eder
Bu, gerçek bir olayla öğrendiğimiz bir kuraldır: ufw'de kapalı görünen bir port, Docker tarafından açılmış olabilir ve dışarıdan erişilebilir. Sunucuya yerleşen bir saldırgan için bu yeterlidir.
Çözüm: portu yalnızca yerel arayüze bağlayın.
ports:
- "127.0.0.1:8080:8080"
Böylece konteynere yalnızca sunucunun kendisi (yani Nginx) erişebilir. Dışarıya açılan tek kapı Nginx olur.
Doğrulayın:
sudo ss -tlnp | grep 8080
Çıktıda 127.0.0.1:8080 görmelisiniz, 0.0.0.0:8080 değil.
4. Ayağa kaldırın#
cd /opt/uygulamam
docker compose up -d
docker compose ps
docker compose logs -f --tail=100
-d arka planda çalıştırır. Logları izlemeyi Ctrl+C ile bırakabilirsiniz, konteynerler çalışmaya devam eder.
Morpheus ile
"/opt/uygulamam dizinindeki compose dosyasını ayağa kaldır ve logları göster"
5. Yeniden başlatmada otomatik kalksın#
Compose dosyanızdaki her servise ekleyin:
restart: unless-stopped
Bu, hem çökme hem de sunucu yeniden başlatma durumunu kapsar. Docker servisinin de açılışta başladığından emin olun:
sudo systemctl enable docker
Gerçekten çalıştığını test edin - sunucuyu yeniden başlatıp bakın:
sudo reboot
# bağlantı geri geldiğinde:
docker compose -f /opt/uygulamam/docker-compose.yml ps
6. Nginx ile dışarı açın#
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
sudo nginx -t && sudo systemctl reload nginx
sudo certbot --nginx -d example.com
Ayrıntı için Next.js sayfasının 4. ve 5. adımlarına bakabilirsiniz; mantık aynı.
Güncelleme#
cd /opt/uygulamam
git pull
docker compose pull
docker compose up -d
docker image prune -f
Son satır önemli: eski imajlar diski sessizce doldurur. Disk dolduğunda ne olacağını sorun giderme sayfasında anlatıyoruz.
Morpheus'a alışkanlık olarak öğretin
"bundan sonra 'uygulamayı güncelle' dediğimde /opt/uygulamam dizininde git pull, docker compose pull, docker compose up -d yap ve kullanılmayan imajları temizle"
Kontrol listesi#
- [ ]
docker compose ps→ tüm servislerUp - [ ]
sudo ss -tlnp→ uygulama portları yalnızca127.0.0.1üzerinde - [ ] Her serviste
restart: unless-stoppedvar - [ ]
sudo systemctl is-enabled docker→enabled - [ ] Yeniden başlatma sonrası site kendiliğinden geliyor
- [ ]
https://example.comkilit simgesiyle açılıyor - [ ]
docker system dfçıktısında biriken çöp makul