Bloğa geri dön

Docker Compose ile Laravel, Nginx ve MySQL Dağıtımı

Docker Compose ile Laravel, Nginx ve MySQL Dağıtımı

Giriş

Sürekli Entegrasyon (CI) ve Sürekli Dağıtım (CD), şu anda yazılım geliştirme alanındaki en popüler konulardan bazılarıdır. Yazılım mimarisinin CI/CD yönünü gerçekleştirmek için geliştiriciler konteynerlerden yararlanır. Konteynerler hafif, sanallaştırılmış, taşınabilir, yazılım tanımlı ortamlardır. Konteynerlerde yazılım, fiziksel ana makinede çalışan diğer yazılımlardan izole bir şekilde çalışabilir. Bu kılavuzun odak noktası, web uygulamalarını dağıtmak ve çalıştırmak için Docker konteyner platformunu kullanmaktır. Docker, bir web sunucusu yığınının kurulum sürecini kolaylaştırmaya yardımcı olur. Bu kılavuzda, bir Laravel uygulamasını sunmak için LEMP yığınını kullanacağız.

LEMP yığını, işletim sistemi olarak Linux'u, Nginx web sunucusu olarak, MySQL veritabanı olarak ve PHP dilini ise betik oluşturma ve dinamik işleme için bir araya getirir. Ubuntu üzerinde bir LEMP yığınının nasıl kurulacağı ve yapılandırılacağına ilişkin kılavuzumuzu takip edebilirsiniz. Laravel, web uygulamaları geliştirmek için en popüler PHP çerçevelerinden (framework) biridir.

Docker, bir docker konteynerinin kurulum sürecini tanımlamak için Docker Compose adında bir araç sunar. Docker Compose, geliştiricilerin uygulamalarının altyapısını, servislerini, birimlerini (volumes), ağlarını ve tüm bağımlılıklarını docker-compose dosyası adı verilen tek bir dosyada tanımlamalarına olanak tanır. docker container create, docker container run vb. komutları aracılığıyla birden fazla Docker konteynerini yönetebilir.

Bu kılavuzda, bir Docker konteyneri içinde Nginx ve MySQL ile bir Laravel web uygulamasını nasıl dağıtacağınızı. Tüm yığının yapılandırmaları, bir docker-compose dosyasının yanı sıra PHP, MySQL ve Nginx için diğer yapılandırma dosyalarının içinde tanımlanacaktır. Hadi başlayalım!

Öncelikli İşler

Adım 1: Laravel'i İndirin ve Bağımlılıkları Kurun

İlk adım, Laravel kodunu bir depodan almaktır. Gerçek senaryolarda Laravel kodunuz GitHub, Bitbucket, Gitlab vb. bir depoda bulunabilir. Ancak bu kılavuzun hatırına, en son sürümü GitHub üzerindeki resmi Laravel deposundan klonlayacağız. Depo, PHP için uygulama düzeyinde bir bağımlılık yöneticisi olan bir composer dosyasıyla birlikte gelir. Her şeyin Docker konteyneri içinde çalışmasını istediğimiz için bağımlılıkları Docker composer imajını kullanarak kuracağız. Bu aynı zamanda gerçek ana makineye composer'ı genel olarak kurma zorunluluğundan kaçınmamıza da yardımcı olacaktır. Ardından, terminalinizi açın.

Ev dizininize geçin:

Depoyu laravel-web adında bir dizine klonlamak için aşağıdaki komutu girin. İstediğiniz gibi adlandırmakta özgürsünüz. Bu kılavuzun yazıldığı sırada, bu komutu çalıştırdığımızda Laravel sürüm 8'i çekiyordu. Komutu çalıştırdığınızda muhtemelen yeni bir sürüm bulacaksınız:

Ardından, depoyu yeni klonladığınız dizine gidin:

Laravel uygulamanızın ihtiyaç duyduğu dizinleri bağlamak için aşağıdaki komutu girerek Docker'ın composer imajını kullanın::

docker run komutundaki -v ve –rm bayrakları, kaldırılmadan önce geçerli dizine bağlanacak (bind-mount) geçici bir konteyner oluşturur. Komut, ~/laravel-web içeriğini konteynere kopyalar ve composer tarafından oluşturulan vendor klasörünün geçerli dizine geri kopyalanmasını sağlar.

Şimdi, laravel-web dizininin sahipliğini root olmayan kullanıcıya değiştirmeniz gerekiyor. Bu, sonraki adımlarda uygulama kodunuzla root olmayan bir kullanıcı olarak çalışmanıza ve konteyner içinde süreçleri çalıştırmanıza olanak tanıyacaktır. Sahipliği değiştirmek için aşağıdaki komutu girin:

Uygulama kodunuz artık yerinde. Dizinin sahibi root olmayan bir kullanıcıdır, bu nedenle docker-composer dosyasında uygulama servislerini tanımlamaya devam edebilirsiniz.

Adım 2: Docker Compose Dosyasını Oluşturma

Docker Compose, bir uygulamayı derleme ve dağıtma sürecini basitleştirir. Yapılandırmaları ve servisleri tanımladıktan sonra, uygulama bağımlılıkları konusunda endişelenmeden Docker ve Docker Compose yüklü herhangi bir ana makinede uygulamanızı kolayca dağıtabilirsiniz. En önemlisi, bunu şu bölümde göreceğimiz gibi tek bir Docker Compose komutuyla yapabilirsiniz: Adım 9.

Bu adımda, bir Laravel uygulamasını dağıtmak için gerekli web sunucusu, veritabanı ve uygulama servisleri yapılandırmalarını içeren bir Docker Compose dosyası tanımlayacaksınız.

Docker Compose dosyaları YAML uzantısıyla kaydedilen .yml dosyalarıdır. Geçerli bir Docker Compose dosyası için doğru girintilemenin gerekli olduğunu lütfen unutmayın. Düzenlemek üzere dosyayı oluşturmak ve nano ile açmak için aşağıdaki komutu girin:

Ardından, bu dosyada üç servis tanımlayacaksınız: app, webserver ve db. db bölümü uygulamanız için veritabanı kimlik bilgilerini tanımlar, bu nedenle güçlü bir mysql_root_password seçtiğinizden ve bu bölümdekiyle değiştirdiğinizden emin olun. Aşağıdaki kodu kopyalayıp yapıştırın:

Aşağıda, yukarıdaki kodda yer alan servis tanımlarının açıklamaları bulunmaktadır:

  • app: Laravel uygulamasını tanımlar ve şu bölümde tanımlayacağımız özel bir Docker imajı olan cloudsigma.com/php imajını çalıştırır: Adım 4. Ayrıca konteyner içindeki working_dir değerini /var/www/html olarak ayarlar.
  • webserver: Docker'dan nginx:alpine imajını çeker ve şu portları dışa açar: 80 ve 443.
  • db: Docker'dan mysql:5.7.32 imajını çeker ve birkaç ortam değişkeni tanımlar. Bunlar, uygulama için laravel_web adında bir veritabanını ve veritabanı için root şifresini içerir. Veritabanını istediğiniz bir isimle yeniden adlandırabilirsiniz. MYSQL_ROOT_PASSWORD özelliğini güçlü bir şifreyle değiştirmeyi unutmayın. Bu servis ayrıca ana makinedeki 3306 portunu konteynerdeki 3306 portuna eşler.

Her bir servisteki container_name özelliği, servise karşılık gelen konteyner için bir ad tanımlar. Eğer bu özelliği tanımlamazsanız, Docker her bir konteyner için rastgele bir ad seçer.

networks özelliği, konteynerler arasındaki iletişimi kolaylaştıran köprü ağı adında bir app-network tanımlar. Bir köprü ağı, yalnızca aynı ağ köprüsündeki konteynerler arasında iletişime izin veren bir yazılım köprüsü tarafından kontrol edilir. Köprü yazılım denetleyicisi, farklı köprü ağlarındaki konteynerlerin birbirleriyle doğrudan iletişim kurmasını engelleyen sürücüler yükler. Bu, yalnızca ilgili servislerin doğrudan iletişim kurabilmesini sağladığından yüksek düzeyde güvenlik sunar. İlgili işlevlere bağlanan birden fazla servis ve ağ tanımlamayı seçebilirsiniz.

Adım 3: Veriler Nasıl Kalıcı Hale Getirilir

Web uygulamanız, kullanıcılarınıza veri sunacak ve bu verileri işleyecektir. Bu adımda, uygulamanın verilerini kalıcı hale getirmek için servis tanımlarınızda volume'ları ve bind mount'ları nasıl tanımlayacağınız konusunda size rehberlik edeceğiz. Docker, verileri kalıcı hale getirmek ve uygulama yapılandırma dosyalarını kaydetmek için bind mount'lar ve volume'lar gibi inanılmaz özellikler sunar. Bunları Laravel uygulamamızı Docker ile kurarken kullanacağız.

Volume'lar, yedekleme sunması ve verileri bir konteynerin yaşam döngüsünün ötesinde kalıcı hale getirmesi gibi çeşitli nedenlerle tercih edilir. Bind Mount'lar genellikle ana makinedeki gerçek bir dizine başvurur. Bir volume oluşturduğunuzda, Docker'ın depolama dizini içinde Docker tarafından yönetilen yeni bir dizin oluşturulur. Bir bind mount oluşturduğunuzda ise, ana makine içindeki bir dosya veya dizin bir konteynere bağlanır (mutlak yolu ile referans verilir). Bu, web uygulamamız için çok önemlidir çünkü ana makinedeki kodda değişiklik yaptığınızda, bu değişiklikler anında konteynerde de kullanılabilir hale gelecektir.

Bind mount'ları kullanırken dikkatli olun. Docker konteynerinin içinde çalışan işlemler, ana makine dosya sisteminde değişiklik yapabilir ve ana sistemde çalışan Docker dışı işlemleri etkileyebilir. Docker mount'ları güçlü bir özellik olsa da, bu güvenlik etkilerinin farkında olun.

Bunu belirttikten sonra, kurulumumuzda bu iki özelliği nasıl kullanabileceğimizi görelim. İlk olarak, MySQL veritabanını kalıcı hale getirmek için bir volume tanımlayacağız. Oluşturduğumuz Docker Compose dosyasında, db servisinin altında, aşağıda vurgulandığı gibi bir volumes özelliği ekleyin:

Tanımlandığı gibi, dbdata volume'u /var/lib/mysql içeriğini kalıcı hale getirecektir. Bu, yedeklemeleri kolaylaştırır ve veri kaybı olmadan servislerin yeniden başlatılmasına olanak tanır. Ardından, servisler arasında kullanılabilir hale getirmek için Docker Compose dosyasının sonuna volumes tanımını eklemelisiniz. Dosyanın en altına aşağıdaki kod parçacığını girin:

Bir MySQL veritabanına bağlanmak için kimlik bilgileri sağlamalısınız. Bunu yapmak için, db servisinin altındaki volumes özelliğine aşağıdaki vurgulanmış kod parçacığını ekleyerek bir bind mount tanımlayın:

Kod, konteyner içindeki ~/laravel-web/mysql/my.cnf dosyasını /etc/mysql/my.cnf dosyasına bağlar. Bağlanan dosya, Adım 7.

içinde oluşturacağımız MySQL yapılandırma dosyasıdır. Konteynerin, uygulama kodunuzu sunmak için Nginx sunucusunu kullanması gerekir. Bu nedenle, bu amaçla webserver servisi altında iki adet bind mount (biri Nginx yapılandırma dosyası için, diğeri ise uygulama kodu için) tanımlayacağız. webserver servisi altındaki volumes tanımı için aşağıdaki kod parçacığını ekleyin:

Bu satır – ./:/var/www/html, ~/laravel-web dizinindeki uygulama kodunu konteyner içindeki /var/www/html dizinine bağlar. İkinci bağlama (bind mount) için, ~/laravel-web/nginx/conf.d/ dizininde bir Nginx yapılandırma dosyası oluşturulacaktır. Bu dosya, konteyner içindeki /etc/nginx/conf.d/ dizinine bağlanacaktır. Böylece, ana makinedeki yapılandırma dosyasını gerektiği gibi güncelleyebilirsiniz. Nginx conf dosyasını şu adımda oluşturacağız: Adım 6.

Kodda yapılan değişikliklerin konteynere otomatik olarak yansıması için uygulama kodunu konteynere bağlarız (bind mount). Bu, dağıtım sürecini hızlandırır. Bu nedenle, aşağıdaki vurgulanmış kod parçacığını app servisine ekleyin:

İkinci satır, Adım 5 kapsamında ~/laravel-web/php/laravel.ini dosyasında oluşturacağımız bir php yapılandırma dosyasını, konteyner içindeki /usr/local/etc/php/conf.d/laravel.ini dosyasına bağlar.

Tamamlanmış Docker Compose dosyanız artık şu şekilde görünmelidir:

Her şey yolunda görünüyorsa, dosyayı kaydetmek için Ctrl + O tuşlarına basın. Ardından, editörden çıkmak için Ctrl + X tuşlarına basın. Bu noktada, Docker Compose dosyası ile uygulamanız için özel bir Docker imajı oluşturabiliyor olmalısınız.

Adım 4: Dockerfile'ı Oluşturun

Dockerfile, Docker'ın özel Docker imajları oluşturmak için kullanabileceği talimatları içerir. Ayrıca uygulamanız için gerekli yazılımları yükleyebilir ve gerekli ayarları yapılandırabilir. Uygulama kodunuzu barındıracak bir konteynerin içindeki ortamı belirtirler. Oluşturduğunuz imajları paylaşmak için docker hub üzerine yükleyebilir veya diğer özel kayıt defterlerine (registry) yerleştirebilirsiniz.

Laravel uygulama imajını oluşturma talimatlarını belirtecek bir Dockerfile oluşturacağız. ~/laravel-web dizininde Dockerfile'ı oluşturmak için nano kullanın:

Açılan düzenleyicide aşağıdaki kodu ekleyin:

Dockerfile ilk olarak php:7.4-fpm Docker imajını temel alan bir imaj oluşturur. Bu, PHP FastCGI uygulaması (PHP-FPM kurulu olan Debian tabanlı bir imajdır. Laravel'in düzgün çalışması için mcrypt, pdo_mysql, mbstring ve imagick gibi diğer php uzantılarının mevcut olması gerekir ve betik bunları yükler. Ardından composer php paket yöneticisini yükler. Konteyner, Laravel php bağımlılıklarını yüklemek için bunu kullanacaktır.

Konteyner içinde kurulum, güncelleme ve ayarları yapılandırma gibi komutları tanımlamak için RUN yönergesini kullanabilirsiniz. Ayrıca kullanıcı izinlerini de atar. WORKDIR yönergesi çalışma dizinini belirtir, bu durumda /var/www/html'dir. Betik, /var/www/html dizini izinlerini www-data kullanıcısına atamak için CHOWN komutunu çalıştırır.

İmajı nihai olarak oluşturmadan önce, konteyner içinde çalışan uygulamaya erişime izin vermek için bir portun dışa açılması gerekir. EXPOSE komutu, php-fpm sunucusu için 9000 portunu dışa açar. Çalıştırılacak son komut CMD yönergesidir. Sunucuyu başlatmak için php-fpm'i çalıştırır.

Dosyayı kaydetmek için şimdi Ctrl + O tuşlarına basabilirsiniz. Ardından, düzenleyiciden çıkmak için Ctrl + X tuşlarına basın.

Adım 5: PHP'yi Yapılandırma

Bu adımda, Nginx'ten gelen istekleri işlemek için php servisini yapılandıracağız. php dizini içinde bir laravel.ini dosyası oluşturacaksınız. Bu dosya PHP yapılandırmalarını barındıracaktır. Bu, şu adımda konteyner içinde /usr/local/etc/php/conf.d/laravel.ini yoluna bağladığınız (bind-mount) dosyadır: Adım 3. Bu dosyadaki yapılandırmalar, PHP başladığında genellikle okunan varsayılan php.ini dosyasını geçersiz kılar. php dizinini oluşturmak için aşağıdaki komutu girin:

Aşağıdaki komutu girerek php dizini içinde laravel.ini dosyasını oluşturun ve açın:

Varsayılan php.ini dosyasının yükleme sınırı 2M olarak ayarlanmıştır. Örnek olarak, daha büyük dosyalar yüklemek istemeniz durumunda, izin verilen yükleme sınırı değerini değiştirerek php yapılandırmalarını nasıl ayarlayacağınızı ve belirleyeceğinizi göstereceğiz. Dosyanın içine aşağıdaki kod satırlarını girin:

Bu, yükleme sınırını ayarlar ve toplam boyutu 80MB'ı geçmeyen dosyaları yükleyebilirsiniz. Varsayılan php yapılandırmalarını geçersiz kılmak için laravel.ini dosyasına başka php yapılandırmaları da ekleyebilirsiniz. Şimdi dosyayı kaydedip kapatın.

Adım 6: Nginx'i Yapılandırma

Bu adımda, Nginx'i daha önce tanımladığımız php servisini kullanacak şekilde yapılandıracağız. Dinamik içeriği sunmak için PHP-FPM servisini FastCGI sunucusu olarak kullanacaktır. FastCGI sunucusu, etkileşimli programların bir web sunucusuyla arayüz oluşturmasını sağlayan bir yazılımdır.

Şu adımdaki docker-compose dosyasında tanımladığımız gibi: Adım 3, Nginx yapılandırma dosyası olan app.conf dosyasını ~/laravel-web/nginx/conf.d/ dizini içinde oluşturacağız. İlk olarak, dizini oluşturmak için aşağıdaki komutu girin:

Ardından, aşağıdaki komutu girerek nano kullanarak app.conf dosyasını oluşturun ve açın:

Dosyaya aşağıdaki Nginx yapılandırma kodunu ekleyin:

Nginx, URL'ye bağlı olarak bir web sitesi ziyaretçisine hangi dizinin sunulması gerektiğini bilmek için sunucu blokları (server blocks) adı verilen yapılandırma dosyalarını okur. Daha fazla bilgi edinmek için, konulu eğitimimizdeki Ubuntu üzerinde Nginx kurulumu 18.04sunucu bloklarını ayarlama bölümünü okuyun. Tanımlanan yönergeler aşağıdaki amaçlara hizmet eder:

  • listen – Sunucunun gelen istekleri dinleyeceği bağlantı noktasını (port) tanımlar, bu genellikle port 80'dir.
  • error_log & access_log – Uygulama günlüklerinin (log) yazılacağı dosyaları tanımlar.
  • root – İnternetten sunucuya yapılan herhangi bir isteğe hizmet edecek dizin olan webroot yolunu tanımlar.

php için location bloğunda, fastcgi_pass yönergesi app servisinin 9000 numaralı porttaki bir TCP soketini dinlediğini belirtir (bu Dockerfile içinde tanımlanmıştı). Bu, PHP-FPM sunucusunu bir Unix soketi yerine ağ üzerinden dinlemeye yönlendirir. Bir Unix soketi, TCP soketine göre hız açısından hafif bir avantaja sahip olsa da, bir ağ protokolünden yoksundur ve bu nedenle ağ yığınını (network stack) atlar.

Bir Unix soketi, ana bilgisayarların tek bir makinede bulunduğu senaryolar için daha uygun olacaktır. Ancak, farklı ana bilgisayarlarda çalışan servisleriniz varsa, bir TCP soketi dağıtık olan servisleri bağlama avantajına sahiptir. Bizim durumumuzda, uygulama konteyneri web sunucusu konteynerimizden farklı bir ana bilgisayarda çalışıyor. Bu nedenle, yapılandırmamız için en uygun olanı bir TCP soketidir.

Dosyayı kaydetmek için Ctrl + O tuşlarına basabilir, ardından editörden çıkmak için Ctrl + X tuşlarına basabilirsiniz. nginx/conf.d/ dizininde yapılan değişiklikler, Docker Compose dosyasında eklediğiniz bind mount sayesinde web sunucusu konteynerine otomatik olarak yansıyacaktır. Bu işlem şu adımda açıklanmıştır: Adım 3.

Adım 7: MySQL Yapılandırması

Nginx'i PHP ile çalışacak şekilde yapılandırdıktan sonra, artık PHP'ye dinamik veriler depolamak ve sunmak için MySQL'i yapılandırabiliriz. PHP ve MySQL iletişimi için gerekli eklentileri yüklemek üzere Docker Compose dosyasını zaten ayarlamıştık. MySQL yapılandırma dosyası my.cnf'yi mysql klasörü içinde oluşturacağız; bu dosya, Docker Compose'un db servisi bölümünde tanımladığımız gibi /etc/mysql/my.cnf dizinine bind-mount ile bağlanacaktır. Bu işlem şu adımda açıklanmıştır: Adım 3.

MySQL yapılandırma ayarları ve değişiklikleri my.cnf dosyasında istendiği zaman yapılabilir. Bunlar konteyner içine anında yansımalıdır. İlk olarak, aşağıdaki komutu girerek dizini oluşturun:

Ardından, aşağıdaki komutu girerek nano'yu oluşturun ve açın:

Sorgu günlüğünü (query log) etkinleştirmek ve sorgu günlüğü dosyası konumunu belirtmek için aşağıdaki kod parçacığını girin:

general_log özelliğini 1 olarak tanımlayarak genel günlüklere (general logs) izin verirsiniz. general_log_file özelliği, günlük dosyasının konumunu belirtir. Dosyayı kaydetmek için Ctrl + O tuşlarına basın, ardından editörden çıkmak için Ctrl + X tuşlarına basın.

Adım 8: Laravel Çevre Değişkenlerini Ayarlama

Bu noktaya kadar tüm servisler ve yapılandırma ayarları tamamlandı. Böylece konteynerlerimizi dağıtabiliriz. Ancak, web uygulamamızın gerçekten kullanılabilir olmasından önce tamamlanması gereken önemli bir adım var: çevre değişkenleri. Laravel framework'ü, ortamını tanımlamak için kullandığı .env adlı bir dosya bekler. Varsayılan olarak Laravel, .env dosyasına kopyalayabileceğiniz ve ardından değişkenleri kendi gerçek bilgilerinizle değiştirebileceğiniz .env.example dosyasıyla birlikte gelir. Dosyayı kopyalamak için aşağıdaki komutu girin:

Kopyalandıktan sonra, düzenlemek için nano kullanarak dosyayı açın:

İşte dosyanın nasıl görünebileceğine dair bir ekran görüntüsü:

screenshot of what the file

Dosyada bir sonraki adım, şimdiye kadar yaptığımız önceki yapılandırmalarda ayarladığınız gibi DB_CONNECTION bloğu altındaki değişkenleri değiştirmektir. Aşağıdaki gibi güncelleyin:

  • DB_HOST değeri, db veritabanı konteyneridir.
  • DB_DATABASE değeri, laravel_web.
  • DB_USERNAME veritabanı kullanıcı adıdır. İstediğiniz bir ismi seçin, ancak bu eğitim için laraveldocker.
  • DB_PASSWORD yukarıdaki kullanıcınızın veritabanına giriş yapmak için kullanacağı güçlü bir şifredir, bu nedenle güçlü bir şifre seçin. Adım 10 içerisinde, bu kullanıcıyı burada seçtiğiniz şifreyle oluşturacağız.

Değerler güncellendiğinde, DB_CONNECTION alanınız artık şu şekilde görünmelidir:

DB_CONNECTION

Dosyayı kaydedip kapatın.

Adım 9: Docker Konteynerlerini Çalıştırma

Bu aşamada, tüm servisleriniz ve yapılandırmalarınız Docker Compose dosyasında tanımlanmıştır. Tüm konteynerleri başlatmak, birimleri oluşturmak, ağları bağlamak ve uygulamanızı kurup derlemek için yalnızca tek bir komut gereklidir. Terminalinize aşağıdaki komutu girin:

docker-compose up komutunu ilk kez çalıştırdığınızda, gerekli tüm Docker imajlarını indirir. Altyapıyı yerel bilgisayarınızda kuruyorsanız, tamamlanması biraz zaman alabilir. İmajlar indirildikten sonra, Compose konteynerleri oluşturur. -d bayrağı, Docker'a konteynerleri arka planda çalıştırmasını söyler. İşlem başarıyla tamamlanırsa, terminalinizde şuna benzer bir şey görmelisiniz:

terminal

Çalışan tüm konteynerleri listelemek için terminalinize aşağıdaki komutu girin:

Uygulama (app), web sunucusu (webserver) ve veritabanı (db) konteynerleri hakkında ayrıntılar içeren, aşağıdaki ekran görüntüsüne benzer bir şey görüntülenmelidir:

screenshot details

  • CONTAINER ID – Her konteyner için benzersiz bir tanımlayıcı.
  • NAMES – Docker Compose dosyasında tanımlandığı şekliyle, her bir konteynerle ilişkili servis adı. (Bir konteynere erişmek için konteyner kimliğini veya adını kullanabilirsiniz).
  • IMAGE – Her konteyner için imaj adı.
  • STATUS – Konteynerin durumu hakkında bilgi görüntüler (durdurulmuş, çalışıyor veya yeniden başlatılıyor olabilir).
  • PORTS – Bir konteynerin dışarıya açtığı portları gösterir.

Docker Compose, bir konteyner içinde terminal komutları çalıştırmak veya komut satırına erişmek için kullanabileceğiniz exec adında bir komut sağlar. İlk olarak, Laravel uygulamasını çalıştıran konteyner olan app konteynerinin içinde bazı komutlar çalıştırmak istiyoruz.

Docker, bir konteynerin komut satırına erişmek için bir komut sağlar. Sözdizimi şu şekildedir: docker-compose exec container_name bash. App konteynerinin komut satırına erişmek için aşağıdaki komutu girin:

Konteynerin komut satırına ulaştığınızda, bazı Laravel Artisan yapılandırma komutlarını çalıştırabilirsiniz. Laravel anahtarını oluşturmak ve .env dosyasına kaydetmek için aşağıdaki komutu girin:

Ortam anahtarı ayarlandıktan sonra, yapılandırma ayarlarını önbelleğe almak için aşağıdaki komutu çalıştırabilirsiniz:

Yapılandırmalar, konteyner içindeki /var/www/html/bootstrap/cache/config.php dosyasında saklanır. Konteyner terminalinden çıkmak için Ctrl + D tuşlarına basabilirsiniz.

Laravel uygulamasının dağıtıldığını ve çalıştığını doğrulamak için tarayıcınızda sunucunuzun genel IP adresini ziyaret edin (http://your_server_public_ip). Yeni bir Laravel kurulumu için karşılama sayfasını görmelisiniz:

laravel screenshot

Adım 10: Bir MySQL kullanıcısı yapılandırın

Bu adımda, docker-compose dosyasında belirttiğimiz laravel_web MySQL veritabanı için bir veritabanı kullanıcısı oluşturacağız. Adım 9 kapsamında konteyner oluşturma komutunu çalıştırdığınızda MySQL kuruldu, ancak yalnızca veritabanında sınırsız yetkilere sahip varsayılan bir root yönetici hesabı oluşturuldu. Root kullanıcısını kullanmaktan kaçınmak için, uygulama için kullanılacak özel bir kullanıcı olan laraveldocker'ı oluşturacağız. Bu, Adım 8 içerisindeki ortam değişkenlerinde belirttiğiniz kullanıcıdır. Aşağıdaki komutu girerek terminal içindeki komut satırına erişin:

Konteynerin içine girdikten sonra, aşağıdaki komutu girerek MySQL'e giriş yapın:

Şifre isteminde, Adım 2.

içerisindeki docker-compose dosyasında db servisinde belirlediğiniz şifreyi girin. MySQL istemine giriş yaptıktan sonra, aşağıdaki SQL komutunu girerek docker-compose dosyasında belirttiğiniz veritabanını görüp göremediğinizi kontrol edin:

laravel_web veritabanını veya kurulumunuz için belirttiğiniz adı görmelisiniz:

Laravel

Ardından, laravel_web veritabanı için bir kullanıcı ve şifre oluşturuyoruz. Bu bilgiler, Adım 8 içerisindeki .env dosyasında belirttiğiniz bilgilerle aynı olmalıdır. Kullanıcı ve şifre oluşturmak ve bu kullanıcıya tüm yetkileri vermek için aşağıdaki komutu girin:

Değişikliklerin hemen yürürlüğe girmesi için ayrıcalıkları temizlemek üzere aşağıdaki komutu girin:

Bu işlem MySQL kullanıcı yapılandırmasını tamamlar. exit yazıp enter tuşuna basarak MySQL isteminden çıkın. Son olarak, Ctrl + D tuşlarına basarak db konteynerinden çıkın.

Adım 11: Laravel Uygulama Kodu ile MySQL Veritabanı Arasındaki İletişimi Test Etme

Bu adıma kadar her şey sorunsuz çalıştı. Ancak, app konteynerindeki Laravel kodunun db konteynerindeki MySQL veritabanıyla iletişim kurabildiğini doğrulamak istiyoruz. İlk olarak, aşağıdaki komutu girerek app konteyner terminaline erişin:

Sırada, tabloları oluşturan laravel migration komutunu çalıştırmak var:

Laravel varsayılan tabloları oluştururken terminalinizde migration (göç) sürecini görmelisiniz:

migration process

Ardından, veritabanına Laravel'den erişip erişemediğimizi test edeceğiz. Laravel, varsayılan olarak Tinker ile birlikte gelir; bu da veritabanına erişmek, işleri çalıştırmak, eloquent ORM ve daha fazlası dahil olmak üzere tüm uygulamayla komut satırından etkileşime girmenizi sağlar. Migrations tablosundaki verileri görüntülemek için Tinker'ı kullanabiliriz. Tinker'a erişmek için aşağıdaki komutu girin:

Tinker istemine girdikten sonra, aşağıdakileri yazarak migrate komutu tarafından oluşturulan tabloları listeleyebilirsiniz:

Aşağıdaki ekran görüntüsü, şu anda laravel_web veritabanında bulunan tablolar olan çıktıyı göstermektedir:

laravel_web database

Tablo adını belirterek bir tablodaki verileri alabilirsiniz. Örneğin, aşağıdaki komutu girerek migrations tablosundaki verileri alabilirsiniz:

Komut aşağıdaki çıktıyı verir:

comman output

Yukarıdaki çıktıdan anlaşılacağı üzere, Laravel uygulamanız iyi bir şekilde yapılandırılmıştır ve veritabanıyla iletişim kurabilmektedir. Model oluşturma, işleri çalıştırma ve daha fazlası gibi diğer komutları deneyebilirsiniz. Ctrl + D tuşlarına basarak Tinker isteminden çıkabilirsiniz.

Sonuç

Bu öğreticide, bir Docker konteyneri içinde LEMP yığınına sahip bir Laravel uygulamasını dağıttınız. Web arayüzüne erişerek ve Laravel Tinker aracılığıyla veritabanına bağlanarak uygulamayı test ettiniz. Docker Compose'un gücünü deneyimleme fırsatı buldunuz. Docker Compose, tek bir dosyada tanımlanan ve ardından tek bir komutla çalıştırılabilen bir Docker konteyner grubunu oluşturmanıza olanak tanır.

Konteynerler hakkında daha fazla bilgi edinmek isterseniz, şu belgelere göz atabilirsiniz: Docker kaynaklarını (imajlar, konteynerler ve birimler) nasıl temizleyeceğinizi gösteren öğreticimiz ve Kubernetes aracına yönelik ayrıntılı genel bakışımız.

Şu konularda daha fazla bilgi edinmek için blogumuzu ziyaret edebilirsiniz: Docker ve Sürekli Entegrasyon ile Sürekli Dağıtım.

Keyifli Çalışmalar!

author

Pranay Kapgate

Yazar · CloudSigma

Preslav Dobrev, CloudSigma'da Kreatif Tasarımcı olarak görev yapmakta olup geleneksel ve yenilikçi pazarlama kanallarını kullanarak tutarlı bir kurumsal kimlik oluşturmaya odaklanmaktadır. Sanatsal vizyonu stratejik pazarlamayla harmanlayarak etkili marka anlatıları oluşturma konusunda oldukça yeteneklidir.

Yorumlar

Henüz yorum yapılmamış. İlk siz olun.