14 Aralık 2020 Pazartesi

Docker Container Yapısı -3

Bu yazıda Docker Container yapısında yer alan Docker CLI kullanımına, komutlarına ve bilmemiz gerek temel özelliklere değinmeye devam edeceğim.

Docker Container Yapısı -1 ve Docker Containe Yapısı -2 yazılarında bir container oluşturup çalıştırdık ve ona ne yapmasını söylediysek onu yaptı. Container'ın ideal kullanımında da senaryo bu şekilde ilerler. Yani container'ı çalıştırırsınız ve container çalıştırıldığı image dosyasında ki ayarlara göre ayağa kalkar. Başka bir deyişle container çalıştıktan sonra içine girip şunu çalıştır bunu çalıştır demeyiz. Bu işlemlerin tamamı container image oluşturma aşamasında belirtilir ve image olarak paketlenir. Container ise o image den oluşturulmuş çalışan bir kopyadır.  Genel olarak tek bir uygulama çalışması için hazırlanır ve container çalıştırıldığı zaman da o uygulama çalışır  ve uygulama çalıştıkça da container ayakta durmaya devam eder. 

Kısaca bir container hangi uygulamanın çalışması için ayarlandıysa onunla ilgili her türlü ayarın image oluşturma aşamasında ayarlanmasıdır. Dolayısıyla sonradan container'a bağlanıp herhangi bir değişiklik yapmak gerekmez.

Container'a bağlanıp herhangi bir değişiklik yapmamız gerekmez demek container'a bağlanamayız anlamına gelmemektedir.  Docker, container'ın içine bağlanıp değişiklikler yapmamıza izin verir.  Bunun için gerekli tek şey o container image sinin içerisinde bağlanabileceğimiz bir shell olmasıdır ki hemen hemen bütün image'lerde bağlanabileceğimiz bir shell mevcuttur.

Container'a Bağlanma:
Öncelikle bir container oluşturalım:
docker container run -d -p 8282:80 --name htmlcontainer emrahakin/htmlsite

container oluşturma kısmını bir önce ki yazıda detaylı olarak anlatmıştım dilerseniz orayı referans alabilirsiniz.

Container'ımızı oluşturduktan sonra çalışan container'ları listeleyelim

docker container ls




Bu oluşturduğumuz container'a bağlanmak için "exec" komutunu kullanacağız.

docker container exec -it CONTAINER ID sh




Gördüğünüz gibi "sh" komutu ile container içerisinde ki shell'e bağlanmış olduk. Ben Docker imege oluştururken alpine tabanlı bir docker image si oluşturdum. Alpine tabanlı dağıtımlarda "sh" ile bir shell açabiliyorum.
Eğer Ubuntu tabanlı bir image kullansaydım onun içinde bash olduğundan "sh" yerine "bash" yazacaktım.

docker container exec -it CONTAINER ID bash

Peki "-it" nedir?
-it esasında iki opsiyonun birleşimi "--interactive" ve "--tty" opsiyonlarının birleşimi olarak "-it" kullanıyoruz. Yani bu container'a interactive modda bağlan (benim komutlarımı bu container içerisinde çalıştır) ve bunu sağlamak içinde bir terminal bağlantısı kur demek.

Container'a bağlandığımıza göre artık normal bir Linux makine gibi ne yapmak istiyorsak onu yapabiliriz.

Mesela bağlandığımız container'da ki dosyaları "ls" komutu ile listeleyelim

Container'ımızı ayağa kaldırdığımız makinede bir web browser açık localhost:8282 adresine gidersek orada bir web sitesinin çalıştığını göreceğiz.



Şimdi "sh" ile container'ın içine bağlandığımıza göre bu html sayfasını değiştirebilirim.

Docker imnage sini oluştururken bir Dockerfile dosyası hazırlamıştık bu dosyaya buradan ulaşabilirsiniz. Bu Dockerfile dosyasında index.html in /usr/share/ngnix/html klasörü içerisine atılmasını belirtmiştik. Şimdi bu dizine bağlanarak index.html dosyası orada mı bir bakalım.



Bu şekilde tek satır komutla da ilgili klasöre gidebiliriz:

cd usr/share/ngnix/html

Artık index.html dosyasına ulaştığımıza göre değiştirebiliriz:

echo "yeni yazı ekledim" >> index.html

bu komutu çalıştırdığımızda mevcut index.html dosyasına "yeni yazı ekledim" diye bir text eklemiş olacağız.



Web tarayıcımızda sayfayı yenilediğimizde "yeni yazı eklendi" yazısının sayfaya eklendiğini görüyoruz.


Görüldüğü gibi mevcut bir docker container'ın içine girip değişiklik yapabiliyoruz.

Bu container'ın içinde hangi uygulamaların çalıştığını yine "ps" komutuyla görebiliriz. Container'ın içindeyken terminal ekranına "ps" komutunu yazarsak hangi uygulamaların çalıştığı listelecektir.



"exit" komutuyla container'ın içerisinden çıkıp kendi shell ekranımıza dönebiliriz. "exit" komutu ile sadece container ile olan bağlantımızı kesiyoruz container çalışmaya devam eder bunu da "docker container ls" komutuyla görebiliriz. 

Docker Container Yapısı -2

 


Bu yazıda Docker Container yapısında yer alan Docker CLI kullanımına, komutlarına ve bilmemiz gerek temel özelliklere değinmeye devam edeceğim. Dilerseiz buradan Docker Container hakkında ki ilk yazıma ulaşabilirsiniz.

Ben örnek olması açısından Docker Hub üzerinde, içinde nginx ve html olan bir image oluşturdum. Bu yazımda bu image üzerinden ilerleyeceğim. Docker Hub üzerinde image oluşturma kısmına ileride detaylı olarak değineceğim.

Oluşturduğum bu docker image'sinden bir container oluşturduğumuzda localhost' umuzda nginx üzerinde çalışan bir html web sayfası ayağa kalkacak ve yayına başlayacak. Bu docker container'ı oluşturan Dockerfile dosyasını incelemek isterseniz buradan ulaşabilirsiniz.

Container'ı oluşturarak işle başlayalım:

docker container run -d -p 8282:80 --name htmlcontainer emrahakin/htmlsite

Not: burada kullandığımız -p komutu port anlamına geliyor. Container'ımızı istediğimiz bir porttan ayağa kaldırabiliriz ben 8282 portunu kullandım. -d komutu ise container'ımızı detach mode (arka planda çalıştırmak) ile çalıştıracağımızı belirtir. Bu komutlara ileride detaylı olarak değineceğim.

Uygulamamızı ayağa kaldırdıktan sonra terminal satırına aşağıda ki kodu yazarsak çalışan containerlarımızı listelemiş oluruz.

docker container ls

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
21ba7d5780ca emrahakin/htmlsite "/docker-entrypoint.…" 14 minutes ago Up 3 minutes 0.0.0.0:8282->80/tcp htmlcontainer

Ekran çıktısında, emrahakin/htmlsite image'sinden türeyen, htmlcontainer adında bir container'ın 3 dakikadır ayakta olduğunu görüyoruz.

Bu container içerisinde bir nginx server çalıştığı için, container oluşturulduktan sonra çalışmasına devam ediyor. Bir önce ki yazıda olduğu gibi tek sefer çalışan bir uygulama yerine devamlı çalışan bir web uygulaması ayağa kaldırmış olduk.

Şuan da docker'ın yüklü olduğu makinede (localhost) bir web tarayıcı açıp adres olarak localhost:8282 yazarsanız karşınıza aşağıda ki sayfa gelecektir.











Peki makinemizde bir nginx server yüklü değilken bu html sayfa nasıl çalıştı?

Esasında bu sorunun cevabı neden docker kullanıyoruz ile aynı. Çünkü biz container'ımızı içinde nginx yüklü olan ve bu nginx server da html sayfa çalıştıran bir docker image den oluşturduk.

"docker container ls" komutu ile çalışan container'larımızı listelediğimiz zaman her biine bir CONTAINER ID atadığını görürüz. Bu CONTAINER ID bizim ilgili container üzerinde işlem yapabilmemiz için docker tarafından atanan Unique ID lerdir.

Mesela bu container'ın loglarını görmek istersek:

docker container logs CONTAINER ID (bende 21ba7d5780ca)

CONTAINER ID sinin tamamını yazmanıza gerek yok ilk 4 hanesi de size istediğiniz sonucu verecektir.

docker container logs 21ba


Container Durdurmak:
stop komutu ile çalışan bir container'ı durdurabiliriz:
docker container stop 21ba

"docker container ls" komutunu çalıştırdığımızda container'ımızın artık bu listede olmadığını görebiliriz. "docker container ls" komutu sadece çalışan container'ları listeler. Containerlarımızın tamamını görmek istiyorsak "docker container ls -a" komutu ile listeleme yapmalıyız.

docker container ls -a

Bu komutu çalıştırdığımızda docker engine içinde yer alan çalışan ve durdurulmuş tüm containerların listesini görebiliriz.

Container Çalıştırmak:
start komutu ile durdurulmuş bir container'ı aynı özellikleriyle yeniden çalıştırabilriz:
docker container start CONTAINER ID (bende 21ba)

duran container'ımızı yeniden çalıştırdıktan sonra "docker container ls" komutuyla yeniden çalışan containerlar listesinde container'ımızı görebiliriz.

Container Silmek:
Container'ı durdurmak ile silmek aynı şey değildir. Eğer zaten durdurulmuş bir container'ı silmek istiyorsak:
docker container rm CONTAINER ID (bende 21ba)

Eğer çalışan bir container'ı silmek istiyorsak: Burada iki opsiyonumuz bulunmakta önce çalışan container'ı "stop" komutu ile durdurabilir ardından silebiliriz yada çalışır vaziyette iken

docker container rm -f CONTAINER ID (bende 21ba)

komutuyla silebiliriz. -f burada force anlamına gelmektedir.

Aynı anda birden fazla container'ı da silebiliriz bunun için "docker container rm" komutundan sonra silinmesini istediğimiz containerların ID lerini aralarında boşluk bırakarak yazmamız yeterli olacaktır.

docker container rm CONTAINER ID1 CONTAINER ID2 CONTAINER ID3 ...

7 Aralık 2020 Pazartesi

CentOS 7'de VirtualBox Nasıl Kurulur

 

Şu komutu kullanarak mevcut CentOS 7 kurulumunu güncelleyerek sisteminizi hazırlayın:


sudo yum update


Adım 1: vboxdrv Kernel Module'ü kurun

VirtualBox, konuk işletim sistemleri için fiziksel belleği kontrol etmek ve tahsis etmek için vboxdrv çekirdek modülünü kullanır.
Ek modüller (kernel-devel, dkms, kernel-headers, wget ve diğer bağımlılık paketleri) kurmak için şunu girin:

sudo yum install –y patch gcc kernel-headers kernel-devel make perl wget

Kurulum tamamlandığında, yeni çekirdeği kullanmaya başlamak için sisteminizi yeniden başlatın:

sudo reboot


Adım 2: VirtualBox Deposunu İndirin

VirtualBox Oracle deposunu indirmek için şunu girin:

sudo wget http://download.virtualbox.org/virtualbox/rpm/el/virtualbox.repo -P /etc/yum.repos.d

Komut, depo dosyasını indirir ve /etc/yum.repos.d dizinine yerleştirir.

3. Adım: VirtualBox'ı kurun

VirtualBox'ı indirilen depodan kurun: (Ben yazıyı hazırlarken son sürüm 6.1 olduğundan. Ben VirtualBox 6.1 kurulumu üzerinden gideceğim)

sudo yum install VirtualBox-6.1

Sistem sizden GPG anahtarını kabul etmenizi ister. Onaylamak için Y girin.

Kurulum tamamlandıktan sonra, VirtualBox Linux çekirdek modülü hizmetinin durumunu kontrol edin:

sudo systemctl status vboxdrv

Terminal çıktısı, hizmetin etkin olduğunu doğrular ve bir zaman damgası sağlar.

Adım 4: Oracle VirtualBox Extension Pack'i Kurun (İsteğe Bağlı)

USB kullanımı, uzak masaüstü protokolleri veya disk şifreleme gibi işlevler için ek paketlerin ayrıca yüklenmesi gerekir.

VirtualBox paketini indirmek için şunu girin: (Ben yazıyı hazırladığımda Virtualbox 6.16 sürümü en güncel sürüm olduğundan örnek kodumu 6.16 üzerinden oluşturdum.)

wget http://download.virtualbox.org/virtualbox/6.1.16/Oracle_VM_VirtualBox_Extension_Pack-6.1.16.vbox-extpack

Terminal ekranından, paketlerin indirildiğini görebiliriz.

Ardından, paketi VirtualBox'a aktarın:

sudo VBoxManage extpack install Oracle_VM_VirtualBox_Extension_Pack-6.1.16.vbox-extpack

Y ile hüküm ve koşulları kabul ettiğinizi onaylayın. Sistem, uzantı paketinin başarıyla kurulduğunu onaylar.

Adım 5: VirtualBox'ı Başlatın
Yeni kurulan VirtualBox'a erişmek için şu komutu kullanın:

VirtualBox


Not:
Virtualbox'ı Centos7 sisteminden kaldırmak isterseniz şu komutu kullanabilirsiniz: (ilgili komut sayfası)

sudo yum erase *VirtualBox*