Giriş
Docker hafif, sanallaştırılmış, taşınabilir, yazılımla tanımlanmış standartlaştırılmış bir ortam olan bir konteyner platformudur. Yazılımın, fiziksel ana makinede çalışan diğer yazılımlardan yalıtılmış olarak çalışmasını sağlar. Docker, Yazılım Geliştirmenin Sürekli Geliştirme ve Entegrasyon yönünün tanımlayıcı bir bileşenidir. Sanal makinelere hafif bir alternatif sunar ve geliştiricilerin dağıtık uygulama mimarilerinin keyfini çıkarmasını sağlar. Docker ekosistemine kapsamlı bir genel bakış için bu makaleye göz atın.
Docker ile bir uygulama oluşturma süreci, geliştiricinin uygulaması için bir imaj oluşturmasıyla başlar. Ardından imaj, bir konteyner içinde konuşlandırılır. İmaj; uygulama kodu, kütüphaneler, yapılandırma dosyaları, ortam değişkenleri ve çalışma zamanı ortamı gibi bir uygulamanın tanımlayıcı bileşenlerini barındırır. İmaj, konteyner içindeki ortamı standartlaştırarak konteynerleştirmeye taşınabilirlik özelliklerini kazandırır. Node.js JavaScript kodunu bir web tarayıcısının dışında yürütebilen, açık kaynaklı, platformlar arası bir arka uç JavaScript çalışma zamanı ortamıdır. Chrome'un V8 JavaScript Motoru. Express.js Node.js üzerinde çalışan minimalist bir arka uç JavaScript çerçevesidir.
Bu eğitimde, Express çerçevesi üzerinde çalışan bir web sitesi için bir imaj oluşturacağız. Ön ucun daha iyi görünmesini sağlamak için bir ön uç kütüphanesi olan Bootstrap kullanacağız. İmajı oluşturduktan sonra bir konteyner derleyeceğiz ve bunu Docker Hub platformuna yükleyeceğiz. Docker Hub, geliştiricilerin herhangi bir Docker ortamına kolayca konuşlandırma yapabilmesi için konteynerli uygulamaları barındırmasına olanak tanır. Konteyneriniz Docker Hub üzerinde barındırıldıktan sonra, onu çekeceğiz ve web sitemizi fiilen sunacak başka bir imaj oluşturacağız.
Ön Koşullar
Bu uygulamalı bir eğitim olacaktır. Takip edebilmenizi sağlayacak bir ortam oluşturmalısınız.
- İlk işletim ortamınız olarak bir Ubuntu 20.04 kurulumuna sahip olmalı ve sudo ayrıcalıklarına sahip root olmayan bir kullanıcı oluşturmalısınız. Root olmayan kullanıcıyla oturum açın ve aşağıdaki adımlarla devam edin.
- Docker'ı kurmanız gerekiyor. Ubuntu üzerinde Docker'ın nasıl kurulacağı ve çalıştırılacağı hakkındaki eğitimimizin 1, 2, 3 ve 4. adımlarını takip edin. Bu, herhangi bir Ubuntu dağıtımı için çalışmalıdır.
- Henüz bir hesabınız yoksa bir Docker Hub hesabı oluşturun. Docker Hub Hızlı başlangıç kılavuzu.
- için bu bağlantıyı takip edebilirsiniz. Node.js ve NPM kurulumunu yapın. NPM, bir JavaScript paket yöneticisidir. Node ve npm kurulumuna ilişkin bu talimatları.
takip edebilirsiniz. Adım 1: Uygulama Bağımlılıklarını Yapılandırma
İmajı oluşturmadan önce uygulama kaynak kodunuzu oluşturmanız gerekir. Uygulama kaynak kodu; konteynere kopyalanacak kodları, statik içerikleri ve bağımlılıkları içerir. Root olmayan kullanıcının ana dizininde projeniz için bir dizin oluşturarak başlayın. Biz buna node_express diyeceğiz, ancak istediğiniz bir dizin adını kullanmakta serbestsiniz:
|
1 |
mkdir node_express |
Ardından, bu dizine geçin:
|
1 |
cd node_express |
Burası uygulamanızın kök dizini olacaktır. Bir node.js uygulaması, kök klasörde bir package.json dosyası bekler. Npm, uygulamanızın hangi bağımlılıklara ihtiyaç duyduğunu belirlemek için bu dosyayı kullanır. Bu dosyayı oluşturmak için aşağıdaki komutu girin:
|
1 |
nano package.json |
Bundan sonra, dosyaya aşağıdaki kod parçacığını ekleyin. Adı, yazarı, açıklamayı ve giriş noktası dosyasını dilediğiniz gibi güncelleyebilirsiniz:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
{ "name": "node-express-docker-image", "version": "1.0.0", "description": "Nodejs Express Docker Image Example", "author": "hackins", "main": "index.js", "license": "ISC", "keywords": [ "nodejs", "express", "bootstrap" ], "dependencies": { "express": "^4.17.1" } } |
Görebileceğiniz gibi, bu dosya proje adını, sürümünü, yazarını ve uygulama kodunun paylaşılacağı lisansı belirtir. Projeniz için kısa ve açıklayıcı bir ad kullanmanız, şuradaki kopyaları önlemek için önerilir: npm kayıt defteri. Proje için, uygulama kodunun serbestçe kopyalanmasına, değiştirilmesine veya dağıtılmasına izin veren ISC lisansını belirttik.
En önemlisi, dosyadaki şu yönergelere dikkat etmelisiniz:
- “
main”: bu yönerge, uygulamanın giriş noktasını belirtir; biz bunu index.js olarak ayarladık. Bu dosyayı kısa süre içinde oluşturacağız. - “
dependencies”: bu yönerge,npmkomutunu çalıştırdığımızda npm kayıt defterinden çekilecek uygulama bağımlılıklarını belirtir; bizim durumumuzda Express 4.17.1 ve üzeri sürümünü istiyoruz.
Şimdi Ctrl + O tuşlarına basarak dosyayı kaydedebilirsiniz. Ardından, Ctrl + X tuşlarına basarak dosyayı kapatın. Sırada, aşağıdaki komutu çalıştırarak bağımlılıkları yükleyeceğiz:
|
1 |
npm install |
Bu komut, package.json dosyasında belirtilen uygulama bağımlılıklarını node_modules dizinlerine yükler. Komutu ilk çalıştırdığınızda bunlar otomatik olarak oluşturulmuştur. Uygulama bağımlılıklarımız yüklendiğine göre, artık uygulama kodunu eklemeye başlayabilirsiniz.
Adım 2: Uygulama Kod Dosyalarınızı Ekleme
Şunun katkılarıyla temel bir yemek tarifi web sitesi oluşturacağız: allrecipes. Uygulamanın ana giriş noktası index.js dosyasıdır. Projenin çeşitli sayfalarını ve statik varlıklarını barındıracak bir views dizini ekleyeceğiz. Web sitesinde, tanıtıcı bilgiler ve bazı tariflere bağlantılar içeren bir açılış sayfası bulunacaktır.
Açılış sayfası kodumuz home.html dosyasına yerleştirilecektir. İlk olarak, aşağıdaki komutu girerek index.js dosyasını oluşturun:
|
1 |
nano index.js |
Bir Express uygulaması içe aktaran ve oluşturan aşağıdaki kodu ekleyin. Bu kod ayrıca Router nesnesini, temel dizini ve bu uygulamanın sunulacağı bağlantı noktasını belirtir:
|
1 2 3 4 5 6 |
const express = require('express'); const app = express(); const router = express.Router(); const path = __dirname + '/views/'; const port = 8090; |
require, bir modülü yükleyen bir JavaScript işlevidir. Bu durumda, express modülünü yüklüyoruz. Ardından, express ve router nesnelerini oluşturmak için içe aktarılan modülü kullanacağız. Router nesnesi, eğitim boyunca bu nesneye ekleyeceğimiz HTTP yöntemi çağrılarına yanıt vererek uygulamanın yönlendirme işlevlerini gerçekleştirir.
Ayrıca path ve port değerlerini de ayarladık. Path sabiti, kod için temel dizini tanımlar. Bizim durumumuzda bu, proje kök dizini içindeki views alt dizinidir. port, express uygulamasının dinlemesi gereken bağlantı noktasını belirtir; örneğimizde bunu şu şekilde ayarladık: 8090.
Sabitleri belirledikten sonra, router nesnesini kullanarak uygulama için bazı rotalar belirtebiliriz. Rotaları belirtmek için index.js dosyasına aşağıdaki kodu ekleyin:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
router.use(function (req,res,next) { console.log('/' + req.method); next(); }); router.get('/', function(req,res){ res.sendFile(path + 'home.html'); }); router.get('/lasagna', function(req,res){ res.sendFile(path + 'lasagna.html'); }); router.get('/guacamole', function(req,res){ res.sendFile(path + 'guacamole.html'); }); router.get('/banana-bread', function(req,res){ res.sendFile(path + 'banana_bread.html'); }); |
You can ara katman yazılımı ekleyebilirsiniz rotalara, router.use işlevini kullanarak. Bu durumda, yönlendiricinin isteklerini uygulama rotalarına iletmeden önce günlüğe kaydeden bir işlev ekliyoruz. Uygulamanın temeline yapılacak bir GET isteği, bir home.html dosyası döndürecektir. sayfası. Ardından, belirli tarif sayfasına yönelik GET isteği kullanılarak da alınacak olan üç tarif için sayfalar ekledik.
Son olarak, router ara yazılımını ve uygulamanın statik varlıklarını bağlamak için aşağıdaki kodu ekleyin. Ek olarak, express uygulamasına şu portu dinlemesini söyleyin: 8090:
|
1 2 3 4 5 6 |
app.use(express.static(path)); app.use('/', router); app.listen(port, function () { console.log('Nodejs Express Example App listening on port ' + port) }) |
Tamamlanmış index.js dosyanız şu şekilde görünmelidir:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
const express = require('express'); const app = express(); const router = express.Router(); const path = __dirname + '/views/'; const port = 8090; router.use(function (req,res,next) { console.log('/' + req.method); next(); }); router.get('/', function(req,res){ res.sendFile(path + 'home.html'); }); router.get('/lasagna', function(req,res){ res.sendFile(path + 'lasagna.html'); }); router.get('/guacamole', function(req,res){ res.sendFile(path + 'guacamole.html'); }); router.get('/banana-bread', function(req,res){ res.sendFile(path + 'banana_bread.html'); }); app.use(express.static(path)); app.use('/', router); app.listen(port, function () { console.log('Nodejs Express Example App listening on port ' + port) }) |
Şimdi dosyayı kaydedip kapatabilirsiniz. Bir sonraki adım, statik web sayfalarını views dizinine eklemektir. Dizini oluşturmak için aşağıdaki komutu girerek başlayın:
|
1 |
mkdir views |
Enter the following command to open the home.html açılış sayfası dosyasını açmak için aşağıdaki komutu girin:
|
1 |
nano views/home.html |
Dosyaya aşağıdaki kodu ekleyin. Kod, Bootstrap'i içe aktarır ve web sitesi ziyaretçilerine web sitesinin ne hakkında olduğuyla ilgili bazı bilgiler sunar:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
<!DOCTYPE html> <html lang="tr"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="description" content=""> <meta name="author" content="Mark Otto, Jacob Thornton ve Bootstrap katkıda bulunanları"> <meta name="generator" content="Hugo 0.80.0"> <title>Harika Tarifler</title> <!-- Bootstrap core CSS --> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/css/bootstrap.min.css" rel="stylesheet" crossorigin="anonymous"> <link href="css/custom.css" rel="stylesheet"> </head> <body> <nav class="navbar navbar-dark bg-dark navbar-static-top navbar-expand-md"> <div class="container"> <button type="button" class="navbar-toggler collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false"> <span class="sr-only">Gezinmeyi aç/kapat</span> </button> <a class="navbar-brand" href="#">Harika Tarifler</a> <div class="collapse navbar-collapse justify-content-center" id="bs-example-navbar-collapse-1"> <ul class="nav navbar-nav justify-content-center"> <li class="active nav-item"> <a href="/" class="nav-link">Ana Sayfa</a> </li> <li class="nav-item"> <a href="/lasagna" class="nav-link">Lazanya</a> </li> <li class="nav-item"> <a href="/guacamole" class="nav-link">Guacamole</a> </li> <li class="nav-item"> <a href="/banana-bread" class="nav-link">Muzlu Ekmek</a> </li> </ul> </div> </div> </nav> <main> <section class="py-5 text-center container"> <div class="row py-lg-5"> <div class="col-lg-6 col-md-8 mx-auto"> <h1 class="fw-light">Harika Tarif</h1> <p class="lead text-muted"> Bu harika tariflerden günlük yemek pişirme ilhamı bulun ve paylaşın. Tarifleri, aşçıları, sevdiğiniz yiyeceklere ve takip ettiğiniz arkadaşlara göre videoları ve nasıl yapılır kılavuzlarını keşfedin. <br /> <em>(Ciddi bir şey değil, bu sadece demo node-express-docker imaj uygulamamız içindir)</em> </p> </div> </div> </section> </main> </body> </html> |
Bootstrap'i içe aktarmanın yanı sıra, sayfa ayrıca temel bir navigasyon menüsü ekler; bu da sayfalarda gezinmemize ve açılış sayfasına geri dönmemize yardımcı olur. Ayrıca özel CSS dosyamızı içe aktarmak için bir satır ekledik:
|
1 |
<link href="css/custom.css" rel="stylesheet"> |
Daha sonra uygulamaya özel stiller eklemek için bu dosyayı kullanacağız. Şimdi tarifler için üç sayfayı oluşturalım. İlk olarak lazanya sayfasını oluşturarak başlıyoruz. Aşağıdaki komutu kullanarak dosyayı nano düzenleyici ile açın:
|
1 |
nano views/lasagna.html |
Açılan dosyaya aşağıdaki kodu ekleyin. Bu dosya Bootstrap'i ve custom.css dosyasını içe aktaracak, bir navigasyon menüsü belirtecek ve bazı Lazanya tarifi bilgileri sunacaktır:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
<!DOCTYPE html> <html lang="tr"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="description" content=""> <meta name="author" content="Mark Otto, Jacob Thornton ve Bootstrap katkıda bulunanları"> <meta name="generator" content="Hugo 0.80.0"> <title>Lazanya Tarifi</title> <!-- Bootstrap çekirdek CSS --> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/css/bootstrap.min.css" rel="stylesheet" crossorigin="anonymous"> <link href="css/custom.css" rel="stylesheet"> </head> <body> <nav class="navbar navbar-dark bg-dark navbar-static-top navbar-expand-md"> <div class="container"> <button type="button" class="navbar-toggler collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false"> <span class="sr-only">Gezinmeyi değiştir</span> </button> <a class="navbar-brand" href="#">Harika Tarifler</a> <div class="collapse navbar-collapse justify-content-center" id="bs-example-navbar-collapse-1"> <ul class="nav navbar-nav justify-content-center"> <li class="active nav-item"> <a href="/" class="nav-link">Anasayfa</a> </li> <li class="nav-item"> <a href="/lasagna" class="nav-link">Lazanya</a> </li> <li class="nav-item"> <a href="/guacamole" class="nav-link">Guacamole</a> </li> <li class="nav-item"> <a href="/banana-bread" class="nav-link">Muzlu Ekmek</a> </li> </ul> </div> </div> </nav> <main> <section class="py-5 text-center container bg-light"> <div class="row py-lg-5"> <div class="col-lg-6 col-md-8 mx-auto"> <h1 class="fw-light">En İyi Lazanya Tarifi</h1> <p class="lead text-muted"> Bu, şimdiye kadar yapacağınız en iyi lazanyadır. <br /> <em>(Ciddi bir şey değil, bu sadece demo node-express-docker imaj uygulamamız içindir)</em> </p> <h3>Malzemeler</h3> <ul class="list-group"> <li class="list-group-item">1 pound tatlı İtalyan sosisi</li> <li class="list-group-item">¾ pound yağsız kıyma</li> <li class="list-group-item">½ su bardağı ince kıyılmış soğan</li> <li class="list-group-item">2 diş sarımsak, ezilmiş</li> <li class="list-group-item">1 kutu (28 ons) ezilmiş domates</li> <li class="list-group-item">2 kutu (6 ons) domates salçası</li> <li class="list-group-item">2 kutu (6.5 ons) konserve domates sosu</li> <li class="list-group-item">½ su bardağı su</li> <li class="list-group-item">2 yemek kaşığı beyaz şeker</li> <li class="list-group-item">1 ½ çay kaşığı kurutulmuş fesleğen yaprağı</li> <li class="list-group-item">½ çay kaşığı rezene tohumu</li> <li class="list-group-item">1 çay kaşığı İtalyan baharatı</li> <li class="list-group-item">1 ½ çay kaşığı tuz, bölünmüş veya damak tadına göre</li> <li class="list-group-item">¼ çay kaşığı çekilmiş karabiber</li> <li class="list-group-item">4 yemek kaşığı doğranmış taze maydanoz</li> <li class="list-group-item">12 lazanya yaprağı</li> <li class="list-group-item">16 ons ricotta peyniri</li> <li class="list-group-item">1 yumurta</li> <li class="list-group-item">¾ pound dilimlenmiş mozzarella peyniri</li> <li class="list-group-item">¾ su bardağı rendelenmiş Parmesan peyniri</li> </ul> </div> </div> </section> </main> </body> </html> |
Şimdi de aynı süreci takip ederek guacamole tarifi sayfası için bir dosya oluşturalım. Aşağıdaki komutu çalıştırarak dosyayı nano ile açın:
|
1 |
nano views/guacamole.html |
Ardından bu kodu dosyaya ekleyin:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
<!DOCTYPE html> <html lang="tr"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="description" content=""> <meta name="author" content="Mark Otto, Jacob Thornton, and Bootstrap contributors"> <meta name="generator" content="Hugo 0.80.0"> <title>Guacamole Tarifi</title> <!-- Bootstrap çekirdek CSS --> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/css/bootstrap.min.css" rel="stylesheet" crossorigin="anonymous"> <link href="css/custom.css" rel="stylesheet"> </head> <body> <nav class="navbar navbar-dark bg-dark navbar-static-top navbar-expand-md"> <div class="container"> <button type="button" class="navbar-toggler collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false"> <span class="sr-only">Gezinmeyi aç/kapat</span> </button> <a class="navbar-brand" href="#">Harika Tarifler</a> <div class="collapse navbar-collapse justify-content-center" id="bs-example-navbar-collapse-1"> <ul class="nav navbar-nav justify-content-center"> <li class="active nav-item"> <a href="/" class="nav-link">Ana Sayfa</a> </li> <li class="nav-item"> <a href="/lasagna" class="nav-link">Lazanya</a> </li> <li class="nav-item"> <a href="/guacamole" class="nav-link">Guacamole</a> </li> <li class="nav-item"> <a href="/banana-bread" class="nav-link">Muzlu Ekmek</a> </li> </ul> </div> </div> </nav> <main> <section class="py-5 text-center container bg-light"> <div class="row py-lg-5"> <div class="col-lg-6 col-md-8 mx-auto"> <h1 class="fw-light">En İyi Guacamole Tarifi</h1> <p class="lead text-muted"> Bu avokado salatasını damak tadınıza göre pürüzsüz veya pütürlü yapabilirsiniz. <br /> <em>(Ciddi bir şey değil, bu sadece demo node-express-docker imaj uygulamamız içindir)</em> </p> <h3>Malzemeler</h3> <ul class="list-group"> <li class="list-group-item">3 avokado - soyulmuş, çekirdeği çıkarılmış ve ezilmiş</li> <li class="list-group-item">1 misket limonu, suyu sıkılmış</li> <li class="list-group-item">1 çay kaşığı tuz</li> <li class="list-group-item">½ su bardağı küp doğranmış soğan</li> <li class="list-group-item">3 yemek kaşığı doğranmış taze kişniş</li> <li class="list-group-item">2 roma (erik) domatesi, küp doğranmış</li> <li class="list-group-item">1 çay kaşığı ince kıyılmış sarımsak</li> <li class="list-group-item">1 tutam toz acı kırmızı biber (İsteğe bağlı)</li> </ul> </div> </div> </section> </main> </body> </html> |
Son olarak, şu komutu girerek banana_bread.html dosyasını oluşturalım:
|
1 |
nano views/banana_bread.html |
Ardından, dosyaya aşağıdaki HTML kodunu ekleyin:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
<!DOCTYPE html> <html lang="tr"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="description" content=""> <meta name="author" content="Mark Otto, Jacob Thornton, and Bootstrap contributors"> <meta name="generator" content="Hugo 0.80.0"> <title>Muzlu Ekmek Tarifi</title> <!-- Bootstrap çekirdek CSS --> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/css/bootstrap.min.css" rel="stylesheet" crossorigin="anonymous"> <link href="css/custom.css" rel="stylesheet"> </head> <body> <nav class="navbar navbar-dark bg-dark navbar-static-top navbar-expand-md"> <div class="container"> <button type="button" class="navbar-toggler collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false"> <span class="sr-only">Gezintiyi aç/kapat</span> </button> <a class="navbar-brand" href="#">Harika Tarifler</a> <div class="collapse navbar-collapse justify-content-center" id="bs-example-navbar-collapse-1"> <ul class="nav navbar-nav justify-content-center"> <li class="active nav-item"> <a href="/" class="nav-link">Ana Sayfa</a> </li> <li class="nav-item"> <a href="/lasagna" class="nav-link">Lazanya</a> </li> <li class="nav-item"> <a href="/guacamole" class="nav-link">Guacamole</a> </li> <li class="nav-item"> <a href="/banana-bread" class="nav-link">Muzlu Ekmek</a> </li> </ul> </div> </div> </nav> <main> <section class="py-5 text-center container bg-light"> <div class="row py-lg-5"> <div class="col-lg-6 col-md-8 mx-auto"> <h1 class="fw-light">En İyi Muzlu Muzlu Ekmek Tarifi</h1> <p class="lead text-muted"> Muz lezzetinden neden ödün veresiniz? Bu muzlu ekmek, bol miktarda muz aromasıyla nemli ve lezzetlidir! Arkadaşlarım ve ailem tarifimi çok seviyor ve açık ara en iyisi olduğunu söylüyor! Kızartıldığında harika oluyor!! Afiyet olsun! <br /> <em>(Ciddi bir şey değil, bu sadece demo node-express-docker imaj uygulamamız içindir)</em> </p> <h3>Malzemeler</h3> <ul class="list-group"> <li class="list-group-item">2 su bardağı çok amaçlı un</li> <li class="list-group-item">1 çay kaşığı karbonat</li> <li class="list-group-item">¼ çay kaşığı tuz</li> <li class="list-group-item">½ su bardağı tereyağı</li> <li class="list-group-item">¾ su bardağı esmer şeker</li> <li class="list-group-item">2 adet yumurta, çırpılmış</li> <li class="list-group-item">2⅓ su bardağı ezilmiş olgunlaşmış muz</li> </ul> </div> </div> </section> </main> </body> </html> |
Şimdi tüm sayfaları oluşturduk. Hatırlarsanız, css/custom.css dosyasını eklememiz gerekiyor. Dizini oluşturmak için aşağıdaki komutu girin:
|
1 |
mkdir views/css |
Ardından şu komutla dosyayı oluşturun ve nano düzenleyicide açın:
|
1 |
nano views/css/custom.css |
Web sitenizi dilediğiniz gibi şekillendirmek için daha fazla CSS kodu ekleyebilirsiniz. Kısa olması açısından, dosyaya aşağıdaki kod parçacığını ekleyelim:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
.bd-placeholder-img { font-size: 1.125rem; text-anchor: middle; -webkit-user-select: none; -moz-user-select: none; user-select: none; } @media (min-width: 768px) { .bd-placeholder-img-lg { font-size: 3.5rem; } } |
İşiniz bittiğinde dosyayı kaydedip kapatın.
Artık uygulama kaynak koduna ve yüklü proje bağımlılıklarına sahip olduğumuza göre uygulamayı başlatabilirsiniz.
Uygulamayı bir bağlantı noktasını dinleyecek şekilde ayarlamıştık, 8090 güvenlik duvarına bu bağlantı noktası üzerinden trafiğe izin vermesini söylemek için aşağıdaki komutu çalıştırın. Farklı bir bağlantı noktası belirttiyseniz, komuttaki bağlantı noktası numarasını değiştirin:
|
1 |
sudo ufw allow 8090 |
Şimdi uygulamayı başlatabilirsiniz. Ancak öncelikle, aşağıdaki komutu çalıştırarak proje kök dizininde olduğunuzdan emin olun:
|
1 |
cd ~/node_express |
Uygulamayı node index.js ile başlatın. Farklı bir giriş noktası belirttiyseniz, bunu kendi giriş noktanızla değiştirin:
|
1 |
node index.js |
Tarayıcınızla http://your_public_server_ip:8090 adresine giderseniz, tanımlandığı şekliyle Tarifler açılış sayfasını göreceksiniz:
Navigasyonda çeşitli tariflerin bağlantılarını görebilirsiniz. Bazılarına tıklayalım. Aşağıda Lazanya tarifi sayfası yer almaktadır:
Ve burada da Guacamole tarifi sayfası yer almaktadır:
Bu noktaya kadar uygulamanızı oluşturdunuz ve beklendiği gibi çalıştığını test ettiniz. Ctrl + C tuşlarına basarak sunucudan çıkabilir ve Dockerfile dosyasını oluşturmaya geçebilirsiniz. Dockerfile'lar, gerektiğinde bir uygulamanın örneğini yeniden oluşturmayı mümkün kılarak ölçeklenebilirliğe yardımcı olur.
Adım 3: Dockerfile Oluşturma
Docker, imajları oluştururken bir Dockerfile içinde belirtilen talimatları okur. Bir uygulamanın çalışma zamanı ortamını belirtir. Bu nedenle, geliştiricilerin bağımlılıklarla ilgili tutarsızlıklardan veya çalışma zamanı sürümlerini değiştirmekten kaçınmasına yardımcı olur. Dockerfile'ı oluşturmak için aşağıdaki komutu girin:
|
1 |
nano Dockerfile |
Bir Docker imajı, birbiri üzerine inşa edilen birkaç imaj katmanı kullanılarak oluşturulur. Uygulama için başlangıç noktasını oluşturmak üzere bir temel imaj ekleyerek başlarsınız.
Uygulama bir node.js ortamında çalışmayı beklediğinden, node:10-alpine imajını for node.js için ekleyerek başlayacağız. Şu anda, biz bu kılavuzu yazarken, bu Node.js'in önerilen LTS sürümüdür. Bu özel imajı seçtik çünkü Alpine Linux projesinden türetilmiştir. Bu nedenle, imaj boyutumuzun minimumda tutulmasına yardımcı olacaktır. Docker Hub Node imajları sayfasında ihtiyaçlarınıza göre seçebileceğiniz birkaç imaj varyantı bulunmaktadır.
Uygulamanın temel imajını FROM yönergesini kullanarak ayarlamak için aşağıdaki kodu ekleyin:
|
1 |
FROM node:10-alpine |
Bu imaj Node.js ve npm içerir. Her Dockerfile bir FROM yönergesi ile başlamalıdır. Docker node imajı, varsayılan olarak uygulamanızın konteynerini root olarak çalıştırmak için kullanabileceğiniz root olmayan bir node kullanıcısıyla birlikte gelir. Docker güvenliği, konteynerlerin root olarak çalıştırılmamasını ve ayrıcalıkların yalnızca kaynaklarını çalıştırmak için gerekenlerle sınırlandırılmasını önerir.
Bu durumda, uygulamanın çalışma dizini ve konteynerin içindeki kullanıcı olarak node kullanıcısının ev dizinini kullanacağız. Daha fazla bilgi için bu Docker Node imajı en iyi uygulamaları kılavuzuna göz atabilirsiniz.
Uygulama kodunun izinlerini kolaylaştırmaya yardımcı olmak için node_modules alt dizinini, uygulama diziniyle birlikte /home/node içinde oluşturacağız. Bu dizinlerin oluşturulması, konteynerlerin içinde yerel olarak npm install komutunu çalıştırdığımızda doğru izinlere sahip olmalarını sağlar. Dizinleri oluşturduktan sonra, bunların sahipliğini node kullanıcısına atamalısınız. Bunu Dockerfile içinde aşağıdaki satırı ekleyerek yapacağız:
|
1 |
mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app |
Ardından aşağıdaki satırı ekleyerek çalışma dizinini ayarlayacaksınız:
|
1 |
WORKDIR /home/node/app |
Docker'ın varsayılan olarak bir tane oluşturmak zorunda kalmaması için WORKDIR dizinini her zaman ayarlamak iyi bir fikirdir.
Add the following line to copy the package.json ve package-lock.json dosyalarını kopyalamak için aşağıdaki satırı ekleyin:
|
1 |
COPY package*.json ./ |
It’s recommended to add the COPY talimatını, npm install çalıştırmadan veya uygulama kaynak kodunu kopyalamadan önce eklemeniz önerilir. Bu, Docker'ın önbelleğe alma mekanizmasından yararlanmanızı sağlar. Derleme işlemi sırasında Docker, her talimat için önbelleğe alınmış bir katmanı olup olmadığını kontrol eder. Bu, package.json dosyasını değiştirmediyseniz, Docker'ın mevcut imaj katmanını kullanacağı ve node modüllerini yeniden yüklemekten kaçınacağı, dolayısıyla daha hızlı derleme süreçleri sağlayacağı anlamına gelir.
Before running npm install çalıştırmadan önce, kullanıcıyı node olarak değiştirmek üzere aşağıdaki satırı ekleyin; böylece tüm uygulama dosyalarının ve node_modules dizininin root olmayan node kullanıcısına ait olması sağlanır:
|
1 |
USER node |
Konteynerimiz artık npm install komutunu çalıştırmaya hazır. Dockerfile'a aşağıdaki satırı ekleyin:
|
1 |
RUN npm install |
Once node_modules yüklendikten sonra, Docker'a uygulama kodunu konteyner üzerindeki uygulama dizinine doğru izinler ve sahiplikle (yani root olmayan node kullanıcısı) kopyalamasını söyleyecek olan aşağıdaki satırı ekleyin:
|
1 |
COPY --chown=node:node . . |
Son adım, 8090 portunu, giriş index.js dosyamızda tanımladığımız gibi konteyner üzerinde dışa açmaktır:
|
1 2 |
EXPOSE 8090 CMD [ "node", "index.js" ] |
EXPOSE, çalışma zamanında konteyner üzerindeki hangi portların açık olacağını belirler. CMD ise uygulamayı başlatmak için komutu çalıştırır, bu durumda node index.js.
Dockerfile içinde yalnızca bir CMD komutunuz olmalıdır, çünkü yalnızca sonuncusu geçerli olur. Lütfen şuna göz atın: Dockerfile referans belgeleri Dockerfile ile yapabileceğiniz şeylerin bir listesi için.
Tamamlanmış Dockerfile dosyanız şu şekilde görünmelidir:
|
1 2 3 4 5 6 7 8 9 |
FROM node:10-alpine RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app WORKDIR /home/node/app COPY package*.json ./ USER node RUN npm install COPY --chown=node:node . . EXPOSE 8090 CMD [ "node", "index.js" ] |
Artık dosyayı kaydedip kapatabilirsiniz.
Bir sonraki adımda .dockerignore dosyasını ekleyeceksiniz. Tıpkı .gitignore dosyasında olduğu gibi, .dockerignore dosyası da proje dizini içindeki hangi dosya ve dizinlerin konteynere kopyalanmaması gerektiğini belirtir.
Dosyayı nano düzenleyici ile açın:
|
1 |
nano .dockerignore |
Dosyanın içine aşağıdaki satırları ekleyin:
|
1 2 3 4 |
node_modules npm-debug.log Dockerfile .dockerignore |
Eğer bir git deposuyla çalışıyorsanız, .git dizinini ve .gitignore dosyasını da eklemelisiniz. Dosyayı kaydedip kapatın.
Her şey yolunda gittiyse, docker build komutunu kullanarak uygulama imajını oluşturma zamanı gelmiştir. Docker'ın varsayılan olarak atadığı rastgele dize yerine imajı akılda kalıcı bir adla etiketlemek için –t bayrağını docker build komutuna ekleyebilirsiniz. İmajı Docker Hub'a da yükleyeceğimiz için, etikete Docker Hub kullanıcı adınızı dahil etmek en iyisidir.
Etiket adı olarak nodejs-express-image kullanacağız. İstediğiniz bir etiket adını seçmekte özgürsünüz. İmajı oluşturmak için gereken komut şudur:
|
1 |
sudo docker build -t your_dockerhub_username/nodejs-express-image . |
your_dockerhub_username kısmını gerçek Docker Hub kullanıcı adınızla değiştirmeyi unutmayın. Sondaki . (nokta), derleme bağlamının geçerli dizin olduğunu belirtir.
Derleme işlemi bir veya iki dakika sürer. Tamamlandığında, imajlarınızı kontrol etmek için şu komutu girin:
|
1 |
sudo docker images |
Şuna benzer bir şey görmelisiniz:
Unutmayın, your_dockerhub_username kısmını gerçek bir kullanıcı adıyla değiştirdik.
İmajınızın oluşturulduğunu onayladıktan sonra, artık docker run kullanarak imajla bir konteyner oluşturabilirsiniz. Aşağıdaki bayraklar dahil edilecektir:
-p: konteyner üzerindeki bağlantı noktasını (port) yayınlar ve bunu ana bilgisayar sistemindeki bir bağlantı noktasına eşler. Gösterim amacıyla ana bilgisayar sisteminde port 80'i kullanacağız. Ancak, bu portta çalışan başka bir işleminiz varsa, bunu gerektiği gibi değiştirebilirsiniz. Şunun hakkında daha fazla bilgi edinin: Docker belgelerinden port bağlama.-d: arka plan modu (detached mode) içindir. Konteynerin arka planda çalışmaya devam etmesini sağlar.--name: Docker'ın rastgele bir dize atamasına izin vermek yerine akılda kalıcı bir ad belirlemek için bunu kullanabilirsiniz.
Konteyneri oluşturma komutu aşağıdaki gibidir. Docker Hub kullanıcı adınızı uygun şekilde değiştirin:
|
1 |
sudo docker run --name nodejs-express-image -p 80:8090 -d your_dockerhub_username/nodejs-express-image |
Konteynerin oluşturulmasını ve çalışmaya başlamasını bekleyin. Çalışan tüm konteynerleri incelemek için bu komutu kullanabilirsiniz:
|
1 |
sudo docker ps |
Aşağıdakine benzer bir çıktı görmelisiniz:
Çıktıda görüldüğü gibi, konteyner artık çalışıyor. Tarayıcıda port belirtmeden sunucunuzun genel IP adresini ziyaret ederseniz bunu tarayıcıda görüntüleyebilirsiniz. Ana sayfanız yüklenecektir:
Docker ile bir Node Express statik web sitesini başarıyla dağıttınız. Gelecekte kullanmak ve ölçeklendirmek amacıyla bu imajı Docker Hub'a nasıl yükleyebileceğimizi görelim.
Adım 4: Docker İmaj Depoları ile Çalışma
Görüntülerinizi Docker Hub gibi görüntü kayıt defterlerine gönderebilir ve gelecekte kullanmak üzere kaydedebilir, diğer geliştiricilerle paylaşabilir veya konteynerlerinizi ölçeklendirmenize izin verebilirsiniz. Oluşturduğumuz görüntüyü Docker Hub'a gönderebilir ve bir konteyneri yeniden oluşturmak için kullanabiliriz.
Docker Hub hesabınızda oturum açmak için aşağıdaki komutu kullanın. Bunu gerçek Docker Hub kullanıcı adınızla değiştirin:
|
1 |
sudo docker login -u your_dockerhub_username |
İstendiğinde şifrenizi girin. Oturum açtıktan sonra, ~/.docker/config.json dosyası, kullanıcınızın ev dizininde Docker Hub kimlik bilgilerinizi içerecek şekilde oluşturulur.
Bu ayarlandıktan sonra, daha önce görüntüyü oluştururken belirlediğiniz etiketi belirterek görüntüyü Docker Hub'a göndermek için aşağıdaki komutu girin:
|
1 |
sudo docker push your_dockerhub_username/nodejs-express-image |
Bu komut, docker görüntüsünü Docker Hub hesabınıza gönderir. Hesabınızı ziyaret ederseniz, yakın zamanda gönderdiğiniz görüntüyü görebilirsiniz:
Mevcut uygulama konteynerini yok ederek ve depodaki görüntüyü kullanarak yeniden oluşturarak görüntü deposunun kullanışlılığını test edebiliriz.
Aşağıdaki komutu girerek mevcut konteynerlerinizi listeleyin:
|
1 |
sudo docker ps |
Buna benzer bir çıktı görmelisiniz:
Çıktınızda listelenen CONTAINER ID değerini not edin, kopyalayın ve kimliği kendinizinkiyle değiştirerek şu komutla konteynerinizi durdurmak için kullanın:
|
1 |
sudo docker stop 1bb2d65279bb |
Sisteminizde bulunan tüm docker görüntülerini listelemek için aşağıdaki komutu girin:
|
1 |
sudo docker images –a |
Çıktı, görüntünüzün adını, node.js görüntüsünü ve derleme sürecindeki diğer görüntüleri gösterecektir.
Kullanılmayan veya askıda kalan görüntüler de dahil olmak üzere görüntüleri kaldırmak için aşağıdaki komutu girin:
|
1 |
sudo docker system prune |
Onaylamak için y yazın. Bu, durdurulan konteynerleri ve görüntüleri kaldırır. Bunları listelerseniz çıktıda boş bir liste görürsünüz:
Artık hem uygulamayı çalıştıran konteyneri hem de görüntünün kendisini kaldırdınız. öğreticimizi takip ederek Docker konteynerlerini, görüntülerini ve birimlerini kaldırma hakkında daha fazla bilgi edinin.
Şimdi, aşağıdaki komutla görüntüyü önce Docker Hub'dan çekerek tüm süreci yeniden oluşturabiliriz. Docker Hub kullanıcı adınızı uygun şekilde değiştirin:
|
1 |
sudo docker pull your_dockerhub_username/nodejs-express-image |
Şu komutla Docker görüntülerinizi tekrar listeleyin:
|
1 |
sudo docker images |
Çıktıda görüntüyü görmelisiniz:
Artık Adım 3 içindeki komutu kullanarak konteynerinizi yeniden oluşturabilirsiniz. Elbette, uygun olan yerlerde Docker Hub kullanıcı adınızı değiştirin:
|
1 |
sudo docker run --name nodejs-express-image -p 80:8090 -d your_dockerhub_username/nodejs-express-image |
Yeniden oluşturulduğunu onaylamak için konteynerlerinizi listeleyin:
|
1 |
sudo docker ps |
Benzer bir çıktı görmelisiniz:
Tarayıcınızda sunucunuzun genel IP adresine gidin; uygulamanızın çalıştığını görmelisiniz.
Sonuç
Öğreticiyi buraya kadar takip ettiyseniz, artık Express ve Bootstrap ile yapılmış ve Docker ile dağıtılmış statik bir web siteniz var demektir. Bir Docker görüntüsü oluşturmak için statik web sitesi dosyalarını kullandınız ve bir konteyner oluşturmak için bu görüntüyü kullandınız. Ardından görüntüyü bir Docker görüntü kayıt defteri olan Docker Hub, göndererek gelecekte kullanmak veya ölçeklendirmek üzere hazır hale getirdiniz. Görüntü kayıt defterinin kullanımını test etmek için görüntüleri ve konteynerleri yok ettiniz, görüntüleri kayıt defterinden çektiniz ve konteynerleri yeniden oluşturdunuz.
Bu öğreticide bir Node.js uygulamasının nasıl dağıtılacağı açıklandı. Farklı bir web geliştirme yığını kullanmayı öğrenmek isterseniz, Nginx üzerinde Docker Compose ile bir Laravel uygulamasını dağıtma.
Docker'ı kullanma hakkında daha fazla kaynak için aşağıdaki öğreticilere göz atın:
- Ubuntu 20.04 üzerinde Docker Compose Nasıl Kurulur ve Yapılandırılır
- Bir Docker Konteyneri ile Ana Bilgisayar Arasında Veri Paylaşımı Nasıl Yapılır
- CentOS 7 üzerinde Docker Kurulumu ve Yapılandırılması
Keyifli Hesaplamalar!











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