Alpine Linux veya Debian Buster üzerinde docker-compose kullanarak Docker tabanlı bir WordPress LEMP yığını oluşturma.
- Açıklama
- DOCKER
- DOCKER COMPOSE
- DOCKER VS DOCKER COMPOSE
- DOCKER VS SANAL MAKİNE
- DOCKER AĞ YAPILANDIRMASI
- ♻️ LEMP YIĞINI
- Proje Akış Şeması
- Kurulum
- Kaynaklar
Docker, Dotcloud (Bir PaaS Şirketi) tarafından Go dilinde geliştirilmiş popüler bir açık kaynak projesidir.
Linux Kernel özelliklerini (isim alanları ve kontrol grupları gibi) kullanarak bir işletim sistemi üzerinde konteynerler oluşturan bir konteyner motorudur. Bu nedenle buna OS seviyesinde sanallaştırma denebilir.
Docker, konteynerler kullanarak uygulamaları kurmak ve dağıtmak için kullanılır. Docker ortamı, uygulama geliştirme yaşam döngüsünü kolaylaştırır ve gelişmiş bir Docker aracı olan Docker Compose, iş akışınızı basitleştirmek için kullanılabilir.
Docker'ın temel yapısı imageler ve konteynerler üzerine kuruludur. Bir konteyneri nesne, imajı ise sınıfı olarak düşünebiliriz.
Konteyner, belirli bir uygulamayı çalıştırmak için gereken her şeyi içeren izole bir sistemdir. Gerekli ortamı simüle eden bir imajın belirli bir örneğidir. Ubuntu Docker konteynerını çalıştırıp bash kabuğuna erişmek için örnek komut: docker run -i -t ubuntu /bin/bash
Imageler ise konteynerları başlatmak için kullanılır. Çalışan konteynerlerden imageler alabiliriz. Bunlar, uygulamaları paketlemenin sistemden bağımsız bir yolunu oluşturmak için bir araya getirilebilir.
Imageler önceden oluşturulmuş olabilir, kayıt defterlerinden alınabilir, mevcut olanlardan oluşturulabilir veya ortak bir ağ üzerinden birleştirilebilir.
Docker ekosistemi şu dört bileşenden oluşur:
- Docker Daemon (dockerd)
- Docker İstemcisi
- Docker Imageleri
- Docker Kayıt Defterleri
- Docker Konteynerları
Docker istemci-sunucu mimarisine sahiptir. Docker Daemon (dockerd) veya sunucusu, konteynerlerle ilgili tüm eylemlerden sorumludur.
Daemon, Docker istemcisinden komutları CLI veya REST API aracılığıyla alır. Docker istemcisi, daemon ile aynı ana bilgisayarda veya başka bir ana bilgisayarda bulunabilir.
Varsayılan olarak, docker daemon docker.sock UNIX soketini dinler. Docker API'sine uzaktan erişmek için herhangi bir kullanım durumunuz varsa, bunu bir ana bilgisayar portu üzerinden açmanız gerekir. Jenkins ajanları olarak Docker çalıştırmak böyle bir kullanım durumudur.
Docker içinde Docker çalıştırmak istiyorsanız, ana makinedeki docker.sock'u kullanabilirsiniz.
Docker istemcisi, kullanıcıların bir Docker daemon'ına uygulama komutlarını çalıştırmasına ve durdurmasına olanak tanıyan bir komut satırı arayüzü (CLI) sağlar.
Docker imageleri için bir depodur.
Kayıt defteri genel veya özel olabilir. Örneğin, Docker Inc., Docker Hub adında barındırılan bir kayıt defteri hizmeti sağlar. Bu, merkezi bir konumdan imageleri yüklemenize ve indirmenize olanak tanır.
Dockerfiles, uygulamamızı nasıl konteynerize ettiğimiz veya önceden oluşturulmuş bir imajdan yeni bir konteyner oluşturup uygulamamızı başlatmak için özel mantık eklediğimizdir. Bir Dockerfile'dan, bir imaj oluşturmak için Docker build komutunu kullanırız.
Bir Dockerfile'ı, bir imaj oluşturmak için komut satırında çağırdığımız komutları içeren bir metin belgesi olarak düşünün.
Aşağıda bir Dockerfile örneği verilmiştir: FROM python:3
WORKDIR /usr/src/app
COPY requirements.txt ./ RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD [ "python", "./your-daemon-or-script.py" ]
Bir Dockerfile katmanlar halinde çalışır. Bunlar Docker'ın yapı taşlarıdır. İlk katman, FROM anahtar kelimesiyle başlar ve hangi önceden oluşturulmuş imajı kullanarak bir imaj oluşturacağımızı tanımlar. Daha sonra kullanıcı izinlerini ve başlangıç komut dosyalarını tanımlayabiliriz.
Docker'da, bir konteyner salt okunur bir katmanın üzerine inşa edilmiş, salt okunur bir katman olan bir imajdır. Bu katmanlara ara imageler denir ve bunlar, oluşturma aşamasında Dockerfile'ımızdaki komutları yürüttüğümüzde oluşturulur.
Docker Compose: Çoklu konteyner uygulamalarını tanımlamak ve çalıştırmak için kullanılan bir Docker aracıdır. Compose ile, uygulamanızın hizmetlerini yapılandırmak ve uygulamanın tüm hizmetlerini bu yapılandırmadan oluşturmak için bir YAML dosyası kullanırsınız.
docker-compose'u otomatikleştirilmiş çoklu konteyner iş akışı olarak düşünün. Compose, geliştirme, test, CI iş akışları ve hazırlık ortamları için mükemmel bir araçtır. Docker belgelerine göre, Docker Compose'un en popüler özellikleri şunlardır:
- Tek bir ana bilgisayarda birden çok izole ortam
- Konteynerler oluşturulurken birim verilerini koruma
- Yalnızca değişen konteynerleri yeniden oluşturma
- Değişkenler ve bir kompozisyonu ortamlar arasında taşıma
- Birlikte çalışan birden çok konteyneri düzenleme
Daha önce tartıştığımız gibi, bir Dockerfile, bir Docker imajı oluşturmak için talimatları içeren bir komut dosyasıdır. Kullanılacak temel imajı, çalıştırılacak komutları ve imaja kopyalanacak dosyaları belirtir. Bir Dockerfile oluşturduktan sonra, bir imaj oluşturmak için docker build komutunu kullanabilirsiniz, daha sonra bu imaj bir konteyner olarak çalıştırılır.
Bu arada, Docker Compose, çoklu konteyner Docker uygulamalarını tanımlamak ve çalıştırmak için kullandığımız araçtır. Uygulamanızı oluşturan hizmetleri, yapılandırmalarını ve bağımlılıklarını docker-compose.yml adlı tek bir dosyada tanımlamak için kullanabilirsiniz.
Dockerfiles ve Docker Compose farklı roller oynar, ancak DevOps iş akışınızı kolaylaştırmaya yardımcı olmak için uyum içinde çalışır.
Docker metodolojisi, oluşturmanız gereken her imaj için uygun bir Dockerfile yazmak, ardından imageleri build komutunu kullanarak gruplamak için Docker Compose'u kullanmaktır.
Hem sanal makineler hem de konteynerler, geliştirme ortamını çoğaltmaya ve bağımlılıkları ile yapılandırmaları daha iyi yönetmeye yardımcı olur. Ancak, uygulamaya bağlı olarak bir VM veya Docker konteynerı seçmenize yardımcı olacak bazı farklılıkların farkında olmalısınız.
Şimdiye kadar anladığımız kadarıyla, hem sanal makineler hem de Docker konteynerları uygulamaları çalıştırmak için izole ortamlar sağlar. İkisi arasındaki temel fark, bu izolasyonu nasıl sağladıklarında yatar. Bir VM'nin kendi konuk işletim sistemini başlattığını hatırlayın. Bu nedenle hem işletim sistemi çekirdeğini hem de uygulama katmanını sanallaştırır. Bir Docker konteyneri yalnızca uygulama katmanını sanallaştırır ve ana bilgisayar işletim sisteminin üzerinde çalışır.
Sanal makine kendi işletim sistemini kullanır ve üzerinde çalıştığı ana bilgisayar işletim sisteminden bağımsızdır. Bu nedenle, bir VM tüm işletim sistemleriyle uyumludur.
Bir Docker konteyneri ise herhangi bir Linux dağıtımıyla uyumludur. Docker'ı bir Windows makinesinde veya eski bir Mac'te çalıştırırken bazı sorunlarla karşılaşabilirsiniz.
Bir Docker imajı hafiftir ve tipik olarak kilobayt mertebesindedir.
💡 Not: Bir Docker imajı, uygulamayı, ilişkili bağımlılıklarını ve yapılandırmasını içeren yapıyı belirtir. Docker imajının çalışan bir örneğine konteyner denir.
Bir VM örneği birkaç gigabayt hatta terabayt kadar büyük olabilir.
Performans açısından, Docker konteynerları yerel performansa yakın performans sağlar. Hafif oldukları için bunları birkaç milisaniye içinde başlatabilirsiniz.
Bir VM başlatmak, bilgisayarınızın içinde bağımsız bir makine kurmaya eşdeğerdir. Bir VM örneğini başlatmak birkaç dakika kadar sürebilir.
Docker konteynerları ana bilgisayar işletim sisteminin üzerinde çalışır. Bu nedenle, ana bilgisayar işletim sistemi güvenlik açıklarına karşı hassassa, Docker konteynerları da hassastır.
Sanal makineler ise kendi işletim sistemlerini başlatır ve daha güvenlidir. Hatırlayın: her sanal makine, başka birinin içinde çalışan tam teşekküllü bir makinedir. Hassas uygulamalar için karşılanması gereken katı güvenlik kısıtlamalarınız varsa, bunun yerine bir sanal makine kullanmayı düşünmelisiniz.
Şimdi ele alacağımız bir sonraki faktör, VM'ler ve konteynerler tarafından sağlanan izole ortamları çoğaltmanın kolaylığıdır. Çoğaltılabilirliğin kolaylığını boyut ve performans hakkındaki önceki tartışmalarımızdan çıkarabiliriz.
Her biri bir VM örneğinde çalışması gereken birden çok uygulama olduğunda, VM kullanmak verimsiz ve kaynak yoğun olabilir. Docker konteynerları, hafif ve performanslı olmaları sayesinde, birden çok uygulama çalıştırmanız gerektiğinde tercih edilir. ✅
daha fazla bilgi için: Docker vs Sanal Makine (VM) - Bilmeniz Gereken Temel Farklar
Docker Ağ Yapılandırması - Konteynerlerin Birbirleriyle Nasıl İletişim Kurduğunu Keşfedin
Docker Ağları — Bölüm(1/2)
Docker Ağları — Bölüm(2/2)
Konu, bir LEMP yığını oluşturmamızı istiyor:
- L, işletim sistemi olarak Linux anlamına gelir
- E, web sunucusu olarak Nginx
- M, veritabanı olarak Mariadb
- P, sunucu ve veritabanıyla iletişim kuran sunucu tarafı komut dosyası dili olarak PHP Yığının her bileşeni birbiriyle iletişim kurar:
Özel anahtar güvenli bir varlıktır ve kısıtlı erişimi olan bir dosyada saklanmalıdır, ancak nginx'in ana süreci tarafından okunabilir olmalıdır.
- HTTP : Hiper Metin Transfer Protokolü
- HTTPS : HTTP Secure (HTTPS) = TLS/SSL üzerinden HTTP
- SSL : Secure Sockets Layer
- TLS : Taşıma Katmanı Güvenliği = SSL'in halefi
MariaDB Sunucusu, veritabanlarını ve tabloları içeren MariaDB veri dizinine erişimi yönetir. MariaDB sunucusu başladığında, istemci programlarından gelen ağ bağlantılarını dinler ve bu istemciler adına veritabanlarına erişimi yönetir.
mysqld asıl MariaDB Sunucu ikili dosyasıdır.
mysqld_safe Unix'te bir mysqld sunucusu başlatmanın önerilen yoludur. mysqld_safe, bir hata oluştuğunda sunucuyu yeniden başlatma ve çalışma zamanı bilgilerini bir hata günlük dosyasına kaydetme gibi bazı güvenlik özellikleri ekler.
mysql_install_db MariaDB veri dizinini başlatır ve mysql veritabanındaki sistem tablolarını (eğer yoksa) oluşturur.
PHP işlemeyi doğrudan kendi başına halledebilen Apache'nin aksine, Nginx bir PHP komut dosyasını nasıl çalıştıracağını bilmez. PHP isteklerini işlemek için PHP-FPM gibi ayrı bir PHP işlemcisine güvenmelidir.
PHP-FPM bir PHP-FastCGI Süreç Yöneticisidir. Bir PHP dili yorumlayıcısıdır ve php isteklerini yönetir.
Nginx sunucusu yalnızca HTTP isteklerini işleyecek, PHP-FPM hizmeti ise PHP kodunu yorumlayacaktır. Bir kullanıcı bir PHP sayfası istediğinde, Nginx sunucusu isteği FastCGI protokolünü kullanarak PHP-FPM hizmetine iletecektir. PHP-FPM, kendi sürecini oluşturarak Nginx ortamının dışında çalışır.
PHP-FPM Unix soketlerini veya TCP soketlerini (burada kullandığımız) dinleyebilir.
Günümüzde bir web sitesine bakarsanız, yalnızca HTML belgeleri olan bir sunucu siteyi çalıştıramaz. HTML dosya yönetimi, yüksek hızlı veri işleme, kullanıcı tarafından girilen verilerin depolanması vb. statik HTML dosyalarını işleyen bir web sunucusuyla imkansızdı ve böylece CGI ortaya çıktı.
CGI, bu web sunucuları (Nginx, Apache) ile PHP ve Python arasında, standartlaştırılmış sözlerle birbirlerine veri iletmek ve işlemek için vardır.
Bu CGI'da, kullanıcı tarafından istenen bilgi statik bir HTML dosyası değilse, ancak PHP veya Python'dan bir istek gelirse, web sunucusu bunu işleyemeyeceğini bilir ve geliştirici tarafından yazılan PHP komut dosyasını okuması ve işlemesi için PHP yorumlayıcısına istekte bulunur. Sonuç web sunucusuna döndürülür, o da tarayıcıya döndürür.Hizmetler giderek büyüdükçe, CGI da sınırlarına ulaşıyor.
CGI, her istendiğinde bir işlem oluşturur ve işlem çalışırken sistem kaynaklarını tüketir. Ayrıca, aynı anda çok sayıda istek oluşursa, işlem oluşturulur ve sunucu üzerinde bir yük oluşturur.
CGI'nın yük problemi nedeniyle sunucu üzerinde verimsizdi. Bir çözüm olarak FastCGI, CGI'nın evrim geçirmiş halidir. 20 yılı aşkın süredir standarttır ve çoğu web sunucusu (Nginx, IIS, Apache) FastCGI işlevi sağlar.
FastCGI, mevcut CGI gibi her istek için bir işlem oluşturmak yerine, tek bir büyük işlem oluşturarak birden çok isteği işler.
Ayrıca, FastCGI ile soket iletişimi aracılığıyla arka uçta bir PHP sunucusu kurarak web sunucusunu ve PHP'yi ayırmak mümkündür. Buna WAS (Web Uygulama Sunucusu) denir.
-
Proje klasörünü klonlayın:
git clone https://github.com/e-kose/__docker__.git -
Klasöre gidin:
cd inception -
Imageleri oluşturun ve altyapıyı dağıtın:
make -
Konteynerları, imageleri, birimleri ve ağı durdurun ve kaldırın:
make clean
- Docker Nedir? Nasıl Çalışır?
- Cgroups, namespaces, and beyond: Konteynerler nelerden oluşur?
- Konteynerler vs. Sanal Makineler
- Yeni Başlayanlar İçin Docker Eğitimi
- Docker Ağ Kavramlarını Açıklama
- Örneklerle Dockerfile eğitimi - temeller ve en iyi uygulamalar
- Docker ağı ÇILGINCA!!!
- Docker Konteynerları Arasında Nasıl İletişim Kurulur
- Docker Compose Kullanarak NGINX, PHP-FPM ve MariaDB ile WordPress Dağıtımı
- Nginx'i Yalnızca TLS 1.2 / 1.3 Kullanacak Şekilde Yapılandırma
- MariaDB Nasıl Kurulur
- wp-cli Kullanarak WordPress Nasıl Kurulur
- CGI ve FastCGI Öğrenin
- adminer kurulumu










