Docker Kurulumu ve Genel Kullanımı
Fux Docker Kurulumu
Docker, dosya sisteminden bağımsız loop aygıtları ve lvm bölümler içerisinde başka işletim sistemleri ve uygulamalar çalıştırmanızı sağlayan bir sanallaştırma yöntemidir. Container dediğimiz bloklar halinde çalıştırılır. Her bir konteynırı farklı bir işletim sistemi imajı ile birlikte oluştururuz ve bu şekilde kullanırız. Peki ama ne için?. Neden böyle birşeye ihtiyaç duyuldu?. Bu sorunun birden fazla cevabı var. Öncelikli olarak kolay taşınabilirliği sayabiliriz. Çünki docker çapraz platform bir sanallaştırma sistemidir. Docker çalıştıran herhangi bir işletim sisteminde herhangi bir konteynır içerisindeki işletim sistemini aynı stabiliteyle çalıştırabilirsiniz. Diğer bir özelliği ise aynı anda birden fazla aynı uygulamayı çalıştırabilmenizdir. Örneğin apache web sunucusu'nu ele alalım. bir makineye yalnızca bir tane apache web sunucusu kurabilirsiniz. Ancak docker konteynırları içerisinde istediğiniz kadar apache web sunucusu kurabilir (her konteynıra bir tane) ve hepsinde öntanımlı olarak 80 portunu dinleyebilirsiniz. Her konteynırın 80 portunu ana işletim sisteminizin herhangi bir portuna yönlendirerek tüm konteynırlardaki işletim sistemlerinden web sunumu yapabilir ve bir cloud (bulut) yapısı oluşturabilirsiniz. Docker'ın avantajlı yönlerinden bir tanesi'de güvenlik'dir. Normal şartlarda ana işletim sisteminize kurmuş olduğunuz bir web sunucusu'na sanal alanlar (VirtualHost) tanımlayıp birden fazla site yayınlayabilirsiniz, ancak hepsi'nin bulunduğu yer kök dosya sisteminizdedir. Daha önce'de söylediğim gibi docker dosya sisteminden bağımsız loop aygıtları ve lvm alanları içerisinde çalıştırılır. Bu alanlar'dan yukarıya yani ana makinenin dosya sistemine geçmek mümkün değildir. Docker konteynır'ın içerisindeki işletim sistemine bir saldırgan sızmış ve root kullanıcısı izinlerini elde etmiş bile olsa verebileceği zarar yalnızca o konteynır'ın içi ile sınırlıdır. Ayrıca konteynırlar sadece okuma kipinde çalıştırılır. Bir konteynıra okuma-yazma kipinde başka ek dosya sistemleri bağlayabilirsiniz. Bu okuma-yazma izinlerine sahip dosya sistemi ana makinezde'ki bir dizin'in içi bile olabilir. Docker'ın avantajları bu makale ile anlatılamayacak kadar fazladır. Biz sizlere bu makale ile Fux işletim sisteminize nasıl docker kurabileceğiniz ve yapılandırabileceğinizden bahsedeceğiz. Docker Kurulumu Bir terminal açarak root kullanıcısı'na geçiş yapın.
su parola
Docker kurulumu için aşağıda'ki komutu koşun.
dnf install docker
Docker ile sistemler ve uygulamalar kolay taşınabilir şekilde geliştirilir. Birden fazla geliştirici aynı anda aynı uygulamayı geliştirebilir. Docker içerisinde'ki web sunucularınıza ana işletim sisteminiz'deki tarayıcı'dan erişebilmeniz için, docker'ın standart makine ip'sini proxy ayarı ile aktifleştireceğiz ve lvm bölümler ile kullanabilmek için docker'ı yapılandıracağız. Proxy ayarı ve storage ayarı yapmadan da kullanabilirsiniz. Docker LVM ile çalışacak şekilde yapılandırılmaz ise otomatik olarak loop aygıtları ile çalışır. Ancak lvm daha performaslı olarak kullanabilmemizi sağlar. Loop aygıtlarında okuma-yazma hızı daha düşüktür. Docker'ın proxy servisini oluşturmak için aşağıdaki komut ile öntanımlı systemd dizini'ni oluşturuyoruz.
mkdir -p /etc/systemd/system/docker.service.d
Bu dizin içerisine iki tane systemd servisi oluşturacağız. Biri http, biride https protokolü için. Http protokolü servis dosyasın'dan başlayalım. Ben düzenleyici olarak vi kullandım siz favori düzenleyicinizi kullanabilirsiniz.
vi /etc/systemd/system/docker.service.d/http-proxy.conf
Oluşturduğumuz ve açtığımız dosyanın içerisine, docker'ın ön tanımlı olarak kullandığı makine ip adresini tanımlayacağız. Dosya'ya aşağıdaki içeriği ekleyip kaydedin.
[Service] Environment="HTTP_PROXY=http://172.17.0.1:80/"
Https protokolü içinde aynı işlemi yapıyoruz. Sadece servis dosyası isimleri farklı ve içeriğindeki protokol ile port https için. Dosyayı oluşturup açıyoruz.
vi /etc/systemd/system/docker.service.d/https-proxy.conf
Servis dosyası içerisine aşağıdaki bölümü ekleyip kaydediyoruz.
[Service] Environment="HTTPS_PROXY=https://172.17.0.1:443/"
Systemd, boot sürecinde işletim sistemimiz başlatılırken önbeleğe aldığı ayarlar ile çalıştığı için ve biz bu ayarları değiştirdiğimiz'den şuan docker servisini başlatamayız. systemd-daemon hatası alırız. Systemd'nin yeni eklediğimiz servisleri algılaması için aşağıdaki komutu koşun.
systemctl daemon-reload
Şuan docker servisini başlatabiliriz ancak yapacağımız ayarlar henüz bitmedi. LVM bölümler ile docker çalıştırabilmemiz için docker-storage-setup dosyasını düzezenleyeceğiz. Dosya'yı favori editörümüz ile açıyoruz.
vi /etc/sysconfig/docker-storage-setup
Dosya içeriğinde kapatılmış yorum alanları haricinde herhangi bir satır bulunmuyor. Aşağıdaki parametreyi dosya sonuna ekleyerek kaydediyoruz.
STORAGE_DRIVER=overlay
Overlay seçeneği yapılandırılmış bir lvm bölüm varsa lvm alanları docker'ın kullanabilmesini sağlar. Yapılandırılmamış ise elbette loop aygıtı kullanacaktır. Konteynırlar için belirteceğimiz seçeneklerde selinux'u devre dışı bırakmamız gerekir. Aşağıdaki komut ile docker yapılandırma dosyasını açıyoruz.
vi /etc/sysconfig/docker
Dosya içerisindeki
OPTIONS='--selinux-enabled --log-driver=journald'
Satırını bulup aşağıdaki şekilde düzenliyoruz. ve kaydediyoruz.
OPTIONS='--log-driver=journald'
Artık docker'ın kullanacağı bölümleri ayarlaması için docker-storage-setup komutunu koşabiliriz.
docker-storage-setup
Docker servsini başlatıyoruz ve başlangıçta çalışması için etkinleştiriyoruz.
systemctl start docker systemctl enable docker
Docker'ı normal kullanıcı olarak kullanabilmek için docker adında bir grup oluşturuyoruz ve kullanıcıyı docker grubuna ekliyoruz.
groupadd -r docker usermod -a -G docker fuat
Süper kullanıcı (root) olarak docker server ve clientin çalıştığını kontrol etmek için docker version komutunu koşarsanız sorunsuz çalıştığını göreceksiniz. Ancak az önce eklediğimiz kullanıcı ile bu komutu koşarsanız docker istemcisi'nin çalıştığını ama docker sunucusu'nun çalışmadığını görürsünüz. Eklediğimiz kullanıcı ile docker'ı kullanabilmeniz için işletim sisteminizi yeniden başlatmalısınız.
reboot
Fux işletim sistemi yeniden başlatıldıktan sonra docker'ı root olmadan normal kullanıcı hesabınızla kullanabilirsiniz.
Temel Docker Komutları Docker çalışma prensibi olarak her başlatılan konteynırı ana işletim sistemin'de bir servis olarak çalıştırır. Konteynır içerisinde çalışan işletim sisteminde'ki servislere ulaşabilmemiz ve ana makine'den kontrol edebilmemiz için çeşitli docker komutları ile boru (pipe) kullanarak konteynır'da komutları koşar, elde ettiği çıktıyı'da bize yönlendirir. Docker'ın anlatılması ve açıklanması gereken oldukça fazla komutu vardır ancak bunların detaylı açıklaması birkaç makale ile mümkün görünmüyor. Docker komutları şunlardır.
attach#-> Yerel sistem değişiklikleri'ni Docker'a bağlar
build#-> DockerFile dosya'sı ile yeni bir konteynır oluşturur
commit#-> Konteynır değişikliklerini içeren bir imaj oluşturur
cp#-> Bilgisayarınızda'ki dosyaları konteynıra kopyalar
create#-> Yeni bir konteynır oluşturur
diff#-> Konteynır'ın dosya sisteminde'ki değişikleri görüntüler
events#-> Gerçek zamanlı eventleri görüntüler
exec#-> Çalışan konteynır üzerinde komut çalıştırır
export#-> Konteynır'ın dosya sistemi'ni tar arşivi olarak çıkarır
history#-> Bir imajın geçmişini görüntüler
images#-> Eklenmiş konteynırların imajlarını listeler
import#-> Tar formatındaki imajı import eder
info#-> Sistem bilgilerini detaylı olarak gösterir
inspect#-> Konteynır ve imajların düşük seviye bilgileri gösterir
kill#-> Çalışan bir konteynır işlemi'ni öldürür
load#-> Tar arşivinden bir imaj yükler
login#-> Docker kütüphanelerine giriş yapar
logout#-> Docker kütüphanelerin'den çıkış yapar
logs#-> Konteynır'ın loglarını görüntüler
network#-> Docker ağ ayarlarını yönetir
pause#-> Bir konteynır içinde'ki tüm işlemleri durdurur
port#-> Konteynır içinde'ki port haritaları'nı listeler
ps#-> Konteynırları listeler
pull#-> Docker reposun'dan imaj indirir
push#-> Docker reposu'na imaj gönderir
rename#-> Bir konteynır'ın ismini değiştirir
restart#-> Bir konteynırı yeniden başlatır
rm#-> Bir veya daha fazla konteynır siler
rmi#-> Bir veya daha fazla imaj siler
run#-> Yeni bir konteynır içinde komut çalıştırır
save#-> Bir veya daha fazla imajı tar formatında kaydeder
search#-> Docker reposunda imaj arar
start#-> Bir veya daha fazla konteynır çalıştırır
stats#-> Konteynır'ın tükettiği kaynakları listeler
stop#-> Çalışan bir konteynır'ı durdurur
tag#-> Bir imajı repoya göndermek için etiketler
top#-> Konteynır üzerinde çalışan işlemleri listeler
unpause#-> Konteynır içinde'ki durdurulmuş işlemleri aktif eder
update#-> Bir veya daha fazla konteynır ayarını günceller
version#-> Docker versiyon bilgisini gösterir
volume#-> Docker bölüm ayarlarını yönetir
wait#-> Konteynır durdurulana kadar bekler ve exit yazar
Bu komutlar içerisinde size bahsedeceğimiz komutlar docker info, docker version, docker import, docker images, docker run ve docker ps komutlarıdır. Genel anlamda bu komutlar ile başlangıç seviyesinde docker kullanabilirsiniz. Docker Info Komutu Docker info komutunu koştuğunuz'da eklenmiş konteynırları, çalışanları, durdurulmuşları, sonlandırılmışları, imajları, sistem özelliklerini, kullanıdığı bölümü gibi tüm genel özellikleri hakkında bilgi sahibi olmanızı sağlar.
Yapılandırdığımız ve çalıştırdığımız docker sisteminin kullandığı depolama (storage) aygıtına bakalım.
Ekran alıntısında'da gördüğünüz gibi /dev/mapper/fux-root lvm aygıtı içeriside'ki /var/lib/docker/overlay konumu'nu docker imajlarını oluşturmak ve depolamak için kullanıyor. Docker Version Komutu Docker version komutu, docker daemon'un docker sunucu'su ve istemcisi'ne bağlanıp o an ki çalışma zamanı durumlarını alarak size bilgi verir. Eğer aşağıdaki resimde'ki gibi bir çıktı alıyorsanız sorunsuz çalışıyordur.
Docker Import Komutu Docker import komutu ile docker sistemine yeni bir container eklersiniz. Örneğin paket depomuz'daki Docker-Base-Container_Fux-Server-1.5.tar imajı'nı docker'a ekleyebiliriz. Bu imaj, içerisinde minimum Fux Server işletim sistemi barındırır. Bu temel görüntüyü kullanarak DockerFile ile üzerine yeni paketler kurup, yapılandırıp başka Fux Server imajları oluşturabilirsiniz. Temel konteynırımızı docker'a ekleyelim.
docker import /home/fuat/İndirilenler/Docker-Base-Container_Fux-Server-1.5.tar fux:1
Docker Images Komutu Docker images komutu docker'a eklenmiş konteynırların imajlarını listeler.
Docker Run Komutu Docker run komutu ile eklenmiş bir docker konteynırı başlatırız. Çeşitli parametreler ile bağladığımız imajı ayarlayabiliriz. Örneğin -h parametresi ile docker konteynırın'da çalışan sisteme hostname tanımlayabiliriz. -v parametresi konteynıra başlatırken bir volume bağlamamıza olanak verir. -p çalışma portu'nu tanımlar, -d deattach yani konteynırı arkaplanda çalıştırır. Önceden ayarları yapılmış yapması gereken işi başlangıçla birlikte yapmaya ayarlanmış konteynırları bu şekilde başlatırız. -i ve -t birlikte kullanılır. interactive ve tty anlamına gelir. Konteynır içerisine giriş yapmak istiyorsak bu parametreler ile başlatırız. -t parametresine kullandığımız kabuk uygulamasını belirtiriz. Örneğin bash veya /usr/bin/bash yazabilirsiniz. Eklediğimiz Fux Base imajı fux:1 olarak ekledik. Hadi bu konteynırı koşalım.
docker run -h fuxproject.org -i -t fux:1 bash
Konteynıra doğrudan bağlandık. Herhangi bir kullanıcı ile giriş yapmadığımız için kabuk'ta sadece bash yazıyor. Konteynır içerisinde'ki sisteme bir kullanıcı ekleyip, .bash_history, .bash_logout, .bashrc gibi kullanıcı'ya ait dosyaların oluşmasını sağlarsanız kabuk'ta kullanıcı ve hostname bilgisi yazacaktır. Docker Ps Komutu Docker ps komutu sistem'de çalışan konteynırları listeler.
Bu uzun makaleyi sonu'na kadar sıkılmadan okuduğunuz için teşekkür ederim. Güle güle kullanın.