{"id":303,"date":"2026-08-29T09:03:55","date_gmt":"2026-08-29T09:03:55","guid":{"rendered":"https:\/\/www.vps.tc\/blog\/?p=303"},"modified":"2026-08-29T09:03:55","modified_gmt":"2026-08-29T09:03:55","slug":"vps-docker-kurulumu-ilk-konteyner","status":"publish","type":"post","link":"https:\/\/www.vps.tc\/blog\/tr\/vps-docker-kurulumu-ilk-konteyner\/","title":{"rendered":"VPS&#8217;te Docker Kurulumu ve \u0130lk Konteyneri \u00c7al\u0131\u015ft\u0131rma"},"content":{"rendered":"<h2>VPS \u00fczerinde Docker kurmadan \u00f6nce bilmeniz gerekenler<\/h2>\n<p>Bir VPS&#8217;e ba\u011fland\u0131\u011f\u0131n\u0131zda kurulum komutlar\u0131 genellikle i\u015fin kolay k\u0131sm\u0131d\u0131r. As\u0131l u\u011fra\u015f, konteynerin hangi porta a\u00e7\u0131laca\u011f\u0131, verinin nerede tutulaca\u011f\u0131 ve disk doldu\u011funda ne olaca\u011f\u0131 gibi sorularla ba\u015flar. Docker uygulamay\u0131 ba\u011f\u0131ml\u0131l\u0131klar\u0131yla birlikte ta\u015f\u0131may\u0131 kolayla\u015ft\u0131r\u0131r; host g\u00fcvenli\u011fi, yedekleme ve izleme sorumlulu\u011funu ise sizin yerinize \u00fcstlenmez.<\/p>\n<p>Bu kurulumda Ubuntu 22.04 veya 24.04 LTS kullanaca\u011f\u0131m. Komutlar\u0131n \u00e7o\u011fu Debian 12 \u00fczerinde de ayn\u0131d\u0131r; yine de depo adreslerini ve paket adlar\u0131n\u0131 da\u011f\u0131t\u0131m\u0131n\u0131za g\u00f6re do\u011frulay\u0131n. \u00d6nce Docker Engine&#8217;i kuracak, ard\u0131ndan basit bir Nginx konteyneri \u00e7al\u0131\u015ft\u0131r\u0131p d\u0131\u015far\u0131dan eri\u015fimi test edece\u011fiz.<\/p>\n<p>Ba\u015flamadan sunucunun kaynaklar\u0131n\u0131 kontrol edin. Docker daemon&#8217;un kendisi genellikle as\u0131l y\u00fck de\u011fildir; RAM ve disk t\u00fcketimini \u00e7o\u011funlukla konteyner i\u00e7indeki uygulamalar belirler. Veritaban\u0131, web sunucusu ve monitoring servislerini ayn\u0131 VPS&#8217;te \u00e7al\u0131\u015ft\u0131racaksan\u0131z kullan\u0131labilir belle\u011fi, disk t\u00fcr\u00fcn\u00fc ve yedekleme alan\u0131n\u0131 birlikte d\u00fc\u015f\u00fcn\u00fcn.<\/p>\n<pre><code>cat \/etc\/os-release\nuname -a\nnproc\nfree -h\ndf -h<\/code><\/pre>\n<p><code>free -h<\/code> \u00e7\u0131kt\u0131s\u0131nda swap olmamas\u0131 tek ba\u015f\u0131na hata say\u0131lmaz. D\u00fc\u015f\u00fck RAM&#8217;li VPS&#8217;lerde k\u0131sa s\u00fcreli bellek art\u0131\u015f\u0131 ise konteynerleri ve host sistemini ayn\u0131 anda etkileyebilir. Ben yeni sunucularda \u00f6nce temel monitoring&#8217;i kurup kaynak davran\u0131\u015f\u0131n\u0131 g\u00f6zlemliyorum. Yeni VPS haz\u0131rl\u0131\u011f\u0131yla ilgili daha geni\u015f bir kontrol s\u0131ras\u0131 ar\u0131yorsan\u0131z <a>Yeni VPS Sunucuyu 30 Dakikada Canl\u0131ya Alma Rehberi<\/a> yaz\u0131s\u0131ndaki temel ad\u0131mlar i\u015finize yarar.<\/p>\n<h2>Eski Docker paketlerini temizleyin<\/h2>\n<p>Ubuntu depolar\u0131nda veya daha \u00f6nce eklenmi\u015f \u00fc\u00e7\u00fcnc\u00fc taraf depolarda Docker&#8217;\u0131n farkl\u0131 paketleri bulunabilir. Yar\u0131m kalm\u0131\u015f bir kurulum varsa \u00f6nce mevcut durumu g\u00f6r\u00fcn:<\/p>\n<pre><code>docker --version 2&gt;\/dev\/null || true\ndpkg -l | grep -E 'docker|containerd' || true\nsystemctl status docker --no-pager 2&gt;\/dev\/null || true<\/code><\/pre>\n<p>Yeni ve kullan\u0131lmayan bir VPS&#8217;te a\u015fa\u011f\u0131daki paketleri kald\u0131rmak \u00e7o\u011fu zaman g\u00fcvenlidir. \u00dczerinde \u00e7al\u0131\u015fan konteynerler, imajlar veya volume&#8217;lar varsa bu komutu d\u00fc\u015f\u00fcnmeden kullanmay\u0131n. Paketleri kald\u0131rmak her zaman veri dizinlerini silmez; yine de geri d\u00f6n\u00fc\u015f plan\u0131 olmadan temizlik yapmak iyi bir y\u00f6netim y\u00f6ntemi de\u011fildir.<\/p>\n<pre><code>sudo apt remove -y docker.io docker-doc docker-compose podman-docker containerd runc<\/code><\/pre>\n<p>Ben bir keresinde test sunucusu sand\u0131\u011f\u0131m makinede eski bir Docker kurulumu bulup do\u011frudan temizli\u011fe giri\u015fmi\u015ftim. Hostname&#8217;i ikinci kez kontrol edince bunun m\u00fc\u015fteri staging ortam\u0131 de\u011fil, production&#8217;a yak\u0131n bir yard\u0131mc\u0131 sunucu oldu\u011funu fark ettim. Silme i\u015fleminden hemen \u00f6nce <code>hostname<\/code> \u00e7al\u0131\u015ft\u0131rmak ve production shell&#8217;lerinin prompt&#8217;una hostname eklemek o g\u00fcn\u00fcn kal\u0131c\u0131 dersiydi.<\/p>\n<h2>Docker Engine i\u00e7in resmi depoyu ekleme<\/h2>\n<p>Ubuntu&#8217;nun kendi deposundaki Docker s\u00fcr\u00fcm\u00fc, da\u011f\u0131t\u0131m s\u00fcr\u00fcm\u00fcne g\u00f6re geriden gelebilir. Uzun s\u00fcre \u00e7al\u0131\u015facak VPS&#8217;lerde Docker&#8217;\u0131n resmi apt deposunu kullanmak s\u00fcr\u00fcm ve g\u00fcncelleme y\u00f6netimini daha \u00f6ng\u00f6r\u00fclebilir k\u0131lar. Kurulumdan \u00f6nce paket listesini yenileyip yard\u0131mc\u0131 paketleri y\u00fckleyin.<\/p>\n<pre><code>sudo apt update\nsudo apt install -y ca-certificates curl<\/code><\/pre>\n<p>Docker&#8217;\u0131n imza anahtar\u0131n\u0131 ayr\u0131 bir keyring dizininde saklayaca\u011f\u0131z. Eski dok\u00fcmanlarda s\u0131k g\u00f6r\u00fclen <code>apt-key<\/code> y\u00f6ntemi art\u0131k tercih edilmiyor.<\/p>\n<pre><code>sudo install -m 0755 -d \/etc\/apt\/keyrings\nsudo curl -fsSL https:\/\/download.docker.com\/linux\/ubuntu\/gpg \n  -o \/etc\/apt\/keyrings\/docker.asc\nsudo chmod a+r \/etc\/apt\/keyrings\/docker.asc<\/code><\/pre>\n<p>Ard\u0131ndan mimariyi ve Ubuntu kod ad\u0131n\u0131 kullanarak depo kayd\u0131n\u0131 olu\u015fturun:<\/p>\n<pre><code>echo \"deb [arch=$(dpkg --print-architecture) signed-by=\/etc\/apt\/keyrings\/docker.asc] https:\/\/download.docker.com\/linux\/ubuntu \n$(. \/etc\/os-release &amp;&amp; echo \"$VERSION_CODENAME\") stable\" | \n  sudo tee \/etc\/apt\/sources.list.d\/docker.list &gt; \/dev\/null<\/code><\/pre>\n<p>Bu sat\u0131rdaki <code>signed-by<\/code> b\u00f6l\u00fcm\u00fc, anahtar\u0131n yaln\u0131zca bu depo i\u00e7in kullan\u0131lmas\u0131n\u0131 sa\u011flar. Ard\u0131ndan Docker Engine ve Compose eklentisini kurun.<\/p>\n<pre><code>sudo apt update\nsudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin<\/code><\/pre>\n<p>Kurulumdan sonra servisi ve s\u00fcr\u00fcm\u00fc kontrol edin:<\/p>\n<pre><code>sudo systemctl enable --now docker\nsudo systemctl is-active docker\ndocker version\nsudo docker run --rm hello-world<\/code><\/pre>\n<p><code>is-active<\/code> komutunun <code>active<\/code> d\u00f6nd\u00fcrmesi servisin \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 g\u00f6sterir. <code>hello-world<\/code> imaj\u0131 indirip k\u0131sa bir konteyner \u00e7al\u0131\u015ft\u0131r\u0131r ve \u00e7\u0131kar. \u0130lk \u00e7al\u0131\u015ft\u0131rmada Docker Hub&#8217;a ba\u011flant\u0131 gerekti\u011finden DNS veya \u00e7\u0131k\u0131\u015f trafi\u011fi sorunu varsa kontrol burada tak\u0131labilir.<\/p>\n<h2>Docker komutlar\u0131n\u0131 sudo olmadan \u00e7al\u0131\u015ft\u0131rmak<\/h2>\n<p>Kurulumdan sonra Docker komutlar\u0131n\u0131 varsay\u0131lan olarak root yetkisiyle \u00e7al\u0131\u015ft\u0131rman\u0131z gerekir. Kendi kullan\u0131c\u0131 hesab\u0131n\u0131z\u0131 <code>docker<\/code> grubuna eklemek daha pratik g\u00f6r\u00fcn\u00fcr:<\/p>\n<pre><code>sudo usermod -aG docker \"$USER\"\nnewgrp docker\ndocker ps<\/code><\/pre>\n<p>Buradaki <code>-aG<\/code> bayra\u011f\u0131 \u00f6nemli. Sadece <code>-G<\/code> kullan\u0131rsan\u0131z kullan\u0131c\u0131n\u0131n mevcut grup \u00fcyeliklerini ezebilirsiniz. <code>newgrp docker<\/code> mevcut oturumda yeni grup \u00fcyeli\u011fini etkinle\u015ftirir; SSH ba\u011flant\u0131s\u0131n\u0131 kapat\u0131p yeniden a\u00e7mak da ayn\u0131 i\u015fi yapar.<\/p>\n<p>Bu kolayl\u0131\u011f\u0131n g\u00fcvenlik bedeli var. <code>docker<\/code> grubuna \u00fcyelik pratikte root&#8217;a \u00e7ok yak\u0131n yetki verir. Host dosya sistemini bir konteynere ba\u011flamak veya ayr\u0131cal\u0131kl\u0131 bir konteyner ba\u015flatmak m\u00fcmk\u00fcn oldu\u011fundan bu gruba yaln\u0131zca g\u00fcvendi\u011finiz y\u00f6netici hesaplar\u0131n\u0131 ekleyin. Her i\u015fi root kullan\u0131c\u0131s\u0131yla yapmamak iyi bir al\u0131\u015fkanl\u0131k; Docker grubunu herkese a\u00e7mak bunun daha \u015f\u0131k g\u00f6r\u00fcnen ba\u015fka bir bi\u00e7imi olur.<\/p>\n<p>Payla\u015f\u0131ml\u0131 bir ekip sunucusunda rootless Docker&#8217;\u0131 ayr\u0131ca de\u011ferlendirebilirsiniz. Rootless mod, daemon ve konteynerleri root olmayan kullan\u0131c\u0131yla \u00e7al\u0131\u015ft\u0131r\u0131r; baz\u0131 a\u011f ve depolama \u00f6zellikleri i\u00e7in ek ayar gerekir. Tek kullan\u0131c\u0131l\u0131 basit bir VPS&#8217;te klasik kurulum anla\u015f\u0131l\u0131r olabilir. \u00c7ok kullan\u0131c\u0131l\u0131 ortamlarda ise g\u00fcvenlik modelini ba\u015ftan tasarlay\u0131n.<\/p>\n<h2>\u0130lk konteyner: Nginx ile k\u00fc\u00e7\u00fck bir test<\/h2>\n<p>Kurulumun ger\u00e7ekten \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 g\u00f6rmek i\u00e7in basit bir Nginx konteyneri a\u00e7al\u0131m. Host \u00fczerindeki 8080 portunu konteynerin 80 portuna ba\u011flayaca\u011f\u0131z.<\/p>\n<pre><code>docker run -d \n  --name web-test \n  --restart unless-stopped \n  -p 8080:80 \n  nginx:1.27-alpine<\/code><\/pre>\n<p><code>-d<\/code> konteyneri arka planda \u00e7al\u0131\u015ft\u0131r\u0131r, <code>--name<\/code> hat\u0131rlanabilir bir ad verir. <code>--restart unless-stopped<\/code>, Docker servisi yeniden ba\u015flad\u0131\u011f\u0131nda konteyneri otomatik olarak kald\u0131r\u0131r. <code>-p 8080:80<\/code> ifadesinde soldaki port VPS&#8217;e, sa\u011fdaki port konteynerin i\u00e7ine aittir.<\/p>\n<p>\u0130maj etiketini a\u00e7\u0131k\u00e7a yazmay\u0131 tercih ediyorum. <code>latest<\/code> ilk denemede kolayd\u0131r; hangi s\u00fcr\u00fcm\u00fcn \u00e7ekildi\u011fini daha sonra anlamay\u0131 zorla\u015ft\u0131r\u0131r. \u00dcretimde daha belirli bir s\u00fcr\u00fcm veya test s\u00fcrecinizden ge\u00e7mi\u015f bir digest kullanmak daha kontroll\u00fc olur.<\/p>\n<p>Konteynerin ve port e\u015flemesinin durumuna bak\u0131n:<\/p>\n<pre><code>docker ps\ndocker port web-test\ncurl -I http:\/\/127.0.0.1:8080<\/code><\/pre>\n<p>Beklenen yan\u0131tta <code>HTTP\/1.1 200 OK<\/code> benzeri bir sat\u0131r g\u00f6r\u00fcrs\u00fcn\u00fcz. VPS&#8217;in d\u0131\u015f IP adresinden test etmek i\u00e7in kendi bilgisayar\u0131n\u0131zdan <code>http:\/\/SUNUCU_IP:8080<\/code> adresini a\u00e7abilirsiniz. A\u00e7\u0131lm\u0131yorsa hemen konteyneri yeniden ba\u015flatmay\u0131n. \u00d6nce <code>docker ps<\/code>, <code>docker logs web-test<\/code>, <code>ss -lntp<\/code> ve g\u00fcvenlik duvar\u0131 kurallar\u0131n\u0131 kontrol edin.<\/p>\n<h3>Portu t\u00fcm internete a\u00e7mak zorunda de\u011filsiniz<\/h3>\n<p>Komuttaki <code>-p 8080:80<\/code> e\u015flemesi varsay\u0131lan olarak t\u00fcm aray\u00fczlerde dinler. Yaln\u0131zca VPS&#8217;in kendi i\u00e7inden test edecekseniz portu loopback adresine ba\u011flayabilirsiniz:<\/p>\n<pre><code>docker rm -f web-test\ndocker run -d \n  --name web-test \n  --restart unless-stopped \n  -p 127.0.0.1:8080:80 \n  nginx:1.27-alpine<\/code><\/pre>\n<p>Bu bi\u00e7imde d\u0131\u015far\u0131dan do\u011frudan eri\u015fim kapan\u0131r. Nginx&#8217;i host \u00fczerinde reverse proxy olarak kullan\u0131p trafi\u011fi yaln\u0131zca proxy \u00fczerinden alabilirsiniz. Ger\u00e7ek bir alan ad\u0131, TLS ve reverse proxy plan\u0131n\u0131z varsa konteyneri rastgele y\u00fcksek bir porttan internete a\u00e7mak yerine eri\u015fim ak\u0131\u015f\u0131n\u0131 ba\u015ftan belirleyin.<\/p>\n<p>UFW kullan\u0131yorsan\u0131z 8080 portunu a\u00e7mak i\u00e7in \u015fu komut \u00e7al\u0131\u015f\u0131r:<\/p>\n<pre><code>sudo ufw status verbose\nsudo ufw allow 8080\/tcp\nsudo ufw reload<\/code><\/pre>\n<p>Test bittikten sonra bu kural\u0131 a\u00e7\u0131k b\u0131rakmay\u0131n. Docker&#8217;\u0131n iptables veya nftables kurallar\u0131yla UFW davran\u0131\u015f\u0131n\u0131n bekledi\u011finizden farkl\u0131 olabildi\u011fi durumlar var. \u0130nternete a\u00e7\u0131k bir VPS&#8217;te g\u00fcvenlik duvar\u0131n\u0131, SSH eri\u015fimini ve Docker&#8217;\u0131n yay\u0131nlad\u0131\u011f\u0131 portlar\u0131 birlikte inceleyin. Linux sunucu g\u00fcvenli\u011fi i\u00e7in temel kontrolleri <a>Linux Sunucu G\u00fcvenli\u011fi i\u00e7in Zorunlu 10 Temel Ad\u0131m<\/a> yaz\u0131s\u0131nda ayr\u0131ca ele alm\u0131\u015ft\u0131m.<\/p>\n<h2>Loglar\u0131 okumadan yeniden ba\u015flatmay\u0131n<\/h2>\n<p>Bir konteynerin \u00e7al\u0131\u015f\u0131yor g\u00f6r\u00fcnmesi uygulaman\u0131n sa\u011fl\u0131kl\u0131 oldu\u011fu anlam\u0131na gelmez. \u0130lk bakaca\u011f\u0131m ekranlardan biri log \u00e7\u0131kt\u0131s\u0131d\u0131r:<\/p>\n<pre><code>docker logs --tail 100 web-test\ndocker inspect web-test\ndocker stats --no-stream web-test<\/code><\/pre>\n<p><code>docker logs<\/code> konteynerin standart \u00e7\u0131kt\u0131s\u0131n\u0131 g\u00f6sterir. <code>inspect<\/code> a\u011f, mount, ortam de\u011fi\u015fkeni ve restart ayarlar\u0131n\u0131 JSON olarak d\u00f6nd\u00fcr\u00fcr. <code>stats<\/code> ise tek seferlik CPU, bellek ve a\u011f kullan\u0131m\u0131n\u0131 verir. \u00dcretimde bu bilgileri yaln\u0131zca terminal komutlar\u0131na b\u0131rakmak yerine merkezi loglama ve monitoring kurmak gerekir.<\/p>\n<p>Bir ara test sunucusu sand\u0131\u011f\u0131m makinede yanl\u0131\u015f Compose projesinin i\u00e7inden i\u015flem yapm\u0131\u015ft\u0131m. <code>docker compose ps<\/code> \u00e7\u0131kt\u0131s\u0131ndaki konteyner adlar\u0131 bekledi\u011fimden farkl\u0131 gelince durdum; do\u011fru sunucuda olsam da yanl\u0131\u015f proje dizinindeydim. O g\u00fcnden beri y\u0131k\u0131c\u0131 bir komuttan \u00f6nce hem <code>hostname<\/code> hem de <code>pwd<\/code> \u00e7al\u0131\u015ft\u0131r\u0131yorum. \u0130ki saniye s\u00fcr\u00fcyor.<\/p>\n<p>Docker daemon&#8217;un log s\u00fcr\u00fcc\u00fcs\u00fcn\u00fc kontrol edin:<\/p>\n<pre><code>docker info --format '{{.LoggingDriver}}'\ncat \/etc\/docker\/daemon.json 2&gt;\/dev\/null || true<\/code><\/pre>\n<p>Varsay\u0131lan <code>json-file<\/code> s\u00fcr\u00fcc\u00fcs\u00fc loglar\u0131 host \u00fczerinde tutar. Uzun s\u00fcre \u00e7al\u0131\u015fan uygulamalarda log rotasyonu ayarlamay\u0131 d\u00fc\u015f\u00fcn\u00fcn. \u00d6rne\u011fin <code>\/etc\/docker\/daemon.json<\/code> dosyas\u0131na \u015fu ayarlar eklenebilir:<\/p>\n<pre><code>{\n  \"log-driver\": \"json-file\",\n  \"log-opts\": {\n    \"max-size\": \"10m\",\n    \"max-file\": \"3\"\n  }\n}<\/code><\/pre>\n<p>Dosyay\u0131 de\u011fi\u015ftirdikten sonra daemon&#8217;u yeniden ba\u015flatman\u0131z gerekir. Bu ayar yeni ba\u015flat\u0131lan konteynerler i\u00e7in ge\u00e7erli olur; mevcut konteynerleri kald\u0131r\u0131p yeniden olu\u015fturman\u0131z gerekebilir. \u00d6nce dosyan\u0131n ge\u00e7erli JSON oldu\u011funu <code>python3 -m json.tool \/etc\/docker\/daemon.json<\/code> ile do\u011frulay\u0131n. K\u00fc\u00e7\u00fck bir virg\u00fcl hatas\u0131 Docker&#8217;\u0131n hi\u00e7 ba\u015flamamas\u0131na neden olabilir.<\/p>\n<h2>Veriyi konteynerin d\u0131\u015f\u0131na \u00e7\u0131kar\u0131n<\/h2>\n<p>Nginx test konteyneri stateless oldu\u011fu i\u00e7in silip yeniden olu\u015fturmak sorun de\u011fildir. Veritaban\u0131, Nextcloud, Vaultwarden veya CMS \u00e7al\u0131\u015ft\u0131r\u0131rken durum de\u011fi\u015fir. Konteyner silindi\u011finde uygulaman\u0131n verisi writable katmanda tutuluyorsa kaybolabilir. Kal\u0131c\u0131 veriler i\u00e7in named volume veya host bind mount kullan\u0131n.<\/p>\n<pre><code>docker volume create web-data\ndocker run -d \n  --name web-volume-test \n  --restart unless-stopped \n  -p 127.0.0.1:8081:80 \n  -v web-data:\/usr\/share\/nginx\/html:ro \n  nginx:1.27-alpine<\/code><\/pre>\n<p><code>web-data<\/code>, Docker taraf\u0131ndan y\u00f6netilen bir volume&#8217;dur. Yerini g\u00f6rmek i\u00e7in:<\/p>\n<pre><code>docker volume inspect web-data<\/code><\/pre>\n<p>Host \u00fczerindeki belirli bir dizini kullanmak isterseniz \u00f6nce dizini olu\u015fturup sahiplik ve izinlerini uygulamaya g\u00f6re d\u00fczenleyin:<\/p>\n<pre><code>sudo install -d -m 0755 \/srv\/web\/html\nsudo docker run -d \n  --name web-bind-test \n  -p 127.0.0.1:8082:80 \n  -v \/srv\/web\/html:\/usr\/share\/nginx\/html:ro \n  nginx:1.27-alpine<\/code><\/pre>\n<p>Buradaki <code>:ro<\/code> mount&#8217;u salt okunur yapar. Web sunucusunun i\u00e7erik yazmas\u0131na gerek yoksa bu k\u0131s\u0131tlama i\u015fe yarar. \u0130zin sorunu ya\u015fad\u0131\u011f\u0131n\u0131zda <code>chmod -R 777<\/code> ile ka\u00e7mak yerine konteyner i\u00e7indeki kullan\u0131c\u0131y\u0131 ve host dizininin sahibini inceleyin. Bu komut sorunu \u00e7\u00f6zmekten \u00e7ok sorunun ad\u0131n\u0131 de\u011fi\u015ftirir.<\/p>\n<p>Yedek taraf\u0131n\u0131 da planlay\u0131n. Docker volume&#8217;lar\u0131n\u0131 yedeklemek yaln\u0131zca volume dizinini kopyalamaktan ibaret de\u011fildir; veritaban\u0131 gibi servislerde tutarl\u0131 dump almak gerekir. Ben VPS yedeklerinde rsync ve borgbackup kullan\u0131yor, ayda bir geri d\u00f6n\u00fc\u015f provas\u0131 yap\u0131yorum. Test edilmemi\u015f yedek, sunucuda duran b\u00fcy\u00fck bir iyimserlik dosyas\u0131d\u0131r.<\/p>\n<h2>Tek komut yerine Compose kullanmak<\/h2>\n<p>\u0130lk konteyneri <code>docker run<\/code> ile ba\u015flatmak \u00f6\u011freticidir. Uygulama b\u00fcy\u00fcd\u00fc\u011f\u00fcnde uzun komutlar\u0131 tekrar tekrar yazmak yerine Compose dosyas\u0131 daha okunakl\u0131 olur. Docker Compose eklentisinin kuruldu\u011funu \u015fu komutla kontrol edin:<\/p>\n<pre><code>docker compose version<\/code><\/pre>\n<p>Basit Nginx \u00f6rne\u011fini bir proje dizinine ta\u015f\u0131yal\u0131m:<\/p>\n<pre><code>sudo install -d -m 0755 \/opt\/web-test\nsudo chown \"$USER\":\"$USER\" \/opt\/web-test\ncd \/opt\/web-test\nvim compose.yaml<\/code><\/pre>\n<p><code>compose.yaml<\/code> i\u00e7eri\u011fi:<\/p>\n<pre><code>services:\n  web:\n    image: nginx:1.27-alpine\n    container_name: web-compose\n    restart: unless-stopped\n    ports:\n      - \"127.0.0.1:8080:80\"\n    volumes:\n      - .\/html:\/usr\/share\/nginx\/html:ro<\/code><\/pre>\n<p>\u0130\u00e7eri\u011fi olu\u015fturup servisi ba\u015flat\u0131n:<\/p>\n<pre><code>mkdir -p html\nprintf '%sn' '&lt;h1&gt;Docker VPS testi ba\u015far\u0131l\u0131&lt;\/h1&gt;' &gt; html\/index.html\ndocker compose up -d\ndocker compose ps\ncurl http:\/\/127.0.0.1:8080<\/code><\/pre>\n<p>Compose dosyas\u0131n\u0131n bulundu\u011fu dizin burada \u00f6nemlidir. Komutlar\u0131 ba\u015fka bir klas\u00f6rde \u00e7al\u0131\u015ft\u0131r\u0131rsan\u0131z Docker Compose dosyas\u0131n\u0131 bulamayabilir. Ben de bir keresinde do\u011fru sunucuda, yanl\u0131\u015f proje dizininde <code>docker compose down<\/code> \u00e7al\u0131\u015ft\u0131rm\u0131\u015ft\u0131m. Konteyneri geri a\u00e7mak kolayd\u0131; hangi dosyan\u0131n hangi servise ait oldu\u011funu hat\u0131rlamak daha zordu.<\/p>\n<p>Compose ile servisleri durdurmak ve kald\u0131rmak aras\u0131ndaki fark\u0131 bilin:<\/p>\n<pre><code>docker compose stop\ndocker compose start\ndocker compose down<\/code><\/pre>\n<p><code>stop<\/code> konteynerleri durdurur, <code>start<\/code> yeniden ba\u015flat\u0131r. <code>down<\/code> ise Compose taraf\u0131ndan olu\u015fturulan konteynerleri ve a\u011f\u0131 kald\u0131r\u0131r; named volume&#8217;lar\u0131 varsay\u0131lan olarak silmez. <code>down -v<\/code> kullan\u0131rken iki kez d\u00fc\u015f\u00fcn\u00fcn. \u00dcretim verisini tek komutla kald\u0131rmak teknik olarak m\u00fcmk\u00fcn oldu\u011fu i\u00e7in iyi bir fikir haline gelmez.<\/p>\n<h2>Docker a\u011f\u0131n\u0131 ve VPS g\u00fcvenli\u011fini kontrol edin<\/h2>\n<p>Docker konteynerleri varsay\u0131lan olarak bridge a\u011f\u0131nda \u00e7al\u0131\u015f\u0131r. Ayn\u0131 Compose projesindeki servisler servis ad\u0131yla birbirine eri\u015febilir; \u00f6rne\u011fin uygulama konteyneri veritaban\u0131na <code>db:5432<\/code> \u00fczerinden ba\u011flanabilir. Veritaban\u0131 portunu host&#8217;a yay\u0131nlamad\u0131\u011f\u0131n\u0131z s\u00fcrece d\u0131\u015far\u0131ya a\u00e7man\u0131z gerekmez.<\/p>\n<pre><code>docker network ls\ndocker network inspect bridge\nss -lntp<\/code><\/pre>\n<p><code>ss -lntp<\/code> \u00e7\u0131kt\u0131s\u0131nda yaln\u0131zca bekledi\u011finiz portlar\u0131 g\u00f6rmeye \u00e7al\u0131\u015f\u0131n. SSH i\u00e7in 22, reverse proxy i\u00e7in 80 ve 443 a\u00e7\u0131k olabilir; test amac\u0131yla b\u0131rakt\u0131\u011f\u0131n\u0131z 8080 gibi portlar bir s\u00fcre sonra unutulur. Fail2ban ve nftables SSH sald\u0131r\u0131lar\u0131n\u0131 azaltmaya yard\u0131mc\u0131 olur. SSH portunu de\u011fi\u015ftirmek tek ba\u015f\u0131na g\u00fcvenlik de\u011fildir.<\/p>\n<p>Docker imajlar\u0131n\u0131 g\u00fcvenilir kaynaklardan \u00e7ekin, imaj etiketlerini pinleyin ve konteyneri gereksiz yetkilerle \u00e7al\u0131\u015ft\u0131rmay\u0131n. <code>--privileged<\/code> se\u00e7ene\u011fini a\u00e7\u0131klamas\u0131n\u0131 bilmeden kullanmay\u0131n. Host dizinlerini mount ederken yaln\u0131zca gereken yolu verin; t\u00fcm <code>\/<\/code> dizinini konteynere ba\u011flamak izolasyon fikrini kendi elinizle zay\u0131flat\u0131r.<\/p>\n<p>\u0130maj g\u00fcncellemelerinde de plans\u0131z hareket etmeyin:<\/p>\n<pre><code>docker compose pull\ndocker compose up -d\ndocker image prune<\/code><\/pre>\n<p><code>docker image prune<\/code> kullan\u0131lmayan imajlar\u0131 temizler ve varsay\u0131lan olarak onay ister. \u00d6nce hangi imajlar\u0131n gerekti\u011fini kontrol edin; geri d\u00f6n\u00fc\u015f i\u00e7in eski imaj\u0131 tutmak isteyebilirsiniz. Daha kontroll\u00fc bir ak\u0131\u015fta yeni etiketi staging VPS&#8217;te test eder, healthcheck ve loglar\u0131 inceler, ard\u0131ndan production&#8217;a ge\u00e7erim.<\/p>\n<h2>\u0130lk kurulumdan sonra k\u0131sa kontrol listesi<\/h2>\n<p>VPS Docker kurulumu bittikten sonra birka\u00e7 kontrol\u00fc s\u0131rayla yapmak, &#8220;\u00e7al\u0131\u015ft\u0131 galiba&#8221; ile d\u00fczg\u00fcn haz\u0131rlanm\u0131\u015f bir servis aras\u0131ndaki fark\u0131 g\u00f6sterir:<\/p>\n<ul>\n<li><code>systemctl is-active docker<\/code> ile Docker servisinin durumunu do\u011frulay\u0131n.<\/li>\n<li><code>docker ps<\/code> ile beklenen konteynerleri ve restart durumunu kontrol edin.<\/li>\n<li><code>docker logs<\/code> ile uygulaman\u0131n hata \u00fcretmedi\u011fine bak\u0131n.<\/li>\n<li><code>ss -lntp<\/code> ve g\u00fcvenlik duvar\u0131 kurallar\u0131yla yay\u0131nlanan portlar\u0131 inceleyin.<\/li>\n<li>Kal\u0131c\u0131 verileri volume veya kontroll\u00fc bind mount ile saklay\u0131n.<\/li>\n<li>RAM, CPU, disk ve log boyutunu monitoring sisteminize ekleyin.<\/li>\n<li>\u0130maj s\u00fcr\u00fcmlerini ve g\u00fcncelleme tarihlerini not edin.<\/li>\n<li>Yedekten ger\u00e7ekten geri d\u00f6nebilece\u011finiz bir test yap\u0131n.<\/li>\n<\/ul>\n<p>VPS&#8217;iniz d\u00fc\u015f\u00fck kaynakl\u0131ysa konteyner say\u0131s\u0131n\u0131 art\u0131rmadan \u00f6nce uygulamalar\u0131n bellek s\u0131n\u0131rlar\u0131n\u0131 ve swap davran\u0131\u015f\u0131n\u0131 \u00f6l\u00e7\u00fcn. Bir konteynerin host&#8217;u t\u00fcketmesine izin vermek yaln\u0131zca o servisin de\u011fil, ayn\u0131 VPS&#8217;teki di\u011fer servislerin de kesilmesine yol a\u00e7abilir. Bu y\u00fczden \u00f6nce kendi Proxmox lab&#8217;\u0131mda s\u0131n\u0131rlar\u0131 zorlar, sonra m\u00fc\u015fteri sunucusunda de\u011fi\u015fiklik yapar\u0131m.<\/p>\n<p>\u0130lk Nginx konteyneriniz <code>curl<\/code> ile yan\u0131t verdi\u011finde i\u015f bitmi\u015f say\u0131lmaz. Ertesi g\u00fcn servis yeniden ba\u015flad\u0131ktan sonra veri duruyor mu, port ger\u00e7ekten kapal\u0131 m\u0131, loglar diski dolduruyor mu? Benim kurulum kontrol\u00fcm bu \u00fc\u00e7 soruya d\u00fcr\u00fcst bir cevap verebildi\u011fimde tamamlan\u0131yor. K\u0131rm\u0131z\u0131 production prompt&#8217;u da o zaman biraz daha az geriyor.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ubuntu VPS \u00fczerinde Docker Engine&#8217;i kurun, ilk Nginx konteynerinizi \u00e7al\u0131\u015ft\u0131r\u0131n; port, volume, Compose ve g\u00fcvenlik ayarlar\u0131n\u0131 kontroll\u00fc bi\u00e7imde yap\u0131land\u0131r\u0131n.<\/p>\n","protected":false},"author":2,"featured_media":301,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[723],"tags":[1245,1251,1247,1253,389,1249,114],"class_list":["post-303","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-nasil-yapilir","tag-docker","tag-docker-compose","tag-docker-kurulumu","tag-konteyner","tag-linux","tag-ubuntu","tag-vps"],"lang":"tr","translations":{"tr":303,"en":304},"pll_sync_post":[],"_links":{"self":[{"href":"https:\/\/www.vps.tc\/blog\/wp-json\/wp\/v2\/posts\/303","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.vps.tc\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.vps.tc\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.vps.tc\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.vps.tc\/blog\/wp-json\/wp\/v2\/comments?post=303"}],"version-history":[{"count":1,"href":"https:\/\/www.vps.tc\/blog\/wp-json\/wp\/v2\/posts\/303\/revisions"}],"predecessor-version":[{"id":306,"href":"https:\/\/www.vps.tc\/blog\/wp-json\/wp\/v2\/posts\/303\/revisions\/306"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.vps.tc\/blog\/wp-json\/wp\/v2\/media\/301"}],"wp:attachment":[{"href":"https:\/\/www.vps.tc\/blog\/wp-json\/wp\/v2\/media?parent=303"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.vps.tc\/blog\/wp-json\/wp\/v2\/categories?post=303"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.vps.tc\/blog\/wp-json\/wp\/v2\/tags?post=303"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}