Docker Volume Mapping Nedir ve Temel Komutlar#2 Nelerdir?
Docker nedir ve temel komutlar nelerdir? içeriğinden sonra bu içerikte docker port mapping, volume mapping, tag yapısı, detach, attach mode gibi biraz daha gelişmiş konulardan bahsedeceğiz.
Docker Tag Yapısı
Docker Hub’a girdiğimizde yüklemek istediğimiz image’leri araştırdığımızda, docker image’larının detaylarında tag’lere rastlamışızdır. Normal şartlarda “docker pull redis” ya da “docker run redis” komutlarını çalıştırdığımızda eğer Docker Host’ta redis image’imiz yoksa, Docker Hub’tan redis imajının son versiyonu çekilir. İlgili imajı aşağıdaki komut ile listelediğimizde, etiket olarak “latest” ibaresine rastlarız.
“docker images list” komutunu çalıştırdığımızda, tag başlığı altındaki imajlarınızın etiketlerini görüntülebilirsiniz. Peki latest yerine istediğim versiyondaki imajı yüklemek istersek ne yapmalıyız? Bunun için aşağıdaki komutu çalıştırabiliriz.
docker run mysql:5 (run komutu öncelikle local’de ilgili imajı arar, bulursa direkt olarak bu imajı çalıştırır fakat localinizde bu imajı bulamazsa docker hub’dan önce pull işlemi yapar ardından bu imajı çalıştırır)
Detach Mode Nedir?
Bazı container’ları ayağa kaldırdığımızda terminalde bize başka herhangi bir işlem yaptırmadığını gözlemleriz. Bunun önüne geçmek için ilgili container’ı detach mode’da ayağa kaldırmamız gerekir. Böylelikle arka planda çalışmasını sağlamış olur, böylelikle biz farklı işlemlerimize rahatlıkla devam edebiliriz. Örnek kullanım şu şekildedir:
docker run -d mongo
Bu işlemin ardından ise eğer bu uygulamada problem olup olmadığının kontrolü yapmak isteyebilir ve logları incelemeye ihtiyaç duyabiliriz. İşte bu durumda bu process’i(container’i) attach mode’a alıp detaylı kontrolleri/logları görüntüleyebilir ve sağlayabiliriz. Up durumdaki container’ın gizlediğimiz loglarını vs. şu komut yardımıyla görüntüleyebiliriz.
docker attach 11b74(containerID)
NOT: ContainerId’nin yalnızca ilk 3–4 hanesini belirtmeniz yeterli olacaktır.
Interactive Terminal Nedir?
Eğer kullanıcıdan veri aldığınız bir uygulamanız varsa, container’ınızı interactive terminal modunda çalıştırmalısınız. Aksi takdirde imajınız çalışacak, container ayağa kalkacak fakat kullanıcıdan bir veri seti alamayacaktır. İşte böyle bir uygulamanız varsa şu komutu çalıştırabilir ve kullanıcıdan veri girdisini alabilirsiniz.
docker run -it myCustomImageName
Port Mapping Nedir?
Tüm container’lar docker host’ta çalışır. Docker host’un kendisine ait bir network yapısı vardır. Her bir container’ımız birbiriyle gateway üzerinden bağlıdır diyebiliriz. Docker host’taki her container’lar aksi belirtilmediği takdirde random bir IP’ye sahiptirler ve aynı zamanda her container’ımızın bir port numarası mevcuttur.
Bilgisayarımıza mysql imajını çektiğimizi düşünelim. Bu imajı ayağa kaldırıp, mysql workbench üzerinden erişmek istediğimiz bir senaryo olsun.
docker run mysql
Yukarıdaki komutu çalıştırdıktan sonra workbench(mysql gui) ile veritabanına 3306 portundan erişemediğimizi farkederiz. Peki bunun nedeni tam olarak nedir?
Mysql container’ını ayağa kaldırdığımızda, docker host üzerinde çalışmaktadır. Workbench’den(gui), mysql’e erişmek istediğimizde öncelikle docker host’un portuna sonrasında mysql’in docker host üzerindeki iç portuna erişmemiz gerekir. Örnek kullanım:
docker run -p OUT_PORT:IN_PORT
Verdiğimiz dış port bilgisi, dışarıdan yani herhangi başka bir program üzerinden ya da kendi geliştirdiğimiz bir proje üzerinden erişim sağlayabileceğimiz port bilgisidir.
docker run -d --name=test-mysql -p 52000:3306 --env="MYSQL_ROOT_PASSWORD=mypassword" mysql
Yukarıdaki komutu çalıştırdıktan sonra mysql’e başka bir thirdparty(workbench vs.) uygulama ile 52000 portu üzerinden kolaylıkla bağlanabiliriz. Burada belirtilen 3306 ise mysql’in docker host üzerindeki iç portudur. Dışarıdan 52000 portuna bağlandığımızda, bu uygulamanın docker host içindeki container’ımızın 3306 portuna yönlendirir.
Docker Volume Mapping Nedir?
Docker host üzerinde çalıştırdığımız container’lar stateless olarak çalışırlar. Yani container’ların içerisinde kayıtlar tutulmaz.
Örnek senaryoda: MongoDB imajınızı ayağa kaldırıp, çeşitli collection oluşturma vs. gibi işlemler yapalım. Ardından container’ı durdurduğunuzda ve container’ı tekrar ayağa kaldırdığınızda yaptığımız değişikliklerin kaybolduğunu farkederiz.
İşte tam da bu noktada docker container’larında yapılan işlemlerin kaydedilmesi için “volume” yapısı kullanılır.
- Bir container’ı ayağa kaldırdığımızda kayıt edilecek klasörün Docker host uzerindekini adresini belirtiriz.
- Container içerisinde bir veri yazıldığında, Docker engine bunu alır ve bizim mapping yaptığımız klasörün içerisine aktarır.
- Daha sonrasında container durdurulduğunda bilgiler Docker host üzerinde kalmaya devam eder. Böylelikle de yapılan değişiklikler, container durdurulup tekrar başlatıldıktan sonra dahi kaybolmamış olur.
Örnek senaryomuzdaki mongo db’de yapılan işlemlerin kayıtlı şekilde kalmasını istiyorsak aşağıdaki yöntemleri izleyebiliriz.
Aşağıdaki komutu çalıştırdıktan sonra mongo container’ını durdursanız dahi yaptığınız işlemler(data ekleme, silme vs.) olduğu gibi docker host üzerinde belirttiğiniz dizinde kayıtlı tutulacaktır.
Volume mapping’i cli’da aşağıdaki gibi belirtebilirsiniz:
docker run -v destinationPath:sourcePath containerName(destinationPath: docker host üzerindeki dizin, sourcePath: ilgili container’daki dizindir)
“docker run -v /opt/data:/db mongo”
docker stop mongo
“docker run -v /opt/data:db mongo”
Yukarıdaki komutları çalıştırdıktan sonra mongo db’de yaptığınız işlemlerin olduğu gibi docker host üzerinde kayıtlı tutulduğunu gözlemlemiş olacağız.
Container Linkleme İşlemi Nedir?
Örnek senaryomuzda, redis’i kullandığınız bir uygulamamız olduğunu varsayalım. Bu uygulamamızın da imajı oluşturulmuş durumda. Ancak bizim redis client uygulamamız günün sonunda redis’i kullanarak çalışıyor.
İşte tam da bu noktada, 2 container arasında linkleme işlemi yapmamız gerekir. Eğer bir container çalışırken, diğer container’a ihtiyaç duyuyor ise bu durumda aşağıdaki linkleme işlemi yapmamız gerekmektedir.
docker run -it — link redis:redisAlias — name redisclient1
Komutta belirttiğimiz redisAlias ile hem yapacağımız uygulamadan hem de dışarıdan bu container’a bu alias ile bağlanabiliriz.