Docker İle Geliştirme Ortamınızı Taşınabilir Hale Getirin #1

Share Button

Yazılım geliştirme ekiplerinin büyük problemlerinden biri de taşınabilirliktir. Eğer yazdığınız yazılımın yeterli/güncel bir kurulum dökümanı yoksa, yazılımı geliştirildiği ortamdan farklı bir ortama taşımak büyük problemdir. Taşınma, geliştirme ortamı ile test/production ortamları arasından olmasının yanında, projenin ekibe yeni dahil olan ekip arkadaşınızın bilgisayarın geliştirme ortamının kurulması da olabilir.

Docker, yazılımınızın tüm sistem paketleriyle birlikte çalışabieceği izole ve taşınabilir ortamlar sağlar. Geliştirme ortamınızı bir docker imajı haline getirerek gerek test/production ortamlarına, gerekse yeni bir geliştiricinin makinesine kolaylıkla taşıyabilirsiniz.

Başlamadan önce bazı temel kavramları netleştirelim:

Temel Docker Kavramları

Imaj (image): Bir yazılımın çalışabilmesi için gerekli sistem bağımlılıklarını ve hatta yazılımın kendisini içeren izole alanın taşınabilir görüntüsüdür. Docker imajları Docker tarafından sağlanan dockerhub.com üzeirnden saklanır. Docker dilediğinizde çalıştığınız ortamdaki imajları tar arşivi olarak yedeklemenize olanak sağlar. Docker imajları katmanlı ve salt okunur bir yapıya sahiptir. Imajların katmanlı yapısı, yeniden kullanılabilirliği sağlamaktadır.

Konteyner (Container): Imajların çalışır durumdaki örnekleridir. Bir imajdan birden fazla konteyner oluşturulabilir. Konteynerler, kendisini oluşturan katmanlı imajın üstüne yazılabilir yeni bir katman oluşturur. Konteyner içinde çalşıan yazılımın gerçekleştirdiği tüm değişiklikler bu katmanda meydana gelir. Konteynerde gerçekleşen değişiklikler imajları değiştirmez.

Konuyla ilgili daha fazla ayrıntı için şu dökümanı inceleyebilirsiniz.

Yeni Bir Docker Konteyneri Oluşturmak

Docker run komutu ile varolan veya docker registry (dockerhub.com) da yeralan docker imajlarından yeni bir container oluşturur. Imaj, şayet docker registry den temin edilmişse container ın çalıştırıldığı dosya sisteminde saklanır ve bir sonraki container oluşturma işleminde dosya sisteminde saklanan imajdan yararlanılır.

$ docker run --name cache_server -d -p 6379:6379 redis:latest 

Unable to find image 'redis:latest' locally


latest: Pulling from library/redis

43c265008fae: Downloading [============>                                      ] 13.09 MB/51.35 MB
2738f760012a: Download complete
a3b2771d56b8: Downloading [=======================================>           ] 12.98 MB/16.61 MB
5d98f21a4432: Download complete
79007f20bee8: Download complete
438fc7d50051: Waiting
5e8f776b71d7: Waiting

Yukarıdaki komutu çalıştırdığınızda docker, redis imajının latest etiketli sürümü için ilk defa container oluşturuyorsanız öncelikle dockerhub.com’da bu imajı arayarak bilgisayarınıza indirir. Indirme işlemi sonuçlandığında ise bu imajdan yeni bir örnek oluşturur.
Komut çıktısından da görebileceğiniz gibi imajı oluşturan tüm katmanlar ayrı ayrı indirilmektedir. Yine yukarıdaki komut çıktısında yeralan “Unable to find image ‘redis:latest’ locally” ifadesi, imajın yerel ortamda bulunamadığını ifade eder. Docker bu nedenle imajı dockerhub.com dan indirmektedir.

Örnekteki parametrelerden biraz bahsedelim.

–name Bu parametre, oluşturulan konteyneri isimlendirmek için kullanılır. Bu parametreyi belirtmediğimiz takdirde docker, oluşturulan konteynere otomatik olarak isim verir.

-d: Bu parametre Daemonize anlamına gelir. Çalıştırılmak istenen konteyneri arka planda çalıştırır.

-p 6379:6379 Çalıştırılan portun 6379 nolu portunu, docker servisinin çalıştığı bilgisayarın 6379 nolu TCP portuna map eder. Parametre değerinde iki nokta işareti(:) ile ayrılmış olan sayısal ifadelerden ilki, host (docker servisinin çalıştığı bilgisayar), ikinci sayısal ifade konteynerin portunu ifade eder. Docker, sanal makinelerden aşina olduğunuz farklı ağ modellerine destek vermektedir. Ancak bu bir giriş yazısı olduğu için burada bu konulara hiç girmeyeceğim.
Aynı host üzerinde barındırılan docker konteynerleri, ekstra bir konfigürasyon yapmadan aralarında sağlıklı iletişim sağlayabilirler. Ancak konteynerlerin farklı sunucularda barındırılması veya docker servisinin linux dışındaki bir işletim sisteminde çalışıyor olması çeşitli routing sorunlarına olabileceğinden, bu gibi durumlarda konteyner portları, ev sahibi bilgisayarın portlarına map edilmelidir.

redis:latest: “Redis” repositorysindeki “latest” etiketi ile etiketlenmiş docker imajını ifade eder.

Dilerseniz gelin biraz önce oluşturduğumuz konteynerin durumuna göz atalım.

$ docker ps -a

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
a30b208e1da2        redis:latest        "docker-entrypoint.sh"   51 seconds ago      Up 51 seconds       0.0.0.0:6379->6379/tcp   cache_server

Docker imajları, varsayılan bir giriş noktası (entrypoint) e sahiptir. Imaj isminden sonra belirtilecek parametre, varsayılan giriş noktasını ezmek için kullanılır.

$ docker run --name cache_server -d -p 6379:6379 redis:latest /bin/bash

Bilgisayarınızda sakladığınız imajların listesini şu şekilde görüntüleyebilirsiniz.

$ docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
redis               latest              74b99a81add5        41 hours ago        182.9 MB
ubuntu              14.04               1e0c3dd64ccd        2 weeks ago         187.9 MB

İki Konteyner Arasında İletişim Kurmak

Docker konteynerleri, siz aksini söylemediğiniz sürece docker tarafından sağlanan dahili bir dhcp sunucusu üerinden IP adresi alırlar. IP adresini bildiğiniz* durumda konteynerlar arasında ileitşim sağlayabilirsiniz. Bunun dışında pratikte containerlar ile ilgili IP bilgilerini konteynerler arasında paylaşmak için –link parametresi kullanılır.

Yeni bir linux container oluşturarak bir önceki örnekte oluşturduğumuz konteyner e bağlayalım. Yapacağımız bu işlem, yeni oluşturduğmuz konteynerde açtığımız bash oturumunda, diğer konteynerdeki redis sunucusuna bağlanmamızı sağlayacak.

$ docker run --name linux_machine1 --link=cache_server:cache -i -t ubuntu:14.04 /bin/bash

Yukarıdaki komutu çalıştırdığınızda docker, ubuntu repositorysindeki 14.04 etiketiyle etiketlenmiş docker imajından linux_machine1 isimli yeni bir konteyner oluşturur. Konteyner açıldığında bash oturumu başlatır. Buradaki -t parametresi pseudo (sözde) terminal ayırmasını ve -i klavyeden yapılan girişlerin konteynere iletilmesini sağlar. Redis sunucusu ile ilgili bağlantı bilgileri, –link parametresi ile cache takma adıyla ortam değişkeni olarak konteynere iletilir.

Gelin, redis konteyneri ile ilgili aktarılan iletişim bilgilerini, yeni açılan konteynerden görüntüleyelim.

root@1e3ffaec27b0:/# env|grep -i cache

CACHE_PORT_6379_TCP_PORT=6379
CACHE_PORT_6379_TCP_PROTO=tcp
CACHE_PORT=tcp://172.17.0.2:6379
CACHE_ENV_REDIS_DOWNLOAD_SHA1=6f6333db6111badaa74519d743589ac4635eba7a
CACHE_ENV_REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-3.2.5.tar.gz
CACHE_ENV_REDIS_VERSION=3.2.5
CACHE_NAME=/linux_machine1/cache
CACHE_PORT_6379_TCP_ADDR=172.17.0.2
CACHE_PORT_6379_TCP=tcp://172.17.0.2:6379
CACHE_ENV_GOSU_VERSION=1.7

Redis sunucusuna erişerek bir iki deneme yapmak için, yeni açtıığımız konteynere redis istemcisi kuralım.

root@1e3ffaec27b0:/# apt-get update; apt-get install -y redis-tools

Haydi redis container e bağlanalım.

root@1e3ffaec27b0:/# redis-cli -h ${CACHE_PORT_6379_TCP_ADDR}

172.17.0.2:6379> SET test-key 1
OK
172.17.0.2:6379> GET test-key
"1"

Konu biraz büyük olduğu için bu yazıyı burada sonlandırıyorum. Bir sonraki devam yazısında kendi docker imajınızı nasıl üretebileceğinizden söz edeceğim.

Share Button

About İbrahim Gündüz

1983 yılında İstanbul’da doğdu. İlkokul yıllarında cobol ve basic le olan tanışması, yazılıma olan ilgisini arttırdı 2005 yılında. Uludağ Üniversitesi Teknik Bilimler Meslek Yüksek Okulu Elektronik bölümünden mezun olan Gündüz, çeşitli alanlarda faaliyet gösteren kurumlarda yazılım geliştirici olarak görev almıştır. Mesleki ilgi alanları, ölçeklenebilir sistemler, uygulama entegrasyonları ve ödeme sistemleridir. Halen Markafoni back end geliştirici olarak çalışmaktadır.

Bir Cevap Yazın

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