Ana içeriğe geç

Özel Bir NGINX Docker İmajı Nasıl Oluşturulur

NGINX’i Docker içinde nasıl kuracağınızı, yapılandıracağınızı ve optimize edeceğinizi öğrenin. Bu rehber; konteyner çalıştırma, özel içerik sunma, imaj oluşturma, ters proxy kurulumu ve verimli dağıtım için Docker Compose kullanımını kapsar.
· 10 dk. oku

Yapay Zeka ile Keşfedin

Bir Docker konteyneri içinde NGINX, birçok ortamda güvenilir bir web hizmeti sunabilir. Kişisel bir web sitesi, hafif bir web servisi veya ev laboratuvarı projesi üzerinde çalışıyor olabilirsiniz. Docker, farklı makineler ve kurulumlar arasında tutarlılığı korumanıza yardımcı olabilir. Bu yaklaşım, geliştirme ve üretim arasında geçiş yaparken daha az ek yükle NGINX çalıştırmanın bir yolunu sunar. Web sunucusunu basit şekilde paketlemek için Docker’a güvenmek yaygındır; bu da projelerinizi karmaşık manuel adımlar olmadan paylaşmayı kolaylaştırır.

Bu makale, hazır bir NGINX imajını nasıl çalıştıracağınızı, yerel makinenizden nasıl içerik sunacağınızı ve özel özelliklerle kendi imajınızı nasıl oluşturacağınızı açıklar. Ayrıca bir ters proxy için kurulum adımlarını ve çoklu hizmet dağıtımı için Docker Compose kullanımını da kapsar. Sonunda, birkaç basit komutla konteynerleri nasıl yöneteceğinizi ve pratik görevler için Docker ile NGINX’i nasıl entegre edeceğinize dair ayrıntılı bir bakış elde edeceksiniz.

Docker’a yeniyseniz, temel bilgileri öğrenmek için mutlaka Yeni Başlayanlar için Docker rehberimize göz atın. 

Docker NGINX nedir?

Docker NGINX, NGINX web sunucusunun hafif bir konteyner içinde çalıştırılmasına karşılık gelir. Docker konteynerleri, bir uygulamayı ve ihtiyaç duyduğu tüm bağımlılıkları barındıran küçük paketlere benzer. 

NGINX; güçlü performansı, kolay yapılandırması ve HTTP trafiğini esnek şekilde ele almasıyla bilinen popüler bir web sunucusudur. NGINX’i Docker ile eşleştirmek caziptir çünkü ortamı tutarlı tutar. macOS, Windows veya Linux’a dağıtım yapın; konteynerin içeriği aynı kalır. Bu da, ana işletim sisteminden bağımsız olarak aynı şekilde davranacağı anlamına gelir.

NGINX için tipik bir Docker imajı; sunucu yazılımını, varsayılan bir yapılandırmayı ve barındırılan dosyalar için bir dizin yapısını içerir. Bu konteyneri hemen çalıştırabilir veya belirli klasörleri eşleyerek, yapılandırma dosyalarını düzenleyerek ya da kendi Dockerfile’ınıza dayalı bir imaj oluşturarak uyarlayabilirsiniz. Böyle yaparak, uygulamanıza uygun şekilde NGINX’i özelleştirmek için özel modüller veya betikler ekleyebilirsiniz.

Docker NGINX’in bileşenleri

Uygulamaları nasıl konteynerleştireceğiniz hakkında daha fazla bilgi için Docker Kullanarak Bir Uygulama Nasıl Konteynerleştirilir başlıklı eğitimimize bakın. Docker ile makine öğrenmesi uygulamalarını başlangıç seviyesine uygun biçimde nasıl konteynerleştireceğinizi daha ayrıntılı anlatır. 

Önkoşullar

NGINX konteynerlerini çalıştırmaya başlamadan önce Docker’ın kurulu olduğundan emin olun. Docker’ın macOS, Windows ve çeşitli Linux dağıtımları için resmi yükleyicileri vardır. Docker dokümantasyonu, her işletim sistemi için adım adım bir süreç sağlar. 

Docker’a başlamak için kapsamlı bir rehber olarak Docker’a Giriş kursumuza göz atın. 

Kurulumu, aşağıdakine benzer hızlı bir komutla test edin:

docker version
derrickmwiti@Derricks-MacBook-Pro% docker version
Client:
 Version:           28.0.1
 API version:       1.48
 Go version:        go1.23.6
 Git commit:        068a01e
 Built:             Wed Feb 26 10:38:16 2025
 OS/Arch:           darwin/arm64
 Context:           desktop-linux
Server: Docker Desktop 4.39.0 (184744)
 Engine:
  Version:          28.0.1
  API version:      1.48 (minimum version 1.24)
  Go version:       go1.23.6
  Git commit:       bbd0a17
  Built:            Wed Feb 26 10:40:57 2025
  OS/Arch:          linux/arm64
  Experimental:     false
 containerd:
  Version:          1.7.25
  GitCommit:        bcc810d6b9066471b0b6fa75f557a15a1cbf31bb
 runc:
  Version:          1.2.4
  GitCommit:        v1.2.4-0-g6c52b3f
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

Sürüm ayrıntılarını görüyorsanız Docker hazır demektir. Docker’ın kendisine ek olarak, NGINX imajını Docker Hub’dan çekmek için internet erişimine ihtiyacınız var. Kendi imajınızı oluşturmayı planlıyorsanız bir Dockerfile yazmak için bir metin düzenleyiciye de ihtiyacınız olacak. Herhangi bir metin düzenleyici iş görür; ancak size rahat geleni seçin.

Bir Docker Konteynerinde NGINX Kurulumu

Hazır bir imajdan NGINX çalıştırmak genellikle en hızlı yöntemdir. Docker Hub’dan saniyeler içinde çekebilir ve ardından bir konteyner başlatabilirsiniz. Sonrasında, tarayıcınızda varsayılan sayfayı görürsünüz. Bu kısa süreç, Docker tabanlı sunucu kurulumlarının çoğunda ilk adımdır.

NGINX Docker imajını çekme

Resmi NGINX imajı, Docker Hub’da nginx adıyla herkese açıktır. 

Şu şekilde çekin:

docker pull nginx
derrickmwiti@Derricks-MacBook-Pro % docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
4c7c1a5bd3af: Download complete 
bef2ee7fab45: Download complete 
d9b636547744: Downloading [======================>                            ]  12.58MB/28.04MB
0994e771ba34: Downloading [===>                                               ]  3.146MB/40.56MB
589701e352f8: Download complete 
13f89c653285: Download complete 
8e77214beb25: Download complete 

Bu komut kayda gider ve en son sürümü alır. Her şey tamamlandığında, makinenizde mevcut olduğunu kontrol edebilirsiniz:

docker images
derrickmwiti@Derricks-MacBook-Pro% docker images
REPOSITORY                                                                     TAG                                                                           IMAGE ID       CREATED         SIZE

nginx                                                                          latest                                                                        124b44bfc9cc   6 weeks ago     280MB
keras-custom-training-container                                                latest                                                                                                                                     <none>                                                                        7de0f04013e5   7                                                  

Bu komut yerel kitaplığınızdaki imajların bir listesini gösterir. Tablo içinde nginx imajını görmelisiniz. Bu da ondan bir konteyner oluşturmaya hazır olduğunuz anlamına gelir. Veri bilimi projeleriniz için ihtiyaç duyabileceğiniz imajların bir listesini Makine Öğrenimi ve Yapay Zeka için En İyi 12 Docker Konteyner İmajı başlıklı yazımızdan keşfedin. 

NGINX konteynerini çalıştırma

NGINX imajı sisteminizde olduğunda, tek bir komutla konteyneri başlatabilirsiniz:

docker run --name mynginx -p 8080:80 -d nginx
derrickmwiti@Derricks-MacBook-Pro % docker run --name mynginx -p 8080:80 -d nginx
ec44d1a43016e9684b602437b967c0ed8e11c933a8a76b341b68c25168d2af70

Bu komut birkaç işi birden yapar. mynginx adlı bir konteyneri arka planda (-d seçeneği sayesinde) çalıştırır. Ana makinenizdeki 8080 portunu konteyner içindeki 80 portuna eşler. Bu bağlantı eşlemesi, tarayıcınızda http://localhost:8080 adresini ziyaret edebileceğiniz ve varsayılan NGINX sayfasını görebileceğiniz anlamına gelir. Konteyner, Docker Hub’dan çekilen nginx imajını kullanır.

Yeni konteyner, NGINX etkin olduğu için çalışmaya devam etmelidir. Günlükleri şu komutla kontrol ederseniz:

docker logs mynginx
derrickmwiti@Derricks-MacBook-Pro % docker logs mynginx
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Sourcing /docker-entrypoint.d/15-local-resolvers.envsh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2025/03/20 04:33:10 [notice] 1#1: using the "epoll" event method
2025/03/20 04:33:10 [notice] 1#1: nginx/1.27.4
2025/03/20 04:33:10 [notice] 1#1: built by gcc 12.2.0 (Debian 12.2.0-14) 
2025/03/20 04:33:10 [notice] 1#1: OS: Linux 6.10.14-linuxkit
2025/03/20 04:33:10 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2025/03/20 04:33:10 [notice] 1#1: start worker processes
2025/03/20 04:3

NGINX’in yazdığı iletileri görebilirsiniz. 

NGINX ile Özel İçerik Sunma

Konteyner imajına dahil olan varsayılan sayfa yerine bir HTML sayfası sunmak isteyebilirsiniz. Yerel makinenizde basit bir dosya oluşturup bunu konteynere bağlayabilirsiniz. Bu, içeriğinizi konteynerden ayrı tutar. Sayfanızı her düzenlediğinizde, değişikliği görmek için tarayıcıyı yenileyebilirsiniz.

Özel bir HTML sayfası oluşturma

Yerel makinenizde uygun bir konum seçin. Örneğin, ana dizininizde html_content adlı bir klasör olabilir. Orada bir index.html dosyası oluşturun. Şuna benzer görünebilir:

<html>
<head>
    <title>My NGINX Page</title>
</head>
<body>
    <h1>Hello from my Docker NGINX setup!</h1>
    <p>This is a custom page served from a local folder.</p>
</body>
</html>

Bu, temel bir HTML sayfasıdır. İstediğiniz metni veya stilleri ekleyebilirsiniz. İhtiyaçlarınıza uygun görseller veya JavaScript de ekleyin.

HTML sayfasını NGINX konteynerine bağlama

Resmi NGINX imajı, varsayılan olarak içeriği /usr/share/nginx/html konumundan sunar. Yerel klasörünüzü konteyner içindeki bu konuma eşleyebilirsiniz. Bu, Docker’da -v (volume) bayrağıyla yapılır. Bir bağlantı noktası çakışmasını önlemek için mynginx adlı mevcut bir konteyneri durdurun:

docker stop mynginx
docker rm mynginx

Ardından yeni bir konteyner başlatın:

docker run --name mynginx -p 8080:80 -d \
    -v /Users/derrickmwiti/Documents/html_content:/usr/share/nginx/html \
    nginx
6f68085733eeac418c3302e5c580a4f7c5c0c36d3591d8e2a7f35f69f6308d18

/path/to/html_content yolunu, bilgisayarınızdaki gerçek yol ile değiştirin. Böylece, http://localhost:8080 adresine her gittiğinizde, konteyner html_content içine koyduğunuz HTML dosyasını sunar. Varsayılan olarak dosyayı index.html olarak adlandırırsanız, NGINX o dosyayı otomatik olarak yükler.

HTML sayfasını NGINX konteynerine bağlama

Bu yaklaşım, içeriği düzenli olarak değiştirmek istediğinizde faydalıdır. Her seferinde konteyneri yeniden oluşturmanız gerekmez. Sunucu, içeriği yerel klasörünüzden anlık olarak çeker. 

İzinle ilgili bir uyarı görürseniz, yerel kullanıcınızın ve Docker’ın o klasörü okuyabildiğinden emin olmanız gerekebilir. 

Linux’ta bu, sahipliği veya dosya izinlerini ayarlamak anlamına gelebilir. Windows veya macOS’ta ise sürücünüze erişmesi için Docker’a izin vermeniz gerekebilir.

Özel Bir NGINX Docker İmajı Oluşturma

Yerel bir klasörü bağlamak, basit testler için hızlı bir çözümdür. Ek modüller, özel bir yapılandırma veya başka bir ince ayar isteyebilirsiniz. İşte bu noktada bir imaj oluşturmak faydalı olur. 

Docker, Dockerfile olarak bilinen küçük bir tarif dosyası oluşturmayı kolaylaştırır; böylece konteyneri tam istediğiniz gibi kurabilirsiniz. Ardından başkalarıyla paylaşabileceğiniz ya da bir kayda gönderebileceğiniz bir imaja sahip olursunuz. Bu, insanlara bir sürü yerel dosyayı bağlamalarını söylemekten daha pratik olabilir.

Bir Dockerfile oluşturma

Dockerfile yalnızca düz bir metin dosyasıdır. Adını Dockerfile koyabilirsiniz ya da isterseniz başka bir ad seçebilirsiniz. Yeni bir dizine yerleştirin. İşte basit bir örnek:

FROM nginx:latest

COPY index.html /usr/share/nginx/html/index.html

Bu, resmi nginx:latest imajını temel alır. Ardından yerel index.html dosyasını konteynerdeki varsayılan web içerik klasörüne kopyalar. Gerekirse daha fazla satır ekleyebilirsiniz. Örneğin, özel bir nginx.conf kopyalayabilir veya kurmak istediğiniz modülleri ekleyebilirsiniz. Bu, ihtiyaçlarınıza bağlıdır. Yalnızca statik bir sayfa yerleştirmek istiyorsanız, yukarıdaki parça yeterlidir.

Dockerfile’ı hazırladıktan sonra, aynı klasöre özel index.html dosyanızı ekleyin. Ardından derleyebilirsiniz. Tipik komut şudur:

docker build -t mynginximage .
[+] Building 2.6s (7/7) FINISHED                                                                                                                                                       docker:desktop-linux
 => [internal] load build definition from Dockerfile                                                                                                                                                   0.0s
 => => transferring dockerfile: 245B                                                                                                                                                                   0.0s
 => [internal] load metadata for docker.io/library/nginx:latest                                                                                                                                        0.0s
 => [internal] load .dockerignore                                                                                                                                                                      0.0s
 => => transferring context: 2B                                                                                                                                                                        0.0s
 => [internal] load build context                                                                                                                                                                      0.0s
 => => transferring context: 365B                                                                                                                                                                      0.0s
 => [1/2] FROM docker.io/library/nginx:latest@sha256:124b44bfc9ccd1f3cedf4b592d4d1e8bddb78b51ec2ed5056c52d3692baebc19                                                                                  2.3s
 => => resolve docker.io/library/nginx:latest@sha256:124b44bfc9ccd1f3cedf4b592d4d1e8bddb78b51ec2ed5056c52d3692baebc19                                                                                  2.3s
 => [2/2] COPY index.html /usr/share/nginx/html/index.html                                                                                                                                             0.0s
 => exporting to image                                                                                                                                                                                 0.1s
 => => exporting layers                                                                                                                                                                                0.0s
 => => exporting manifest sha256:19dd719772fd7ac839fadb7d49862f84422f4571a442994ffaca152e9674553a                                                                                                      0.0s
 => => exporting config sha256:e974f3ab92a0278e419f0fe4c5a6fc43fafb4a75da27895d90c4f2d5d385daa1                                                                                                        0.0s
 => => exporting attestation manifest sha256:e391b0212e5a100bd9132fbbd6cb4052e288dbbcba093839b55f8b197131372b                                                                                          0.0s
 => => exporting manifest list sha256:d35c2bbe10ab0b7e46d1ef8fba6c6cb28628eb9c283db02607e32e95b62e14d5                                                                                                 0.0s
 => => naming to docker.io/library/mynginximage:latest                                                                                                                                                 0.0s
 => => unpacking to docker.io/library/mynginximage:latest                                                                                                                                              0.0s

Sondaki nokta, geçerli dizinin derleme bağlamı olduğunu belirtir. Docker, o dizindeki Dockerfile’ı okur. Sonunda yerel sisteminizde mynginximage adlı bir imaj elde edersiniz. Şununla kontrol edin:

docker images
mynginximage                                                                   latest                                                                        d35c2bbe10ab   36 seconds ago   281MB

Listede yeni adı görmelisiniz. Bu yaklaşım, Dockerfile ve HTML’inizi tek bir imajda birleştirdiğiniz anlamına gelir. Çalışma zamanında hiçbir şey bağlamanız gerekmez.

Özel imajı derleme ve çalıştırma

Artık mynginximage hazır olduğuna göre, çalıştırabilirsiniz:

docker run --name mycustomnginx -p 8080:80 -d mynginximage

Bağlantı noktası çakışmalarını önlemek için önceki konteyneri durdurduğunuzdan emin olun. 

Bu konteyner, Dockerfile’a yerleştirdiğiniz sayfayı otomatik olarak sunar. Tarayıcıda http://localhost:8080 adresini açarsanız, o HTML metnini görmelisiniz. 

Özel imajı derleme ve çalıştırma

Dockerfile’ınızı başkalarıyla paylaşabilir veya derlenen imajı bir kayda gönderebilirsiniz. Böylece ekip arkadaşlarınız veya meslektaşlarınız yerel klasörleri kopyalamadan imajı kolayca çalıştırabilir.

Bu, minimal bir özel NGINX imajı oluşturma sürecini tamamlar. Resmi temelden başladınız, bir iki dosya kopyaladınız ve özel sitenizi içeren yeni bir konteyner ürettiniz. Dockerfile’ı daha da genişletebilirsiniz. Örneğin, çok aşamalı bir derlemede php-fpm ile PHP’yi ele alacak şekilde yapılandırmayı değiştirmek veya NGINX’in varsayılan olarak sunmadığı özel modüller eklemek isteyebilirsiniz.

Bu yaklaşım, Docker’ın esnekliğini öne çıkarır: Dockerfile’daki her katman belirli bir görevi üstlenebilir ve nihai imaj kolayca dağıtılabilir. Web içeriği üzerinde kontrolünüz olur; ayrıca konteynerinizin projenize uygun olması için ayarları değiştirme seçeneğiniz vardır. 

Bu 10 Docker Proje Fikrini keşfederek veri bilimi uygulamaları oluşturma ve optimize etmeye odaklı uygulamalı projelerle Docker’ı öğrenin.

NGINX’i Ters Proxy Olarak Kurma

NGINX, gelen istekleri aynı sistemdeki diğer servislere veya ayrı makinelere yönlendirebilir. Bu genellikle ters proxy kurulumu olarak adlandırılır. İsteklerin tek bir giriş noktasından geçebilmesi için NGINX’i bir uygulama grubunun önüne yerleştirebilirsiniz. 

Bu, farklı portlarda dinleyen birden fazla Docker konteyneriniz olduğunda ve hepsi için tek bir alan adı istediğinizde yaygındır. NGINX 80 veya 443 gibi standart bir portu dinler, ardından yolu, ana makine adını veya diğer etkenleri temel alarak trafiği doğru servise yönlendirir.

Ters proxy’yi anlamak

NGINX bu şekilde yapılandırıldığında, istemci arka plandaki iletişimin farkında değildir. NGINX, istekleri alıp ileten ve ardından yanıtları istemciye geri gönderen, kamusal yüz işlevini görür. 

Bu tasarım ağ yapınızı basitleştirir. Ayrıca önbellekleme ayarlamak, TLS sertifikaları eklemek, yük dengeleme yapmak veya diğer gelişmiş görevleri yürütmek için bir fırsat sunar. Bu görevleri birden çok hizmet arasında dağıtmak yerine tek bir yerde yönetmek genellikle daha kolaydır.

Tipik bir senaryo, 80 portunda NGINX çalıştıran bir konteynerin, istekleri 3000 portunda çalışan bir uygulama konteynerine göndermesini içerebilir. İstemci http://yourdomain.com adresini ziyaret ederken, trafik arka planda ayrı bir konteynere yönlendirilir. 

Bu, uygulama konteynerinizin varsayılan portunu korumasına, kullanıcı için minimum ek yükle olanak tanıyabilir. Bunu yapmanın bir başka nedeni de, servislerinizin dahili ayrıntılarını gizlemek veya tutarlı bir URL yapısı sunmak isteyebilirsiniz.

Ters proxy için NGINX yapılandırma

Bunu başarmak için, vekil (proxy) yönergeleri kullanan özel bir NGINX yapılandırma dosyasına ihtiyacınız var. Bunu, konteyneri çalıştırırken yeni bir yapılandırma dosyası bağlayarak veya bunu içeren özel bir imaj oluşturarak yapabilirsiniz. Genel fikri göstermek için basit bir örnek:

server {
    listen 80;

    location / {
        proxy_pass http://myapp:3000/;
    }
}

Yukarıdaki parçada, NGINX konteynerinizde 80 portuna gelen her istek myapp:3000 adresine gönderilir. myapp adı, Docker ağını kullandığınızda yaygın olan, bu adla erişilebilen başka bir konteyner olduğunu ima eder. 

Bağımsız konteynerler kullanıyorsanız, konteynerin IP adresini eşleyebilir veya ana makinenin IP’sini kullanabilirsiniz. Ayrıca proxy_set_header Host $host gibi daha gelişmiş ayarlar ekleyebilir ya da uygulamanıza uygun şekilde zaman aşımı değerlerini ayarlayabilirsiniz.

Bu dosyayı çalışma zamanında bağlamayı tercih ederseniz, şuna benzer bir şey yapabilirsiniz:

docker run --name nginxproxy -p 8080:80 -d \
    -v /path/to/nginx.conf:/etc/nginx/conf.d/default.conf \
    --network mynetwork \
    nginx

Bu komut, yerel nginx.conf dosyanızı varsayılan yapılandırma olarak bağlayarak NGINX konteynerini çalıştırır. Ayrıca konteyneri, diğer konteynerinizin (myapp) bulunduğu mynetwork adlı bir Docker ağına bağlar. Yapılandırmanızı konteynerin dışında tutmak istiyorsanız bu genellikle en basit yaklaşımdır. 

Statik bir düzen istiyorsanız bu dosyayı bir Dockerfile içine koymak da mümkündür. Her iki yaklaşım da, başvuru adlarının konteynerlerinize ve ağlarınıza nasıl isim verdiğinizle eşleştiği sürece çalışır.

Bu tasarım, tüm web servisleriniz için tek bir alan adı veya IP’ye ve ortak bir porta sahip olmanızı sağlar. Birden çok arka uç konteyneriyle uğraşıyorsanız, yapılandırmanızda her biri farklı bir konteyner portunu işaret eden birden çok konum tanımlayabilirsiniz. NGINX daha sonra URL yoluna göre her servise yönlendirme yapabilir. Bu, giriş noktalarını derli toplu bir şekilde birleştirdiği için mikro servisler için popüler bir yaklaşımdır.

NGINX Dağıtımı için Docker Compose Kullanma

Ters proxy, birlikte çalışan birden çok konteyneriniz olduğunda genellikle daha kullanışlı hale gelir. Docker Compose, birçok hizmeti tek bir dosyada tanımlamanıza olanak tanıyan bir araçtır. Ardından tek bir komutla hepsini ayağa kaldırabilir veya indirebilirsiniz. Tüm ayrıntılar standart bir dosyada bulunduğundan, konteyner oluşturma veya bağlantı noktası eşlemede hata yapma olasılığını azaltır.

Docker Compose’a giriş

Docker Compose, konteyner kümelerini yönetmenizi sağlar. Her hizmeti tanımlar, kullanılacak imajı, yayınlanacak portları, bağlanacak birimleri ve katılınacak ağları belirtirsiniz. Sonrasında basit bir komut (docker compose up -d) her şeyi bir anda başlatır. 

Bu yaklaşım, yerel geliştirme veya birden çok Docker konteynerini koordine etmeniz gereken hazırlık ortamları için kullanışlıdır. Yaygın dosya formatı YAML’dir.

Docker Compose çeşitli işletim sistemlerinde çalışabilse de, kurulu ve tanınır olduğundan emin olmalısınız. Modern Docker Desktop kurulumları genellikle varsayılan olarak içerir. Sürümünüzü şu komutla kontrol edin:

docker compose version
Docker Compose version v2.33.1-desktop.1

Sürüm ayrıntılarını görüyorsanız, devam etmeye hazırsınız. Görmüyorsanız, Docker Compose’u etkinleştirme veya kurma hakkında Docker dokümantasyonuna bakın.

docker-compose.yml dosyası oluşturma

Dosya genellikle bir services bölümü içerir. Aşağıda, statik içerik sunmak için tek bir NGINX konteyneri kuran basit bir docker-compose.yml örneği yer alır: 

services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"
    volumes:
      - ./html:/usr/share/nginx/html

Dosyayı şöyle yorumlayabilirsiniz:

  • services: Uygulamanızı oluşturan hizmetleri (konteynerleri) tanımlar.
  • web: Bu hizmet en son NGINX imajını kullanır.
    • ports: Konteyner içindeki 80 portunu ana makinenizdeki 8080 portuna eşler. Bu, web sunucusuna http://localhost:8080 üzerinden erişmenizi sağlar.
    • volumes: Yerel html dizinini, konteyner içindeki NGINX’in varsayılan içerik dizinine (/usr/share/nginx/html) bağlar. Bu kurulum, NGINX’in özel statik içeriğinizi sunmasını sağlar.

Docker Compose ile hizmetleri dağıtma

docker-compose.yml dosyanızın bulunduğu dizinde, html adlı bir alt dizin oluşturun.

Statik HTML dosyalarınızı (ör. index.html) bu html dizinine yerleştirin. Bu örnekte, gösterim amacıyla basit bir Bootstrap stilli sayfa oluşturdum. 

Bir terminal açın ve docker-compose.yml dosyasını içeren proje dizininize gidin.

Hizmeti başlatmak için aşağıdaki komutu çalıştırın:

docker compose up -d
[+] Running 1/1
 ✔ Container html_content-web-1  Started 

-d bayrağı, konteyneri ayrık modda çalıştırır; yani arka planda çalışmasına izin verir.

Docker Compose, geçerli dizindeki docker-compose.yml dosyasına bakar. Henüz mevcut olmayan imajları çeker ve ardından her konteyneri başlatır. 

Web tarayıcınızı açın ve http://localhost:8080 adresine gidin.

NGINX’in statik içeriğinizi sunduğunu görmelisiniz.

Docker Compose ile hizmetleri dağıtma

Çalışan hizmetlerinizin durumunu şununla inceleyebilirsiniz:

docker compose ps

Her şeyi kapatmanız gerekirse, tek bir komut konteynerleri kaldırabilir:

docker compose down

Bu, hepsini bir kerede durdurur ve kaldırır. Tüm ortamı çoğaltmak isterseniz, Docker Compose dosyasını ve ilgili kodu yeni bir makineye kopyalayıp aynı komutları çalıştırmanız yeterlidir. Bu, minimum manuel adımla tutarlı sonuçlar elde etmenizi sağlar.

NGINX Konteynerlerini Yönetme

Docker Compose yaklaşımı çoklu hizmet iş akışları için popüler olsa da, bazen yalnızca tek bir konteyneri veya küçük bir kümeyi yönetmeniz gerekir. Docker, nelerin çalıştığını görmenize, konteynerleri duraklatmanıza veya durdurmanıza ve gerekirse kaldırmanıza yardımcı olan birkaç temel komut sağlar. 

Bunlar, özellikle birden fazla NGINX konteyneri veya tekrarlı derlemelerle denemeler yapıyorsanız, bakım için elzemdir.

Çalışan konteynerleri görüntüleme

Hangi konteynerlerin çalıştığını görmek istediğinizde şunu kullanabilirsiniz:

docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                  NAMES
2d386c085129   mynginximage   "/docker-entrypoint.…"   4 minutes ago   Up 4 minutes   0.0.0.0:8080->80/tcp   mycustomnginx

Bu komut, her biri bir kimlik, imaj, ad ve daha fazlasına sahip etkin konteynerlerin bir tablosunu yazdırır. Duranlar da dahil tüm konteynerleri görmek isterseniz şunu kullanın:

docker ps -a

Bu, sisteminizde var olan tüm konteynerleri, çıkmış olanlar da dahil, gösterir. Eski çalıştırmalardan hangilerinin hâlâ kaldığını görmek çoğu zaman faydalıdır. Birden fazla imajla denemeler yaptıysanız, mynginx, mycustomnginx gibi adlara sahip konteynerleriniz olabilir.

Konteynerleri durdurma ve kaldırma

Bir konteynerle işiniz bittiğinde, adını kullanarak durdurabilirsiniz:

docker stop mynginx
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                  NAMES
2d386c085129   mynginximage   "/docker-entrypoint.…"   4 minutes ago   Up 4 minutes   0.0.0.0:8080->80/tcp   mycustomnginx

Bu komut, konteynere bir durdurma sinyali gönderir; bu da NGINX’in düzgün şekilde kapanmasına yol açmalıdır. Hemen ardından konteyneri kaldırmak isterseniz şunu çalıştırın:

docker rm mynginx

Durdurma ve kaldırmayı tek adımda yapan bir komutu tercih ediyorsanız şunu deneyin:

docker rm -f mynginx

Bu, konteyner hâlâ çalışıyorsa durdurup kaldırmayı zorlar. Üretim ortamında bu yaklaşımı kullanırken dikkatli olun; çünkü konteyneri zarif bir şekilde kapatmadan sonlandırır. Bir diğer bakım komutu olan docker rmi, sisteminizden imajları kaldırır. 

Bu, artık ihtiyaç duymadığınız imajları silerek alan açmak istediğinizde faydalıdır. Ancak Docker, yalnızca çalışan bir konteyner tarafından kullanılmayan imajları siler.

Sonuç

Docker içinde NGINX, web sayfaları sunmanın veya trafiği diğer servislere yönlendirmenin kullanışlı bir yoludur. Resmi imajı çalıştırabilir veya basit bir Dockerfile ile kendi imajınızı oluşturabilirsiniz. Docker Compose, birden çok konteyneri koordine ederek karmaşık kurulumları yönetmeyi kolaylaştırır. 

Bu yöntemlerle içerik sunabilir, yönlendirme yapabilir ve web projeleri için güvenilir bir ortam sürdürebilirsiniz. 

Docker’ı daha uygulamalı bir yaklaşımla öğrenmeye ihtiyaç duyuyorsanız, veri profesyonellerinin araç setindeki önemini keşfetmek için Docker’a Giriş Kursumuza göz atın.

NGINX Docker SSS

Docker kullanarak bir NGINX konteynerini nasıl çalıştırırım?

Aşağıdaki komutla bir NGINX konteyneri başlatabilirsiniz:

docker run --name mynginx -p 8080:80 -d nginx

Bu, arka planda bir NGINX konteyneri çalıştırır ve makinenizdeki 8080 portunu konteyner içindeki 80 portuna eşler. Ardından tarayıcınızda http://localhost:8080 adresine giderek erişebilirsiniz.

Docker’da NGINX ile özel içerik nasıl sunarım?

HTML dosyalarınızı sunmak için, yerel bir dizini NGINX konteynerine şu şekilde bağlayın:

docker run --name mynginx -p 8080:80 -d -v /path/to/html:/usr/share/nginx/html nginx

/path/to/html yolunu HTML dosyalarınızın gerçek yolu ile değiştirin. Konteyner, varsayılan sayfa yerine bu dizindeki içeriği sunacaktır.

Docker’da NGINX’i ters proxy olarak nasıl yapılandırırım?

Aşağıdaki içerikle özel bir nginx.conf dosyası oluşturun:

server {
    listen 80;
    location / {
        proxy_pass http://myapp:3000/;
    }
}

Ardından, bağlanmış yapılandırma dosyasıyla NGINX konteynerini çalıştırın:

docker run --name nginxproxy -p 8080:80 -d -v /path/to/nginx.conf:/etc/nginx/conf.d/default.conf nginx

Bu, http://localhost:8080 adresinden gelen istekleri 3000 portunda çalışan uygulamanıza yönlendirecektir.

NGINX’i diğer hizmetlerle birlikte dağıtmak için Docker Compose’u nasıl kullanırım?

Aşağıdaki içerikle bir docker-compose.yml dosyası oluşturun:

services:
  myapp:
    image: myappimage
    expose:
      - "3000"

  nginxproxy:
    image: nginx
    ports:
      - "8080:80"
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - myapp

Hizmetleri şu komutla başlatın:

docker compose up -d

Bu komut, uygulamanızı ve NGINX proxy’sini tek bir komutla başlatır.

Docker’da bir NGINX konteynerini nasıl durdurur ve kaldırırım?

Çalışan bir NGINX konteynerini durdurmak için şunu kullanın:

docker stop mynginx

Konteyneri tamamen kaldırmak için şunu çalıştırın:

docker rm mynginx

Konteyneri ve imajını da kaldırmak isterseniz, imajı şu komutla silebilirsiniz:

docker rmi nginx

Bu, konteyneri ve saklanan imajını sisteminizden temizler.

Konular

İlgili