giriiş
Docker platformu, geliştiricilerin uygulamaları kapsayıcılar olarak paketleyip çalıştırmalarına olanak tanır. Kapsayıcı, paylaşımlı bir işletim sisteminde çalışan tek bir işlemdir ve sanal makinelere göre daha hafif bir alternatiftir. Kapsayıcılar yeni olmamakla birlikte, daha fazla geliştiricinin dağıtılmış uygulama mimarilerini benimsemesiyle birlikte giderek daha da önemli hale gelecek olan işlem izolasyonu ve ortam standardizasyonu gibi avantajlar sunarlar.
Docker ile bir uygulama oluşturup ölçeklendirirken, başlangıç noktası genellikle uygulamanız için bir görüntü oluşturmaktır; bu görüntü daha sonra bir kapsayıcıda çalıştırılabilir. Bu görüntü, uygulama kodunu, kitaplıkları, yapılandırma dosyalarını, ortam değişkenlerini ve çalışma zamanını içerir. Bir görüntü kullanmak, kapsayıcı ortamınızın standart olmasını ve yalnızca uygulamanızı oluşturup çalıştırmak için gerekenleri içermesini sağlar.
Bu eğitimde, Express ve Bootstrap çerçevelerini kullanan statik bir web sitesi için bir uygulama görüntüsü oluşturacaksınız. Ardından, bu görüntüyü kullanarak bir kapsayıcı oluşturacak ve ileride kullanmak üzere Docker Hub'a yükleyeceksiniz. Son olarak, kaydedilen görüntüyü Docker Hub deponuzdan çekip başka bir kapsayıcıya derleyerek uygulamanızı nasıl yeniden yapılandırıp ölçeklendirebileceğinizi göstereceksiniz.
Ön koşullar
- Sudo ayrıcalıklarına sahip, root olmayan bir kullanıcı ve etkin bir güvenlik duvarı bulunan Ubuntu çalıştıran bir sunucu. Kurulum talimatları için lütfen bu listeden dağıtımınızı seçin ve ilk sunucu kurulum kılavuzumuzu izleyin.
- Sunucunuzda Docker kuruludur.
- Node.js ve npm kuruldu.
- Bir Docker Hub hesabı.
Adım 1 – Uygulama bağımlılıklarınızı yükleyin
Görüntünüzü oluşturmak için önce uygulama dosyalarınızı oluşturmanız, ardından bunları kapsayıcınıza kopyalamanız gerekir. Bu dosyalar, uygulamanızın statik içeriğini, kodunu ve bağımlılıklarını içerir.
Öncelikle, kök olmayan kullanıcınızın ana dizininde projeniz için bir dizin oluşturun. Projemize node_project adını vereceğiz, ancak bunu başka bir adla değiştirmekten çekinmeyin:
mkdir node_projectBu dizine git:
cd node_projectBu projenin ana dizini olacaktır.
Ardından, proje bağımlılıklarınızı ve diğer tanımlayıcı bilgileri içeren bir package.json dosyası oluşturun. Dosyayı nano veya favori düzenleyicinizle açın:
nano package.jsonProjenin adı, yazarı, lisansı, giriş noktası ve bağımlılıkları dahil olmak üzere proje hakkında aşağıdaki bilgileri ekleyin. Yazar bilgilerini kendi adınız ve iletişim bilgilerinizle değiştirdiğinizden emin olun:
{
"name": "nodejs-image-demo",
"version": "1.0.0",
"description": "nodejs image demo",
"author": "Sammy the Shark <[email protected]>",
"license": "MIT",
"main": "app.js",
"keywords": [
"nodejs",
"bootstrap",
"express"
],
"dependencies": {
"express": "^4.16.4"
}
}Bu dosya, proje adını, yazarını ve dağıtıldığı lisansı içerir. Npm, proje adınızı kısa ve açıklayıcı tutmanızı ve npm kayıt defterinde tekrarlardan kaçınmanızı önerir. Program kodunun ücretsiz kullanımına ve dağıtımına olanak tanıyan lisans bölümünde MIT lisansını listeliyoruz. Ayrıca, dosya şunları belirtir:
- “main”: Uygulamanın giriş noktası, app.js. Bu dosyayı daha sonra oluşturacaksınız.
- “Bağımlılıklar”: Proje bağımlılıkları – bu durumda Express 4.16.4 veya üstü.
Bu dosya bir depo listelemese de, package.json dosyanıza bir depo eklemek için aşağıdaki talimatları izleyerek bir depo ekleyebilirsiniz. Uygulamanızı düzenliyorsanız bu kullanışlı bir özelliktir. Değişiklikleri tamamladıktan sonra dosyayı kaydedip kapatın.
Proje bağımlılıklarınızı yüklemek için aşağıdaki komutu çalıştırın:
npm installBu, package.json dosyanızda listelediğiniz paketleri proje dizininize yükleyecektir. Artık uygulama dosyalarını derleyebiliriz.
Adım 2 – Program dosyalarını oluşturun
Kullanıcılara köpekbalıkları hakkında bilgi sağlayan bir web sitesi oluşturacağız. Uygulamamız, app.js adında bir ana girdi ve projenin sabit varlıklarını içeren bir views dizininden oluşacak. Açılış sayfası index.html, kullanıcılara temel bilgiler ve daha detaylı köpekbalığı bilgileri içeren sharks.html sayfasına bağlantı sağlayacak. views dizininde hem açılış sayfasını hem de sharks.html dosyasını oluşturacağız.
Öncelikle ana proje dizininde app.js dosyasını açarak proje yollarını tanımlayalım:
nano app.jsDosyanın ilk kısmı Express ve Router uygulama nesnelerini oluşturur ve temel dizini ve portu sabitler olarak tanımlar:
const express = require('express'); const app = express(); const router = express.Router(); const path = __dirname + '/views/'; const port = 8080;
require işlevi, uygulama ve yönlendirici nesnelerini oluşturmak için kullandığımız Express modülünü yükler. Yönlendirici nesnesi, uygulamanın yönlendirme işlevini gerçekleştirir ve HTTP yöntem rotalarını tanımladığımızda, uygulamamızın istekleri nasıl işleyeceğini belirtmek için bunları bu nesneye ekleriz.
Dosyanın bu bölümü ayrıca birkaç sabit içerir, Yol Ve Liman Setler:
- yol: Geçerli proje dizinindeki views dizini altında olacak temel dizini tanımlar.
- Port: Programın 8080 portunu dinlemesini ve bu porta bağlanmasını söyler.
Daha sonra yönlendirici nesnesini kullanarak uygulama rotalarını ayarlayın:
...
router.use(function (req,res,next) {
console.log('/' + req.method);
next();
});
router.get('/', function(req,res){
res.sendFile(path + 'index.html');
});
router.get('/sharks', function(req,res){
res.sendFile(path + 'sharks.html');
});router.use işlevi, yönlendirici isteklerini kaydeden ve bunları uygulama rotalarına ileten bir ara yazılım işlevi yükler. Bunlar, temel proje URL'sine yapılan bir GET isteğinin index.html sayfasını, /sharks rotasına yapılan bir GET isteğinin ise sharks.html sayfasını döndürmesi gerektiğini belirten aşağıdaki işlevlerde tanımlanmıştır.
Son olarak, yönlendirici ara yazılımını ve uygulamanın statik varlıklarını bağlayın ve uygulamaya 8080 portunu dinlemesini söyleyin:
...
app.use(express.static(path));
app.use('/', router);
app.listen(port, function () {
console.log('Example app listening on port 8080!')
})Bitmiş app.js dosyası şu şekilde görünecektir:
const express = require('express');
const app = express();
const router = express.Router();
const path = __dirname + '/views/';
const port = 8080;
router.use(function (req,res,next) {
console.log('/' + req.method);
next();
});
router.get('/', function(req,res){
res.sendFile(path + 'index.html');
});
router.get('/sharks', function(req,res){
res.sendFile(path + 'sharks.html');
});
app.use(express.static(path));
app.use('/', router);
app.listen(port, function () {
console.log('Example app listening on port 8080!')
})İşiniz bittiğinde dosyayı kaydedip kapatın.
Şimdi uygulamaya biraz statik içerik ekleyelim. Öncelikle views dizinini oluşturalım:
mkdir viewsAçılış sayfası dosyasını açın, index.html:
nano views/index.htmlBootstrap'ı içe aktaran ve sharks.html detaylı bilgi sayfasına bağlantı içeren bir jumbotron bileşeni oluşturan dosyaya aşağıdaki kodu ekleyin:
<!DOCTYPE html>
<html lang="en">
<head>
<title>About Sharks</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
<link href="css/styles.css" rel="stylesheet">
<link href="https://fonts.googleapis.com/css?family=Merriweather:400,700" rel="stylesheet" type="text/css">
</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">Toggle navigation</span>
</button> <a class="navbar-brand" href="#">Everything Sharks</a>
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav mr-auto">
<li class="active nav-item"><a href="/" class="nav-link">Home</a>
</li>
<li class="nav-item"><a href="/sharks" class="nav-link">Sharks</a>
</li>
</ul>
</div>
</div>
</nav>
<div class="jumbotron">
<div class="container">
<h1>Want to Learn About Sharks?</h1>
<p>Are you ready to learn about sharks?</p>
<br>
<p><a class="btn btn-primary btn-lg" href="/sharks" role="button">Get Shark Info</a>
</p>
</div>
</div>
<div class="container">
<div class="row">
<div class="col-lg-6">
<h3>Not all sharks are alike</h3>
<p>Though some are dangerous, sharks generally do not attack humans. Out of the 500 species known to researchers, only 30 have been known to attack humans.
</p>
</div>
<div class="col-lg-6">
<h3>Sharks are ancient</h3>
<p>There is evidence to suggest that sharks lived up to 400 million years ago.
</p>
</div>
</div>
</div>
</body>
</html>Buradaki üst düzey gezinme çubuğu, kullanıcıların Ana Sayfa ve Köpekbalıkları sayfaları arasında gezinmesini sağlar. navbar-nav bileşeni altında, kullanıcıya geçerli sayfayı göstermek için Bootstrap'in active sınıfını kullanıyoruz. Ayrıca, app.js'de tanımladığımız rotalarla eşleşen statik sayfalarımız için rotalar da belirledik:
...
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav mr-auto">
<li class="active nav-item"><a href="/" class="nav-link">Home</a>
</li>
<li class="nav-item"><a href="/sharks" class="nav-link">Sharks</a>
</li>
</ul>
</div>
...Ayrıca jumbotron butonunda köpekbalığı bilgi sayfamıza bir bağlantı oluşturduk:
...
<div class="jumbotron">
<div class="container">
<h1>Want to Learn About Sharks?</h1>
<p>Are you ready to learn about sharks?</p>
<br>
<p><a class="btn btn-primary btn-lg" href="/sharks" role="button">Get Shark Info</a>
</p>
</div>
</div>
...Başlıkta ayrıca özel bir stil sayfasına giden bir bağlantı da bulunmaktadır:
...
<link href="css/styles.css" rel="stylesheet">
...Bu adımın sonunda bu stil sayfasını oluşturacağız. İşiniz bittiğinde dosyayı kaydedip kapatın. Uygulama açılış sayfasını yerleştirerek, ilgilenen kullanıcılara köpekbalıkları hakkında daha fazla bilgi sağlayacak sharks.html adlı köpekbalığı bilgi sayfamızı oluşturabiliriz.
Dosyayı açın:
nano views/sharks.htmlBootstrap'ı ve özel bir stil sayfasını içe aktaran ve kullanıcılara belirli köpekbalıkları hakkında ayrıntılı bilgi sağlayan aşağıdaki kodu ekleyin:
<!DOCTYPE html>
<html lang="en">
<head>
<title>About Sharks</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
<link href="css/styles.css" rel="stylesheet">
<link href="https://fonts.googleapis.com/css?family=Merriweather:400,700" rel="stylesheet" type="text/css">
</head>
<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">Toggle navigation</span>
</button> <a class="navbar-brand" href="/">Everything Sharks</a>
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav mr-auto">
<li class="nav-item"><a href="/" class="nav-link">Home</a>
</li>
<li class="active nav-item"><a href="/sharks" class="nav-link">Sharks</a>
</li>
</ul>
</div>
</div>
</nav>
<div class="jumbotron text-center">
<h1>Shark Info</h1>
</div>
<div class="container">
<div class="row">
<div class="col-lg-6">
<p>
<div class="caption">Some sharks are known to be dangerous to humans, though many more are not. The sawshark, for example, is not considered a threat to humans.
</div>
<img src="https://assets.digitalocean.com/articles/docker_node_image/sawshark.jpg" alt="Sawshark">
</p>
</div>
<div class="col-lg-6">
<p>
<div class="caption">Other sharks are known to be friendly and welcoming!</div>
<img src="https://assets.digitalocean.com/articles/docker_node_image/sammy.png" alt="Sammy the Shark">
</p>
</div>
</div>
</div>
</html>Bu dosyada, geçerli sayfayı görüntülemek için yine aktif sınıfı kullandığımızı unutmayın. İşiniz bittiğinde dosyayı kaydedip kapatın.
Son olarak, views dizininde bir css klasörü oluşturarak index.html ve sharks.html'de bağlantısını verdiğiniz özel CSS stil sayfasını oluşturun:
mkdir views/cssStil sayfasını açın:
nano views/css/styles.cssSayfalarımıza istediğimiz rengi ve yazı tipini ayarlayan aşağıdaki kodu ekleyelim:
.navbar {
margin-bottom: 0;
}
body {
background: #020A1B;
color: #ffffff;
font-family: 'Merriweather', sans-serif;
}
h1,
h2 {
font-weight: bold;
}
p {
font-size: 16px;
color: #ffffff;
}
.jumbotron {
background: #0048CD;
color: white;
text-align: center;
}
.jumbotron p {
color: white;
font-size: 26px;
}
.btn-primary {
color: #fff;
text-color: #000000;
border-color: white;
margin-bottom: 5px;
}
img,
video,
audio {
margin-top: 20px;
max-width: 80%;
}
div.caption: {
float: left;
clear: both;
}Bu dosya, yazı tipi ve rengi ayarlamanın yanı sıra, görsellerin boyutunu da maksimum genişlikle sınırlandırır. Bu sayede, görsellerin sayfada istediğimizden fazla yer kaplamaması sağlanır. İşiniz bittiğinde dosyayı kaydedip kapatın.
Program dosyaları ve proje bağımlılıkları yüklendikten sonra programı başlatmaya hazırsınız.
Önkoşullardaki ilk sunucu kurulum eğitimini takip ettiyseniz, yalnızca SSH trafiğine izin veren etkin bir güvenlik duvarınız olacaktır. 8080 portuna trafiğe izin vermek için:
sudo ufw allow 8080Programı başlatmak için projenizin kök dizininde olduğunuzdan emin olun:
cd ~/node_projectUygulamayı node app.js ile başlatın:
node app.jsTarayıcınızı http://your_server_ip:8080 adresine yönlendirin. Aşağıdaki açılış sayfası yüklenecektir:
Köpekbalığı Bilgisi Al düğmesine tıklayın. Aşağıdaki bilgi sayfası yüklenecektir:
Artık çalışan bir uygulamanız var. Hazır olduğunuzda, CTRL+C tuşlarına basarak sunucudan çıkın. Şimdi, bu uygulamayı istediğimiz gibi yeniden oluşturup ölçeklendirmemize olanak tanıyan bir Dockerfile oluşturmaya geçebiliriz.
Adım 3 – Dockerfile'ı Yazma
Dockerfile'ınız, uygulama konteyneriniz çalıştırıldığında nelerin dahil edileceğini belirtir. Dockerfile kullanmak, konteyner ortamınızı tanımlamanıza ve bağımlılıklar veya çalışma zamanı sürümleriyle çakışmaları önlemenize olanak tanır.
En iyi kapsayıcıları oluşturmak için bu yönergeleri izleyerek, görüntü katmanlarının sayısını en aza indirerek ve görüntünün işlevselliğini tek bir amaçla, yani uygulama dosyalarını ve statik içeriği yeniden oluşturmayla sınırlayarak görüntümüzü mümkün olduğunca verimli hale getiriyoruz.
Projenizin kök dizininde bir Dockerfile oluşturun:
nano DockerfileDocker görüntüleri, üst üste inşa edilmiş ardışık katmanlı görüntüler kullanılarak oluşturulur. İlk adımımız, uygulamamızın başlangıç noktası olacak temel görüntüyü eklemek olacak.
Yazım sırasında Node.js'nin önerilen LTS sürümü olan node:10-alpine imajını kullanalım. Alpine imajı, Alpine Linux projesinden alınmıştır ve imaj boyutumuzu düşük tutmamıza yardımcı olur. Alpine imajının projeniz için iyi bir seçim olup olmadığı hakkında daha fazla bilgi için lütfen Docker Hub Node imaj sayfasının İmaj Çeşitleri bölümündeki detaylı açıklamayı inceleyin.
Uygulamanın temel görüntüsünü ayarlamak için aşağıdaki FROM yönergesini ekleyin:
FROM node:10-alpineBu görsel Node.js ve npm'i içerir. Her Dockerfile bir FROM yönergesiyle başlamalıdır.
Varsayılan olarak, Docker Node görüntüsü, uygulama konteynerinizin root olarak çalışmasını engellemek için kullanabileceğiniz kök olmayan bir düğüm kullanıcısı içerir. Konteynerleri root olarak çalıştırmaktan kaçınmak ve konteyner içindeki yetenekleri yalnızca süreçlerini çalıştırmak için gerekenlerle sınırlamak önerilen bir güvenlik önlemidir. Bu nedenle, düğüm kullanıcısının ana dizinini uygulamamız için çalışma dizini olarak kullanır ve konteyner içinde kullanıcı olarak ayarlarız. Docker Node görüntüsüyle çalışırken en iyi uygulamalar hakkında daha fazla bilgi için bu en iyi uygulamalar kılavuzuna göz atın.
Konteynerdeki uygulama kodumuzun izinlerini hassas bir şekilde ayarlamak için, /home/node dizininde uygulama diziniyle birlikte bir node_modules alt dizini oluşturalım. Bu dizinleri oluşturmak, istediğimiz izinlere sahip olmalarını sağlar; bu da konteynerde npm install ile yerel düğüm modülleri oluştururken önemli olacaktır. Bu dizinleri oluşturmanın yanı sıra, sahipliklerini de düğüm kullanıcımıza ayarlıyoruz:
...
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/appRUN talimatlarını entegre etmenin kullanımı hakkında daha fazla bilgi için, konteyner katmanlarının nasıl yönetileceğine dair bu tartışmayı okuyun.
Daha sonra uygulamanın çalışma dizinini /home/node/app olarak ayarlayın:
...
WORKDIR /home/node/appWORKDIR ayarlanmamışsa, Docker varsayılan olarak bir tane oluşturacaktır, bu yüzden bunu açıkça ayarlamak iyi bir fikirdir.
Daha sonra package.json ve package-lock.json (npm 5+ için) dosyalarını kopyalayın:
...
COPY package*.json ./Bu COPY yönergesini npm install komutunu çalıştırmadan veya uygulama kodunu kopyalamadan önce eklemek, Docker'ın önbellekleme mekanizmasından yararlanmamızı sağlar. Derlemenin her aşamasında Docker, ilgili yönerge için bir katmanın önbelleğe alınıp alınmadığını kontrol eder. package.json dosyasını değiştirirsek, bu katman yeniden derlenir; ancak değiştirmezsek, bu yönerge Docker'ın mevcut görüntü katmanını kullanmasına ve düğüm modüllerimizi yeniden yüklemeyi atlamasına olanak tanır.
node_modules dizininin içeriği de dahil olmak üzere tüm uygulama dosyalarının kök olmayan düğüm kullanıcısına ait olduğundan emin olmak için npm install komutunu çalıştırmadan önce kullanıcıyı node olarak değiştirin:
...
USER nodeProje bağımlılıklarını kopyalayıp kullanıcıları değiştirdikten sonra npm install komutunu çalıştırabiliriz:
...
RUN npm installDaha sonra, uygulama kodunuzu uygun izinlerle konteynerdeki uygulama dizinine kopyalayın:
...
COPY --chown=node:node . .Bu, uygulama dosyalarının kök olmayan kullanıcıya ait olmasını sağlar.
Son olarak konteyner üzerinde 8080 portunu ayarlayın ve uygulamayı başlatın:
...
EXPOSE 8080
CMD [ "node", "app.js" ]EXPOSE, portu açığa çıkarmaz, bunun yerine çalışma zamanında konteyner tarafından kullanılabilen portları belgelemenin bir yolu olarak işlev görür. CMD, uygulamayı (bu durumda node app.js) başlatmak için komutu yürütür. Dockerfile başına yalnızca bir CMD komutu olması gerektiğini unutmayın. Birden fazla komut eklerseniz, yalnızca sonuncusu uygulanır.
Dockerfile ile yapabileceğiniz birçok şey var. Talimatların tam listesi için lütfen Docker'ın Dockerfile referans belgelerine bakın.
Dockerfile'ın tamamı şu şekilde görünüyor:
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 8080
CMD [ "node", "app.js" ]Düzenlemeyi bitirdiğinizde dosyayı kaydedip kapatın.
Uygulama görüntüsünü oluşturmadan önce bir .dockerignore dosyası ekleyelim. .gitignore dosyasına benzer şekilde çalışan .dockerignore, proje dizininizdeki hangi dosya ve dizinlerin konteynerinize kopyalanmaması gerektiğini belirtir.
.dockerignore dosyasını açın:
nano .dockerignoreDosyanın içine yerel düğüm modüllerini, npm günlüklerini, Dockerfile'ı ve .dockerignore dosyasını ekleyin:
node_modules
npm-debug.log
Dockerfile
.dockerignore
Git ile çalışıyorsanız, .git dizininizi ve .gitignore dosyanızı da eklemek isteyeceksiniz.
İşiniz bittiğinde dosyayı kaydedip kapatın.
Artık docker build komutunu kullanarak uygulama görüntünüzü oluşturmaya hazırsınız. docker build komutuyla -t işaretini kullanmak, görüntüyü akılda kalıcı bir adla etiketlemenizi sağlar. Görüntüyü Docker Hub'a göndereceğimiz için, etikete Docker Hub kullanıcı adımızı ekleyelim. Görüntüyü nodejs-image-demo olarak etiketleyeceğiz, ancak kendi seçtiğiniz bir adla değiştirmekten çekinmeyin. Ayrıca your_dockerhub_username yerine Docker Hub kullanıcı adınızı yazmayı unutmayın:
sudo docker build -t your_dockerhub_username/nodejs-image-demo .. Derleme bağlamının geçerli dizin olduğunu belirtir.
Görüntünün oluşturulması bir iki dakika sürecektir. Tamamlandığında görüntülerinizi kontrol edin:
sudo docker imagesAşağıdaki çıktıyı alacaksınız:
Output
REPOSITORY TAG IMAGE ID CREATED SIZE
your_dockerhub_username/nodejs-image-demo latest 1c723fb2ef12 8 seconds ago 73MB
node 10-alpine f09e7c96b6de 3 weeks ago 70.7MBArtık docker run komutunu kullanarak bu imajı kullanarak bir kapsayıcı oluşturabiliriz. Bu komutla birlikte üç komut ekliyoruz:
- -p: Bu, portu konteynerde yayınlayacak ve ana bilgisayarımızdaki bir porta eşleyecektir. Ana bilgisayarda 80 portunu kullanacağız, ancak bu portta başka bir işlem çalışıyorsa, gerekirse değiştirmelisiniz. Bunun nasıl çalıştığı hakkında daha fazla bilgi için Docker Belgeleri'ndeki port bağlama hakkındaki bu tartışmayı inceleyin.
- -d: Bu konteyneri arka planda çalıştırır.
- --name: Bu, konteynere akılda kalıcı bir isim vermemizi sağlar.
Konteyneri oluşturmak için aşağıdaki komutu çalıştırın:
sudo docker run --name nodejs-image-demo -p 80:8080 -d your_dockerhub_username/nodejs-image-demoKonteyneriniz çalışır duruma geldiğinde, çalışan konteynerlerinizin listesini docker ps ile kontrol edebilirsiniz:
sudo docker psAşağıdaki çıktıyı alacaksınız:
Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e50ad27074a7 your_dockerhub_username/nodejs-image-demo "node app.js" 8 seconds ago Up 7 seconds 0.0.0.0:80->8080/tcp nodejs-image-demoKonteyneriniz çalışırken artık tarayıcınızı port kullanmadan sunucu IP'nize yönlendirerek uygulamanızı ziyaret edebilirsiniz:
http://your_server_ip
Uygulamanızın açılış sayfası tekrar yüklenecek.
Artık uygulamanız için bir görüntü oluşturduğunuza göre, bunu ileride kullanmak üzere Docker Hub'a gönderebilirsiniz.
Adım 4 – Görüntülerle çalışmak için bir deponun kullanılması
Uygulama görüntünüzü Docker Hub gibi bir kayıt defterine göndererek, konteynerleri oluşturup ölçeklerken daha sonra kullanıma hazır hale getirebilirsiniz. Uygulama görüntünüzü bir depoya gönderip ardından görüntüyü kullanarak konteynerinizi yeniden oluşturarak bunu nasıl yapacağınızı göstereceğiz.
Görüntüyü göndermenin ilk adımı, ön koşullarda oluşturduğunuz Docker Hub hesabına giriş yapmaktır:
sudo docker login -u your_dockerhub_usernameİstendiğinde Docker Hub hesap parolanızı girin. Bu şekilde oturum açtığınızda, kullanıcı ana dizininizde Docker Hub kimlik bilgilerinizle ~/.docker/config.json adında bir dosya oluşturulur.
Artık uygulama görüntüsünü daha önce oluşturduğunuz your_dockerhub_username/nodejs-image-demo etiketini kullanarak Docker Hub'a gönderebilirsiniz:
sudo docker push your_dockerhub_username/nodejs-image-demoMevcut uygulama konteynerimizi ve imajımızı yok ederek ve bunları depolarımızdaki imajla yeniden oluşturarak imaj kayıt aracını test edelim.
Öncelikle çalışan container'larınızı listeleyin:
sudo docker psAşağıdaki çıktıyı alacaksınız:
Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e50ad27074a7 your_dockerhub_username/nodejs-image-demo "node app.js" 3 minutes ago Up 3 minutes 0.0.0.0:80->8080/tcp nodejs-image-demoÇıktıda listelenen KONTAYNER ID'yi kullanarak çalışan uygulama konteynerini durdurun. Aşağıda vurgulanan ID'yi kendi KONTAYNER ID'nizle değiştirdiğinizden emin olun:
sudo docker stop e50ad27074a7Tüm görsellerinizi -a ile listeleyin:
docker images -aAşağıdaki çıktıyı, your_dockerhub_username/nodejs-image-demo görüntü adınızla birlikte, düğüm görüntüsü ve yapınızdaki diğer görüntülerle birlikte alacaksınız:
Output
REPOSITORY TAG IMAGE ID CREATED SIZE
your_dockerhub_username/nodejs-image-demo latest 1c723fb2ef12 7 minutes ago 73MB
<none> <none> 2e3267d9ac02 4 minutes ago 72.9MB
<none> <none> 8352b41730b9 4 minutes ago 73MB
<none> <none> 5d58b92823cb 4 minutes ago 73MB
<none> <none> 3f1e35d7062a 4 minutes ago 73MB
<none> <none> 02176311e4d0 4 minutes ago 73MB
<none> <none> 8e84b33edcda 4 minutes ago 70.7MB
<none> <none> 6a5ed70f86f2 4 minutes ago 70.7MB
<none> <none> 776b2637d3c1 4 minutes ago 70.7MB
node 10-alpine f09e7c96b6de 3 weeks ago 70.7MBAşağıdaki komutla konteyneri durdurun ve kullanılmayan veya asılı kalan resimler dahil tüm resimleri kaldırın:
docker system prune -aÇıkışta konteyneri ve durdurulmuş görüntüleri kaldırmak istediğinizi onaylamanız istendiğinde Y tuşuna basın. Bunun yapı önbelleğinizi de sileceğini unutmayın.
Artık hem uygulama görüntünüzü çalıştıran konteyneri hem de görüntünün kendisini sildiniz. Docker konteynerlerini, görüntülerini ve birimlerini silme hakkında daha fazla bilgi için lütfen Docker görüntülerini, konteynerlerini ve birimlerini silme başlıklı makaleyi inceleyin.
Tüm görselleriniz ve kapsayıcılarınız kaldırıldıktan sonra artık uygulama görselini Docker Hub'dan çekebilirsiniz:
docker pull your_dockerhub_username/nodejs-image-demoGörsellerinizi bir kez daha listeleyin:
docker imagesÇıktınızda uygulamanızın bir görüntüsü yer alacaktır:
Output
REPOSITORY TAG IMAGE ID CREATED SIZE
your_dockerhub_username/nodejs-image-demo latest 1c723fb2ef12 11 minutes ago 73MBArtık 3. adımdaki komutu kullanarak konteynerinizi yeniden oluşturabilirsiniz:
docker run --name nodejs-image-demo -p 80:8080 -d your_dockerhub_username/nodejs-image-demoÇalışan konteynerlerinizi listeleyin:
docker ps
Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f6bc2f50dff6 your_dockerhub_username/nodejs-image-demo "node app.js" 4 seconds ago Up 3 seconds 0.0.0.0:80->8080/tcp nodejs-image-demoÇalışan uygulamanızı görüntülemek için http://your_server_ip adresini tekrar ziyaret edin.
Sonuç
Bu eğitimde, Express ve Bootstrap kullanarak statik bir web uygulaması ve uygulama için bir Docker imajı oluşturdunuz. Bu imajı kullanarak bir kapsayıcı oluşturdunuz ve imajı Docker Hub'a aktardınız. Ardından, imajınızı ve kapsayıcınızı yok edip Docker Hub deponuzu kullanarak yeniden oluşturabildiniz.












