Web Seminer Serisi: Konteynerli Uygulamalar Oluşturun

Web Seminer Serisi

Bu makale, konteynırlanmış iş yüklerini bulutta dağıtma ve yönetme konulu bir web seminer dizisini tamamlar. Bu seride, konteyner yaşam döngüsü yönetimi, çoklu konteyner uygulamaları dağıtma, iş yüklerini ölçeklendirme ve Kubernet'leri anlama ve durum bilgisi olan uygulamaları çalıştırmak için en iyi uygulamaların vurgulanması gibi kapların temel özellikleri kapsanmaktadır.

Bu eğitici yazı, Konsept Uygulamaları Oluştur serisinin ikinci oturumunda kapsanan kavramları ve komutları içerir.

Giriş

Son ders olan Docker'ı Yükleme ve Yapılandırma dersinde, Docker kapsayıcılarını Docker görüntülerine dönüştürmek için bir yöntem araştırdık. Kullandığımız yöntem işe yarasa da, her zaman görüntü oluşturma en uygun yolu değildir.

Çoğu durumda, varolan kodu konteyner görüntülerine getirmek istersiniz ve kod tabanımızın en son sürümüyle senkronize olan Docker resimlerini oluşturmak için tekrarlanabilir, tutarlı bir mekanizma istersiniz.

Bir Docker dosyası, Docker görüntüleri oluşturmak için açıklayıcı ve tutarlı bir yol sağlayarak bu gereksinimleri karşılar.

Buna ek olarak, birlikte konuşlandırılan ve yönetilen çoklu, heterojen konteynerlerden oluşan tüm uygulamaları kapsayabilirsiniz.

Docker Docker dosyası gibi oluşturun, ağ ve depolama gereksinimleri de dahil olmak üzere tüm bir teknoloji yığını tanımlamak için bir yöntem sunmak için bildirimsel bir yaklaşım benimser. Bu sadece konteynırlanmış uygulamaları oluşturmak için kolaylaştırır, aynı zamanda bunları yönetmek ve ölçeklendirmeyi kolaylaştırır.

Bu yazıda, bir Docker dosyasından bir Docker resmi oluşturmak için Node.js ve MongoDB'yi temel alan örnek bir web uygulaması kullanacaksınız, Docker konteynerlerinizin iletişim kurmasını sağlayan özel bir ağ oluşturacaksınız ve Docker Compose'ı başlatmak için kullanacaksınız. Konteynerli bir uygulamayı ölçeklendir.

Ön şartlar

Bu öğreticiyi izlemek için ihtiyacınız olan şeyler:

  • Bir Ubuntu 16.04 Damlacık, bir sudo root olmayan kullanıcı ve bir güvenlik duvarı da dahil olmak üzere bu Ubuntu 16.04 başlangıç ​​sunucusu kurulum öğreticisini takip ederek kuruldu.
  • Bu web seminer serisinin ilk dersini izleyerek Docker Community Edition'ın en son sürümü kuruldu.

Adım 1 – Bir Docker Dosyası ile Bir Resim Oluşturma

Ev dizininize geçerek başlayın, sonra bu öğreticinin örnek web uygulamasını GitHub üzerindeki resmi depodan klonlamak için Git kullanın.

  • cd ~
  • git clone https://github.com/janakiramm/todo-app.git

Bu, örnek uygulamayı todo-app adlı yeni bir dizine kopyalayacaktır.

todo-app ls geçin ve dizinin içeriğini görüntülemek için ls kullanın.

  • cd todo-app
  • ls

Yeni dizinde iki alt dizin ve iki dosya bulunur:

  • app – örnek uygulamanın kaynak kodunun depolandığı dizin
  • compose – Docker Oluşturma yapılandırma dosyasının depolandığı dizin
  • Dockerfile – Docker resmini oluşturmak için talimatlar içeren bir dosya
  • README.md – örnek uygulamanın tek cümle özetini içeren bir dosya

cat Dockerfile çalıştırmak bize aşağıdaki bilgileri gösterir:

~/todo-app/DockerfileFROM node:slim
LABEL maintainer = "jani@janakiram.com"
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY ./app/ ./
RUN npm install
CMD ["node", "app.js"]

Bu dosyanın içeriğine daha ayrıntılı bir göz atalım:

  • FROM , özel görüntüyü oluşturduğunuz temel görüntüyü gösterir. Bu örnekte, görüntü node:slim üzerine kurulmuştur, yalnızca node çalıştırmak için gereken minimum paketleri içeren genel bir Node.js görüntüsüdür.
  • LABEL , betimleyici bilgi eklemek için genellikle kullanılan önemli bir değer çifti. Bu durumda, bakım yapanın e-posta adresini içerir.
  • RUN , kapsayıcıdaki komutları yürütür. Bu, dizinler oluşturma ve temel Linux komutlarını çalıştırarak kapsayıcıyı başlatma gibi görevleri içerir. Bu dosyadaki ilk RUN komutu, kaynak kodu tutan /usr/src/app dizinini oluşturmak için kullanılır.
  • WORKDIR , tüm komutların yürütüldüğü dizini tanımlar. Genellikle kodun kopyalanacağı dizin.
  • COPY , ana makineden dosyaları konteyner görüntüsüne kopyalar. Bu durumda, tüm app dizinini resme kopyalıyorsunuz demektir.
  • İkinci RUN komutu, uygulamanın bağımlılıklarını package.json tanımlandığı gibi npm install için npm install komutunu çalıştırır.
  • CMD , kabın çalışmasını sağlayacak işlemi yürütür. Bu örnekte, node parametre app.js ile app.js .

Şimdi Dockerfile görüntü oluşturmak için zamanı Dockerfile . Görüntüyü kayıt defteri kullanıcı adı, resim adı ve isteğe bağlı bir etiketle etiketlemek için -t anahtarını kullanın.

  • liman tesisi inşaatı-sammy / todo-web.

Çıktı, görüntünün Successfully built ve uygun şekilde etiketlendiğini onaylar.

Output from docker build -tSending build context to Docker daemon 8.238MB
Step 1/7 : FROM node:slim
---> 286b1e0e7d3f
Step 2/7 : LABEL maintainer = "jani@janakiram.com"
---> Using cache
---> ab0e049cf6f8
Step 3/7 : RUN mkdir -p /usr/src/app
---> Using cache
---> 897176832f4d
Step 4/7 : WORKDIR /usr/src/app
---> Using cache
---> 3670f0147bed
Step 5/7 : COPY ./app/ ./
---> Using cache
---> e28c7c1be1a0
Step 6/7 : RUN npm install
---> Using cache
---> 7ce5b1d0aa65
Step 7/7 : CMD node app.js
---> Using cache
---> 2cef2238de24
Successfully built 2cef2238de24
Successfully tagged sammy/todo-web:latest

Görüntünün docker images komutu çalıştırılarak oluşturulduğunu doğrulayabiliriz.

  • liman görüntüleri

Burada, görüntünün boyutunu, oluşturulan zamandan bu yana geçen süre ile birlikte görebilirsiniz.

Output from docker imagesREPOSITORY TAG IMAGE ID CREATED SIZE
sammy/todo-web latest 81f5f605d1ca 9 minutes ago 236MB

Örnek web uygulamasını çalıştırmak için bir MongoDB konteynerine de ihtiyacımız olduğundan, bunu makinemize yapalım.

  • docker pull mongo: en son

Çıktı, karşıdan yükleme durumuyla birlikte tam olarak hangi görüntünün çekildiğini rapor eder.

Output from docker pulllatest: Pulling from library/mongo
Digest: sha256:18b239b996e0d10f4ce2b0f64db6f410c17ad337e2cecb6210a3dcf2f732ed82
Status: Downloaded newer image for mongo:latest

Şimdi, örnek uygulamayı çalıştırmak için ihtiyacımız olan her şeye sahibiz, bu yüzden kaplarımızın birbirleriyle iletişim kurmasına izin verecek özel bir ağ oluşturalım.

Adım 2 – Konteynerleri Bağlantı Edecek Bir Ağ Oluşturma

Web uygulaması ve veritabanı kapsayıcılarını docker run komutu aracılığıyla bağımsız olarak başlatırsak, birbirlerini bulamazlar.

Nedenini anlamak için web uygulamasının veritabanı yapılandırma dosyasının içeriğini görüntüleyin.

  • kedi uygulaması / db.js

Node.js için bir MongoDB nesne modelleme kitaplığı olan Mongoose'u içe aktararak ve yeni bir veritabanı şeması tanımladıktan sonra, web uygulaması veritabanına henüz bulunmayan ana makine adı, db bağlanmayı deniyor.

~/todo-app/app/db.jsvar mongoose = require( 'mongoose' );
var Schema = mongoose.Schema;

var Todo = new Schema({
user_id : String,
content : String,
updated_at : Date
});

mongoose.model( 'Todo', Todo );

mongoose.connect( 'mongodb://db/express-todo' );

Aynı uygulamaya ait kapların birbirlerini keşfetmesini sağlamak için bunları aynı ağda başlatmamız gerekir.

Docker, kurulum sırasında oluşturulan varsayılan ağlara ek olarak özel ağlar oluşturma olanağı sağlar.

Mevcut olan şebekelerinizi şu komut ile kontrol edebilirsiniz:

  • liman ağları ls

Docker tarafından oluşturulan her ağ bir sürücüye dayanır. Aşağıdaki çıktıda, bridge adlı ağın sürücü bridge temel aldığını görüyoruz. local kapsam, ağın yalnızca bu ana bilgisayarda bulunduğunu gösterir.

Output from docker network lsNETWORK ID NAME DRIVER SCOPE
5029df19d0cf bridge bridge local
367330960d5c host host local
f280c1593b89 none null local

Şimdi, uygulamanız için todo_net adlı özel bir ağ oluşturacağız ve o ağda konteynırları başlatacağız.

  • rıhtım şebeke todo_net oluştur

Çıktı, oluşturulan ağın karmasını bize bildirir.

Output from docker network createC09f199809ccb9928dd9a93408612bb99ae08bb5a65833fefd6db2181bfe17ac

Şimdi, mevcut şebekeleri tekrar listeleyin.

  • liman ağları ls

Burada todo_net kullanıma hazır olduğunu todo_net .

Output from docker network lsNETWORK ID NAME DRIVER SCOPE
c51377a045ff bridge bridge local
2e4106b07544 host host local
7a8b4801a712 none null local
bc992f0b2be6 todo_net bridge local

--network docker run komutunu kullanırken, şimdi --network anahtarı ile bu ağa başvurabiliriz. Hem web hem de veritabanı kapsayıcılarını belirli ana makine adlarıyla başlatalım. Bu, kapsayıcıların bu ana makine adları vasıtasıyla birbirlerine bağlanmalarını sağlar.

Önce, MongoDB veritabanı kapsayıcısını çalıştırın.

  • liman işletmeciliği -d \
  • --name = db \
  • --hostname = db \
  • --network = todo_net \
  • Mongo

Bu komutu daha yakından inceleyerek şunu görüyoruz:

  • -d anahtarı, kapsayıcıyı ayrı modda çalıştırır.
  • --name ve --hostname anahtarları, kapsayıcıya kullanıcı tanımlı bir ad atamaktadır. --hostname anahtarı, Docker tarafından yönetilen DNS hizmetine bir girdi de ekler. Bu, kapsayıcının ana makine adına göre çözümlenmesine yardımcı olur.
  • --network anahtarı, Docker Engine'e konteyneri varsayılan köprü ağı yerine özel bir ağda başlatmasını --network .

docker run komutundan çıkış olarak uzun bir dize görürsek, kabın başarıyla başlatıldığını varsayabiliriz. Fakat, bu konteynırın gerçekten çalıştığını garanti etmeyebilir.

Output docker runaa56250f2421c5112cf8e383b68faefea91cd4b6da846cbc56cf3a0f04ff4295

db konteynerinin docker logs komutu ile çalışıp çalışmadığını doğrulayın.

  • rıhtımlar günlükleri db

Bu, konteyner günlüklerini stdout yazdırır. Günlüğün son satırı, MongoDB'nin hazır olduğunu ve waiting for connections gösterir.

Output from docker logs2017-12-10T02:55:08.284+0000 I CONTROL [initandlisten] MongoDB starting : pid=1 port=27017 dbpath=/data/db 64-bit host=db
. . . .
2017-12-10T02:55:08.366+0000 I NETWORK [initandlisten] waiting for connections on port 27017

Şimdi, web kapsayıcısını başlatıp doğrulayalım. Bu kez, biz de dahil ediyoruz --publish=3000:3000 konağın port yayınlar 3000 kabın portuna 3000 .

  • liman işletmeciliği -d \
  • --name = web \
  • --publish = 3000: 3000 \
  • --hostname = web \
  • --network = todo_net \
  • Sammy / todo-web

Daha önce olduğu gibi çıktı olarak uzun bir dize alacaksınız.

Bu konteynırın hazır ve çalışır durumda olduğunu da doğrulayalım.

  • liman köprüsü günlükleri web

Çıktı, Express'in – test uygulamanızın dayandığı Node.js çerçevesinin – listening on port 3000 doğruluyor.

Output from docker logsExpress server listening on port 3000

Web kapsayıcısının db konteyneriyle ping komutuyla konuşabileceğini doğrulayın. Bunu, docker exec komutunu bir sahte-TTY'ye ( -t ) bağlı bir etkileşimli ( -i ) modunda çalıştırarak yapıyoruz.

  • liman işletmecisi - web ping db'u

Komut standart ping çıkışı üretir ve bize iki konteynırın birbiriyle iletişim kurabildiğini bildirir.

Output from docker exec -it web ping dbPING db (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: icmp_seq=0 ttl=64 time=0.210 ms
64 bytes from 172.18.0.2: icmp_seq=1 ttl=64 time=0.095 ms
...

ping komutunu durdurmak için CTRL+C tuşlarına basın.

Son olarak, web tarayıcınızı http://your_server_ip:3000 örnek uygulamaya erişin. Konteynerler Yapılacak Örnek yazısını okumak üzere bir etiketle birlikte bir yapılacaklar görevini girdi olarak kabul eden bir metin kutusu göreceksiniz.

Adlandırma çakışmalarını önlemek için, artık konteynerleri durdurabilir ve docker rm ve docker network remove komutlarıyla kaynakları docker network remove .

  • rıhtım rm -f db
  • liman rm -f web
  • liman ağını kaldır todo_net

Bu noktada, iki ayrı kaptan oluşan konteynerli bir web uygulaması var. Bir sonraki adımda, daha sağlam bir yaklaşımı keşfedeceğiz.

3. Adım – Birden Çok Konteyner Uygulamasını Dağıtma

Bağlantılı kapları başlatabilmekteysek de, çok kapsayıcı uygulamalarla uğraşmanın en zarif yolu değil. İlgili tüm kapları beyan etmek ve bunları tek bir mantıksal birim olarak yönetmek için daha iyi bir yönteme ihtiyacımız var.

Dock Oluşturma, geliştiricilerin çok kapsayıcı uygulamalarla uğraşması için mevcut olan bir çerçevedir. Dockefile gibi tüm yığının tanımlanması için bildirimsel bir mekanizma. Artık Node.js ve MongoDB uygulamalarını Docker Oluşturmaya dayalı bir uygulamaya dönüştüreceğiz.

Docker Compose'ı kurarak başlayın.

  • sudo apt-kurulumu al - y limançısı - oluştur

Örnek web uygulamasının compose dizininde bulunan docker-compose.yaml dosyasını inceleyelim.

  • kedi oluşturma / kaptanlık yapımı.yaml

docker-compose.yaml dosyası her şeyi bir araya getirir. MongoDB konteynerini db: bloğunda, web: bloğundaki Node.js web kapsayıcısı ve networks: özel ağ web: bloğunu tanımlar.

build: ../. ile birlikte şunu unutmayın build: ../. direktifine Dockerfile , app dizinindeki Dockerfile oluşturduğumuzu Dockerfile . Bu, web kapsayıcısını başlatmadan önce resim oluşturmak için Oluştur komutunu verir.

~/todo-app/compose/docker-compose.yamlversion: '2'
services:
db:
image: mongo:latest
container_name: db
networks:
- todonet
web:
build: ../.
networks:
- todonet
ports:
- "3000"
networks:
todonet:
driver: bridge

Şimdi, compose dizini değiştirin ve docker-compose up komutunu kullanarak uygulamayı başlatın. docker run gibi, -d anahtarı da kapsayıcıyı müstakil modda başlatır.

  • cd kompozisyonu
  • rıhtım-yukarıya -d oluşturmak

Docker Oluşturmanın compose_todonet adlı bir ağ oluşturduğu ve her iki konteyneri de başlattığı çıktı raporları.

Output from docker-compose up -dCreating network "compose_todonet" with driver "bridge"
Creating db
Creating compose_web_1

Açık ana makine bağlantı noktası eşlemesini sağlamadığımıza dikkat edin. Bu, Bağlantı Oluşturucu'yu ana bilgisayardaki web uygulamasını ortaya çıkarmak için rastgele bir bağlantı noktası atamak üzere zorlar. Aşağıdaki komutu çalıştırarak bu bağlantı noktasını bulabiliriz:

  • limana ps

Web uygulamasının 32782 numaralı ana makine portuna maruz kaldığını 32782 .

Output from docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6700761c0a1e compose_web "node app.js" 2 minutes ago Up 2 minutes 0.0.0.0:32782->3000/tcp compose_web_1
ad7656ef5db7 mongo:latest "docker-entrypoint..." 2 minutes ago Up 2 minutes 27017/tcp db

Web tarayıcınızda http://your_server_ip:32782 . Bu, web uygulamasını, 2. Adımın sonundaki tıpkı gördüğünüz gibi ortaya çıkaracaktır.

Çok kapsayıcı uygulamamızın Docker Oluşturma'yla çalışıp çalışmasından sonra, uygulamanızı yönetmek ve ölçeklendirmek için bir göz atalım.

Adım 4 – Uygulamayı Yönetme ve Ölçeklendirme

Docker Compose, stateless web uygulamalarını ölçeklemeyi kolaylaştırır. web konteynerimizin 10 örneğini tek bir komutla başlatabiliriz.

  • limana göre hazırlama ölçeği web = 10

Çıktı, oluşturulmakta olan örnekleri izlememize ve gerçek zamanlı olarak başlatmamıza izin verir.

Output from docker-compose scaleCreating and starting compose_web_2 ... done
Creating and starting compose_web_3 ... done
Creating and starting compose_web_4 ... done
Creating and starting compose_web_5 ... done
Creating and starting compose_web_6 ... done
Creating and starting compose_web_7 ... done
Creating and starting compose_web_8 ... done
Creating and starting compose_web_9 ... done
Creating and starting compose_web_10 ... done

Web uygulamasının docker ps çalıştırarak 10 örneğe ölçeklendirildiğini doğrulayın.

  • limana ps

Docker'ın ana bilgisayardaki her bir web kapsayıcıyı göstermek için rasgele bir bağlantı atadığına dikkat edin. Bu portlardan herhangi biri, uygulamaya erişmek için kullanılabilir.

Output from docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cec405db568d compose_web "node app.js" About a minute ago Up About a minute 0.0.0.0:32788->3000/tcp compose_web_9
56adb12640bb compose_web "node app.js" About a minute ago Up About a minute 0.0.0.0:32791->3000/tcp compose_web_10
4a1005d1356a compose_web "node app.js" About a minute ago Up About a minute 0.0.0.0:32790->3000/tcp compose_web_7
869077de9cb1 compose_web "node app.js" About a minute ago Up About a minute 0.0.0.0:32785->3000/tcp compose_web_8
eef86c56d16f compose_web "node app.js" About a minute ago Up About a minute 0.0.0.0:32783->3000/tcp compose_web_4
26dbce7f6dab compose_web "node app.js" About a minute ago Up About a minute 0.0.0.0:32786->3000/tcp compose_web_5
0b3abd8eee84 compose_web "node app.js" About a minute ago Up About a minute 0.0.0.0:32784->3000/tcp compose_web_3
8f867f60d11d compose_web "node app.js" About a minute ago Up About a minute 0.0.0.0:32789->3000/tcp compose_web_6
36b817c6110b compose_web "node app.js" About a minute ago Up About a minute 0.0.0.0:32787->3000/tcp compose_web_2
6700761c0a1e compose_web "node app.js" 7 minutes ago Up 7 minutes 0.0.0.0:32782->3000/tcp compose_web_1
ad7656ef5db7 mongo:latest "docker-entrypoint..." 7 minutes ago Up 7 minutes 27017/tcp db

Web konteynerinde de aynı komutla ölçekleme yapabilirsiniz.

  • limana göre hazırlama ölçeği web = 2

Bu sefer ekstra örneklerin gerçek zamanlı olarak kaldırıldığını görüyoruz.

Output from docker-composeStopping and removing compose_web_3 ... done
Stopping and removing compose_web_4 ... done
Stopping and removing compose_web_5 ... done
Stopping and removing compose_web_6 ... done
Stopping and removing compose_web_7 ... done
Stopping and removing compose_web_8 ... done
Stopping and removing compose_web_9 ... done
Stopping and removing compose_web_10 ... done

Son olarak, örnekleri tekrar kontrol edin.

  • limana ps

Çıktıda sadece iki örnek kaldığı doğrulanır.

Output from docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
36b817c6110b compose_web "node app.js" 3 minutes ago Up 3 minutes 0.0.0.0:32787->3000/tcp compose_web_2
6700761c0a1e compose_web "node app.js" 9 minutes ago Up 9 minutes 0.0.0.0:32782->3000/tcp compose_web_1
ad7656ef5db7 mongo:latest "docker-entrypoint..." 9 minutes ago Up 9 minutes 27017/tcp db

Artık uygulamayı durdurabilir ve daha önce olduğu gibi, ad çakışmalarını önlemek için kaynakları temizleyebilirsiniz.

  • liman limanı durağı
  • rıhtımcı-rm -f oluşturmak
  • liman ağını kaldır compose_todonet

Sonuç

Bu ders Dockerfiles ve Docker Compose ile tanıştırdı. Görüntüler oluşturmak için bildirimsel bir mekanizma olarak bir Dockerfile ile başladık, ardından Docker ağının temellerini keşfettik. Son olarak, Docker Compose ile çok kapsayıcı uygulamaları ölçekledik ve yönettik.

Yeni kurulumunuzu genişletmek için, istekleri mevcut web uygulaması kapsayıcılarından birine yönlendirmek için başka bir kapsayıcıda çalışan bir Nginx ters proxy'yi ekleyebilirsiniz. Veya konteynerli uygulamalara dayanıklılık ve ölçeklenebilirlik getirmek için DigitalOcean'un Blok Depolama Alanı ve Yük Dengeleyicilerinden yararlanabilirsiniz.

Bir önceki yazımız olan Kimlik bilgilerini ayrı olarak Nesne Depolama Birimi ile Django'da Depolama başlıklı makalemizi de okumanızı öneririz.

About This Author

Uzun yıllardır yazılım ile uğraşıyorum. PHP ile başladığım yazılım hayatıma şu an PHP'nin yanında Swift ve Python ile devam ediyorum. Bu güne kadar bir çok proje geliştirdim ve yeni projeler geliştirmeye de devam ediyorum. Bu sitede yazılımseverlere faydalı bilgiler vermeye, yazılım geliştirmeye, öğrendiklerimi paylaşmaya, yeni başlayanlara yol göstermeye ve onlara yardımcı olmaya çalışıyorum.

Comments are closed

%d blogcu bunu beğendi: