Komutları üretim sunucusunda çalıştırmadan önce yedek alın ve mümkünse bir test ortamında deneyin. Yönetim erişiminizi (SSH, panel) kaybetmemek için ayar değişikliklerinde açık bir ikinci oturum bulundurun.
Bu rehberde ne yapacağız?
Bir uygulamayı Docker Compose ile ayağa kaldırmak kolaydır; ancak varsayılan ayarlarla bırakmak veritabanı portunun internete açılması, parolaların düz metin ortam değişkenlerinde durması ve kontrolsüz kaynak kullanımı gibi risklere yol açar. Bu rehberde Docker Compose ile güvenli yayınlama için iç ağ ayrımını, secrets kullanımını, kaynak limitlerini, sertleştirme seçeneklerini ve sağlık kontrolünü ele alıyoruz.
Rehber, konteynerli uygulamaları sunucuda yöneten hosting ve sistem yöneticilerine hitap eder. Örnek bir web uygulaması ve veritabanı üzerinden ilerlenir; süre yaklaşık 30-40 dakikadır. Docker ve Compose eklentisinin kurulu olduğu varsayılır.
Gereksinimler
- Docker Engine ve Docker Compose eklentisi kurulu bir Debian, Ubuntu, AlmaLinux veya Rocky sunucu
dockerkomutlarını çalıştırmak için sudo yetkisi (docker grubu üyeliği root eşdeğeridir)- Uygulamanızın imajı ve gerekli ortam değişkenlerinin listesi
- Uygulamayı dış dünyaya açacak bir ters vekil (reverse proxy) planı, örneğin Nginx
Adım adım Docker Compose ile güvenli yayınlama
1. Proje dizinini ve gizli bilgi dosyalarını hazırlayın
Gizli bilgileri sürüm kontrolüne girmeyecek ayrı bir dizinde tutun. Dosya izinlerini sıkı tutmak için önce umask ayarlayın; parolayı elle yazmak yerine rastgele üretin.
umask 077
mkdir -p ~/uygulama/secrets && cd ~/uygulama
openssl rand -base64 32 > secrets/db_password.txt
printf 'secrets/\n.env\n' >> .gitignore
ls -l secrets2. Compose dosyasını yazın
Aşağıdaki örnekte iki ağ vardır: dışa açık on ağı yalnızca web uygulamasını, arka ağı ise veritabanını barındırır. arka ağı internal olduğu için veritabanı dış dünyaya çıkamaz ve dışarıdan erişilemez. İmaj etiketlerini kendi sürümlerinizle değiştirin.
services:
uygulama:
image: ornek/uygulama:SURUM
restart: unless-stopped
ports:
- '127.0.0.1:8080:8080'
networks: [on, arka]
environment:
DB_HOST: veritabani
DB_PASSWORD_FILE: /run/secrets/db_password
secrets: [db_password]
read_only: true
tmpfs: [/tmp]
cap_drop: [ALL]
security_opt:
- no-new-privileges:true
mem_limit: 512m
cpus: 1.0
pids_limit: 200
healthcheck:
test: [CMD, curl, -f, http://localhost:8080/saglik]
interval: 30s
timeout: 5s
retries: 3
logging:
driver: json-file
options:
max-size: 10m
max-file: '3'
depends_on:
veritabani:
condition: service_healthy
veritabani:
image: postgres:SURUM
restart: unless-stopped
networks: [arka]
environment:
POSTGRES_PASSWORD_FILE: /run/secrets/db_password
secrets: [db_password]
volumes:
- veri:/var/lib/postgresql/data
mem_limit: 1g
healthcheck:
test: [CMD-SHELL, pg_isready -U postgres]
interval: 10s
retries: 5
networks:
on: {}
arka:
internal: true
volumes:
veri: {}
secrets:
db_password:
file: ./secrets/db_password.txtÖnemli noktalar: ports satırındaki 127.0.0.1 ifadesi uygulamayı yalnızca yerel arayüze bağlar; dışarıya ters vekil üzerinden açacaksınız. _FILE ile biten ortam değişkenleri parolayı dosyadan okur; bunu destekleyen imajlarda parola ortam değişkenine düz metin yazılmaz. Uygulamanız _FILE desteklemiyorsa gizli bilgiyi başlangıç betiğinde /run/secrets/ dosyasından okuyun.
3. Dosyayı doğrulayın ve başlatın
Önce Compose'un dosyayı nasıl yorumladığını görün; sözdizimi hatalarını bu adım yakalar.
sudo docker compose config
sudo docker compose up -d
sudo docker compose ps4. Ters vekil ile dışarı açın
Uygulama 127.0.0.1:8080 üzerinde dinlediği için Nginx gibi bir ters vekil ile HTTPS üzerinden yayınlayın. Docker, yayımlanan portlar için kendi güvenlik duvarı kurallarını ekler ve ufw veya firewalld kurallarını atlayabilir. Bu yüzden bir portu doğrudan 0.0.0.0 üzerine yayımlamak yerine yerel arayüze bağlamak en güvenli yoldur.
server {
listen 80;
server_name uygulama.ornek.com;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}Bu blok yalnızca başlangıçtır; sertifikayı (örneğin certbot ile) alıp 443 üzerinde HTTPS dinleyin ve 80'i HTTPS'ye yönlendirin.
5. Kaynak kullanımını izleyin
Limitlerin işe yaradığını gözlemleyin. Bellek limitini aşan konteyner sonlandırılır; bu yüzden limiti uygulamanın gerçek ihtiyacına göre, biraz pay bırakarak belirleyin.
sudo docker stats --no-stream
sudo docker compose logs --tail 50 uygulama6. Güncelleme düzenini oluşturun
İmaj etiketini sabit bir sürüme bağlayın; güncellerken önce veri hacminin yedeğini alın, compose dosyasındaki etiketi yeni sürüme çevirin, sonra imajı çekip yeniden başlatın.
sudo docker compose pull
sudo docker compose up -d
sudo docker image prune -fDoğrulama
Güvenlik yapılandırmasının uygulandığını şu kontrollerle kanıtlayın:
sudo docker compose ps
sudo ss -tlnp | grep 8080
sudo docker inspect --format '{{.HostConfig.Memory}} {{.HostConfig.ReadonlyRootfs}}' $(sudo docker compose ps -q uygulama)ss çıktısında 8080 portunun yalnızca 127.0.0.1 adresinde dinlendiğini görmelisiniz. Veritabanı portunun hiçbir arayüzde dinlenmediğini ve sunucunun dışından erişilemediğini ayrıca doğrulayın. docker inspect çıktısında bellek limitinin bayt cinsinden değerini ve salt okunur dosya sisteminin true olduğunu görürsünüz. compose ps çıktısında sağlık durumu healthy olmalıdır.
Sık karşılaşılan sorunlar
- Uygulama salt okunur dosya sistemi yüzünden hata veriyor: Yazması gereken dizinleri (
/tmp, önbellek, yükleme dizini)tmpfsveya hacim olarak ekleyin. - Konteyner sürekli yeniden başlıyor:
docker compose logsçıktısına bakın; bellek limiti çok düşükseOOMKilleddurumunudocker inspectile kontrol edin. - İç ağdaki servis internete çıkamıyor:
internal: trueağlar bilinçli olarak dış erişimi keser. Dışa çıkması gereken servisi ayrıcaonağına da bağlayın. - Secret okunamıyor: Swarm dışı Compose, secret dosyasını ana makinedeki sahiplik ve izinlerle bağlar; 600 izinli dosyayı konteynerdeki root olmayan kullanıcı okuyamayabilir. Sahipliği o kullanıcının UID değerine verin ve imajın
_FILEdesteğini kontrol edin. - Sağlık kontrolü hep başarısız: İmajda curl bulunmayabilir; imajda bulunan bir araçla ya da uygulamanın kendi kontrol komutuyla değiştirin.
Güvenlik ve bakım notları
- Parolaları compose dosyasına veya sürüm kontrolüne yazmayın; secrets dizini 700, dosyaları 600 izinli olsun
- İmajları güvenilir kaynaklardan çekin, sürüm etiketini sabitleyin ve düzenli güncelleyip taramadan geçirin
- Mümkün olan her servisi root olmayan kullanıcıyla çalıştırın (
user:seçeneği) - Docker soketini (
/var/run/docker.sock) hiçbir konteynere bağlamayın - Günlük boyutunu sınırlayın; aksi hâlde konteyner günlükleri diski doldurabilir
- Veri hacimlerini düzenli yedekleyin ve geri yüklemeyi deneyin
Sık sorulan sorular
Docker ve ufw birlikte neden sorun çıkarır?
Docker yayımlanan portlar için kendi iptables kurallarını ekler ve bu kurallar ufw veya firewalld kurallarını atlayabilir. Bu yüzden portları 127.0.0.1 adresine bağlamak ve dışarıya ters vekil üzerinden açmak önerilir.
Secrets ile ortam değişkeni arasındaki fark nedir?
Ortam değişkenleri docker inspect çıktısında ve süreç bilgisinde görünebilir. Secrets ise konteynere dosya olarak bağlanır ve daha az sızıntı yüzeyi bırakır; ancak uygulamanın dosyadan okumayı desteklemesi gerekir.
Kaynak limitlerini nasıl belirlemeliyim?
Önce limitsiz çalıştırıp docker stats ile normal ve yoğun kullanımı gözlemleyin. Sonra zirve değerin biraz üzerinde bir bellek limiti verin ve CPU limitini ortak sunucu kapasitesine göre ayarlayın.
İlgili sözlük terimleri
Bu kategorideki diğer rehberler
- Proxmox VE’de LXC konteyner oluşturma ve yönetme (pct)Proxmox VE’de LXC konteyneri pct komutuyla oluşturun, başlatın ve yönetin: şablon indirme, kaynak ayarı, anlık görüntü, yedek ve ayrıcalıksız konteyner güvenliği.
- Proxmox VE’de cloud-init ile sanal makine şablonlarıProxmox VE’de bir cloud-init sanal makine şablonu hazırlayın; qm ile şablondan klonlayıp kullanıcı, SSH anahtarı ve IP ayarlarını saniyeler içinde tanımlayın.
- Proxmox VE küme (cluster) kurulumu: gereksinimler, pvecm, quorum ve dikkat edileceklerProxmox VE küme (cluster) kurulumunu pvecm ile adım adım yapın: ağ ve gereksinimler, düğüm ekleme, quorum mantığı, QDevice ve kümeye girerken dikkat edilecekler.
- VMware ESXi güvenlik sertleştirme rehberiVMware ESXi güvenlik sertleştirme ilkeleri: yönetim ağı yalıtımı, yama, gereksiz servisler, kimlik doğrulama, günlük ve yedekleme planı.