Docker Hub Alternatifi Olarak Amazon Container Registry (ECR)

Amazon EC2 Container Registry (Amazon ECR) güvenli, ölçeklenebilir bir docker kayıt servisidir. Amazon ECR özel docker depolarını (private repository) desteklemektedir. Bu depoları, AWS IAM (Identity Access Management) yetkilerine göre kullanabilirsiniz. Geliştiriciler, bildikleri docker cli komutlarını (push, pull) kullanarak amazon ecr servisini kullanabilirler.

Bildiğiniz gibi aynı hizmeti docker hub kullanarakta alabilirsiniz. Fakat docker hub, bir tane özel (private) depo kullanımına izin verir. Diğer taraftan hali hazırda aws kullanıyorsanız, amazon ecr size sınırsız sayıda özel depo açma ve kullanma imkanı sunmaktadır. Diğer taraftan da, ecr, aws container service ile de entegre çalışabilmektedir. Yani docker container’larınızı, aws container service kullanarak yönetiyorsanız, amazon ecr kullanmak, ikisi entegre çalıştığı için işinizi kolaylaştıracaktır.

Amazon Ecr ile nasıl çalışıldığını anlamak için basit bir nodejs web uygulaması geliştirip bu uygulamayı bir docker imajı haline getirip, ecr’a kaydedeceğiz. Ardından ec2 instance’ımıza bağlanarak ecr üzerinden imajı indirerek çalıştıracağız. Tarayıcımız ile aws ec2 üzerinde çalışan web uygulamamıza bağlanarak docker container’ımızın çalışıp çalışmadığını test edeceğiz.

Komut satırında aşağıdaki komutları sırayla giriyoruz.

mkdir ecrapp
cd ecrapp
npm init

sorulan soruları yanıtlayıp package.json dosyamızı oluşturduktan sonra express kurulumunu yapalım:

npm install express --save

Oluşan package.json dosyası:

{
  "name": "ecrapp",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "tt",
  "license": "MIT",
  "dependencies": {
    "express": "^4.14.0"
  }
}

Bu aşamada basit bir sayfa dönen server uygulamasını yazabiliriz. app.js dosyası oluşturalım:

var express = require('express')
var app = express()

app.get('/', function (req, res) {
  res.send('Hello Amazon ECR!')
})

app.listen(3000, function () {
  console.log('Example app listening on port 3000!')
})

Komut satırında node app.js komutunu çalıştıralım:

node app.js

Tarayıcımız ile http://localhost:3000 sitesine bağlanalım.

Uygulamamız çalışıyor.

package.json dosyasına npm start scripti ekleyelim:

{
  "name": "ecrapp",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node app.js"
  },
  "author": "tt",
  "license": "MIT",
  "dependencies": {
    "express": "^4.14.0"
  }
}

Böylece npm start diyerek de uygulamamı başlatabilirim.

Nasıl Dockerize Ediyorum (Yeoman, yo docker)

Web uygulamasının docker container içerisinden çalışmasını istiyorum. Bu yüzden bir Dockerfile yazmamız gerekiyor. Elle yazmamak için yeoman docker generator kullanacağız.

npm install -g generator-docker

docker generator’ü kurduktan sonra, ecrapp dizinin içerisindeyken aşağıdaki komutu çalıştıralım.

yo docker

Ekranda görüldüğü gibi soruları cevaplayarak enter’a tıklıyoruz. Generator ihtiyacımız olan tüm dosyaları bizim için oluşturmuş oluyor.

Dockerfile dosyasına bakalım:

FROM node
WORKDIR /src
EXPOSE 3000
ENTRYPOINT ["npm", "start"]
COPY . /src
RUN npm install

Kendi lokal bilgisayarımızda imajı oluşturalım.

docker build -t ttufekci/ecrapp:1.0 .

Build ederken imaj ismini [name:tag] formatında veriyorum. ttufekci/ecrapp imajın ismi, 1.0’da tag’i oluyor.

docker images

komutu ile imajımıza bakalım.

İmajımız oluştu. Docker run [Image ID]  diyerek imajımızı çalıştırıyoruz.

docker run -p 3000:3000 6b1b61c5a384

Tarayıcımız ile bağlanarak, containerın çalıştığını görebiliriz.

Amazon ECR’a Push Ediyoruz

Tüm işlemlerimizi aws cli (command line interface) üzerinden yapacağımız için aws cli kütüphanesini kurmamız gerekiyor. https://aws.amazon.com/cli/ sitesinden kendi bilgisayarınıza uygun olan setup dosyasını indirip kurabilirsiniz. Bilgisayarıma AWSCLI64.msi dosyasını kurdum.

AWS Configure

Kendi hesabımızda çalışan ec2 instance’larına ulaşmak için, bir sefere mahsus aws configure komutunu çalıştırmamız gerekiyor.

aws configure

Bu komut bizden aşağıdaki değerleri isteyecektir.

AWS Access Key ID [None]:
AWS Secret Access Key [None]:
Default region name [None]:
Default output format [None]:

AWS Access Key ID ve Secret Access Key değerlerine, aws dashboard üzerinden ulaşabilirsiniz.

IAM ekranına geçip Users listesinden kendi kullanıcınızı seçerek, security credentials tabını seçin.

Burda varolan bir access key’i ya da yeni bir tane oluşturup onu kullanabilirsiniz.

Region name bilgisini bulmak için ec2 instances ekranına gidip, üzerinde işlem yapacağınız instancı seçiniz. Listeden görünen availability zone değerini region name olarak girebilirsiniz. Ekranda görüldüğü gibi benim instance’ımın region’u us-west-2.

Bu şekilde değerleri girerek aws configure kısmını tamamlamış olduk.

aws ecr get-login komutu
aws ecr get-login

Bu komut, bir docker login çıktısı dönecektir. Bu çıktıyı komut olarak girelim. Login Succeeded mesajı almışsak doğru yoldayız demektir. Şimdide aws üzerinde bir depo (repository) oluşturalım.

aws ecr create-repository --repository-name ecrapp

Böylece ecrapp isimli bir depo (repository) oluşturmuş olduk.

Daha önce oluşturmuş olduğumuz imajı ecr’a göre tag’lememiz gerekiyor. Hatırlarsanız, ttufekci/ecr isimli ve 1.0 tag’li bir imaj oluşturmuştuk.

docker tag ttufekci/ecrapp:1.0 aws_account_id.dkr.ecr.us-west-2.amazonaws.com/ecrapp:1.0

aws_account_id kısmına kendi account id’nizi, us-west-2 yerine de ec2-instance’ınızın availability zone değerini koyunuz, (benim için us-west-2).

Artık imajı amazon’a push edebiliriz.

docker push aws_account_id.dkr.ecr.us-west-2.amazonaws.com/ecrapp:1.0

Amazon Container Services ekranında repositories kısmında ecrapp deposunun oluşturulmuş olduğunu görebiliriz.

AWS EC2 Instance İçerisinden İmajımızı Çalıştırıyoruz

Artık ec2 instance’ı içerisinden imajımızı pull edip, çalıştırabiliriz.

Putty kullanarak instance’ımıza erişiyoruz. Linux kullananlar başka türlü erişebilirler. Putty.exe’i çalıştırıp login olalım:

Host Name alanına ec2-user@ kısmından sonra public dns girilir.

Connection -> SSH kısmına da size ait olan private key girilir: ppk uzantılı dosya browse edilerek bulunur.

putty ile bağlandığımız instance’ın komut satırında da aws ecr get-login komutunu çağırmamız gerekiyor. Daha önce yapmadıysak yine aws configure komutunu çağırmamız gerekiyor (Yukarda anlattığımız gibi).

aws ecr get-login

Çıkan outputu (docker login …) komut satırına kopyalayıp tekrar çalıştıralım, Login Succeeded mesajını alalım.

Docker Pull Komutunu Çalıştırıyoruz
docker pull aws_account_id.dkr.ecr.us-west-2.amazonaws.com/ecrapp:1.0

Docker images komutu ile imajı instance’ımıza indirebildik mi diye bakıyoruz.

docker images

Artık ec2 instance’ımızda imajımız var ve çalıştırılabilir bir durumda. docker run ile imajımızı çalıştıralım.

docker run -p 80:3000 aws_account_id.dkr.us-west-2.amazonaws.com/ecrapp:1.0

Dışardan tarayıcı ile bağlanmak için ec2 instance’ımıza public dns üzerinden bağlanmaya çalışalım.

http://publicdns

Yetki ayarını yapmadıysak, hata alacağız. Bu yüzden ec2 instance’ının 80 portunu dışarıya açmamız gerekiyor.

Network & Security > Security Groups ekranından ilgili instance’ın ait olduğu security grubunu seçerek, inbound kaydı eklememiz gerekiyor.

 

Son olarak tarayıcımız ile aws’ye bağlanıp dockerize ettiğimiz web uygulamasını açabiliriz.

 

 

Yorum bırakın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Scroll to Top