Toplam Sayfa Görüntüleme Sayısı

17 Mayıs 2017 Çarşamba

Docker container

Selamlar;
Bu paylaşımda docker container dan bahsedeceğim. Kısaca docker hakkında bilgi vereyim. Docker, go dili kullanılarak yazılmış konteyner ve sanallaştırma programıdır.İçeriğinde işletim sistemi imajları barındırmakta ve bu imajların farklı biçimlerini "versiyon"lama gibi bir çok yeteneğe sahiptir. İki farklı dağıtımı bulunmaktadır,Docker Community Edition (CE) ücretsiz olan sürüm ve Docker Enterprise Edition (EE) ücretli olan sürüm.Bilgi verme kısmı tamamlandığına göre kurulum adımlarına geçiyorum. NOT: Paylaşımda "Ubuntu 16.10 x86-64" üzerine "Docker Community Edition (CE)" sürümü apt-get ve "deb" paket yöntemi ile kurulacaktır.  

Apt-get yöntemi ile Docker Community Edition (CE) kurulumu:

Docker kurulumu yapmadan önce , kurulması gereken bir takım docker bağımlılıkları bulunmakta. Bu bağımlılıkları kurduktan sonra docker kurulumuna geçmeliyiz. Bağımlılıkları kurmak için aşağıdaki komutu çalıştırıyoruz.
sudo apt-get update
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common
Docker kurulumu için gerekli bağımlılıkların kurulumunu tamamladığımıza göre, docker kurulumuna devam ediyorum, aşağıdaki komutla gpg key dosyasını almalıyız.
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
Ek bilgi : Proxy ve websense'in bulunduğu filtreli bir ağdan internete çıkıyorsanız bu kısımda "gpg" key ile ilgili bir hata almanız yüksek bir ihtimal. Bunu önlemek için ilgili "crt" uzantılı sertifikayı "/usr/local/share/ca-certificates/" dizine altına kopyalayıp sonrasın da  "update-ca-certificates" komutu ile sertifikayı ekleyerek aşılmakta. Elinizdeki sertifika cer uzantılı ise , "openssl x509 -inform DER -in certificate.cer -out certificate.crt"  komutu ile "cer" dosyayı "crt" haline dönüştürebilirsiniz. Ayrıca "systemd" altına aşağıda verilen proxy tanımlarını yapmamız gerekmekte, daha fazla bilgi için:
https://docs.docker.com/engine/admin/systemd/#manually-creating-the-systemd-unit-files

sudo su
mkdir -p /etc/systemd/system/docker.service.d
touch /etc/systemd/system/docker.service.d/http-proxy.conf
nano /etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTPS_PROXY=https://proxy.com:8080" "HTTP_PROXY=http://proxy.com:8080" "NO_PROXY=localhost,127.0.0.1"
systemctl daemon-reload
systemctl restart docker
Kurulum adımlarına geri dönüyorum. Docker dağıtımına ait apt-repository, adres tanımını eklemek için aşağıdaki komutu kullanıyoruz.
sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
Docker kurulumunu aşağıdaki komutları kullanarak tamamlıyoruz. 
sudo apt-get update
sudo apt-get install docker-ce
Docker kurulumunu test edelim.
sudo docker version
sudo docker run hello-world
sudo docker search ubuntu-16.04
"Deb" paketi ile Docker Community Edition (CE) kurulumu:

İlk olarak Docker Community Edition (CE) sürüme ait "deb" paketini https://download.docker.com/linux/ubuntu/dists/ adresinden işletim sistemi sürümüne uygun olan paketi bularak indiriyoruz. Bu işlemi yapabilmek için "lsb_release -a" komutu ile alınan çıktıda bulunan "Codename" alanındaki isimi kullanıyoruz.



Doğru dağıtımı bulduk,şimdi şu şekilde ilerleyip "deb" paketini indirmeliyiz.|---> yakkety/pool/stable/amd64/.https://download.docker.com/linux/ubuntu/dists/yakkety/pool/stable/amd64/ adresinden "docker-ce_17.03.1~ce-0~ubuntu-yakkety_amd64.deb" güncel sürümü indirelim.
Kurulumu tamamlamak için;
sudo dpkg -i docker-ce_17.03.1~ce-0~ubuntu-yakkety_amd64.deb
Bağımlılık hatası alınır ise:
sudo apt-get update
sudo apt-get install -f
Tekrar;
sudo dpkg -i docker-ce_17.03.1~ce-0~ubuntu-yakkety_amd64.deb   
Kurulumu test etmek için;
sudo docker version
sudo docker run hello-world

Docker container kurulumunu tamamladık. İlk olarak internetten bir docker imaj indirmeliyiz. Bunu yapabilmek için sırayla listelediğim komutları çalıştıralım. 
sudo su
Offical Ubuntu sürümler;
docker search --filter=is-official=true ubuntu
docker pull ubuntu docker images
docker run -ti <IMAGE ID> docker run -ti 0ef2e08ed3fa
Ubuntu konteynere terminalden bağlandık. Konteyneri kapatmadan host makinaya dönmek için; Klavye:
(ctrl+p+q) ctrl+p ---> ctrl+q kullanabilirsiniz.
Docker komutları:
    Docker komut kullanımı hakkında 
    docker [option] [command] [arguments]
 
    attach    Çalışan bir konteynere bağlanın
    build     Docker dosyasından bir imaj oluşturma
    commit    Bir değişiklik sonrası imaja kaydetme
    cp        Dosyaları / klasörleri bir konteyner ile yerel dosya sistemi arasında 
kopyala
    create    Yeni bir konteyner oluştur
    diff      Konteyner dosya sistemindeki değişiklikleri incele
    events    Sunucudan gerçek zamanlı etkinlikler alın
    exec      Çalışan bir konteynerde bir komut çalıştır
    export    Bir konteynırın dosya sistemini tar arşivi olarak dışa aktarmak
    history   Bir imajın geçmişini göster
    images    İmaj Listesi
    import    Bir dosya sistemi görüntüsü oluşturmak için içerikleri bir "tar" 
dosyadan içe aktarın
    info      Sistem bilgisi göster
    inspect   Konteyner veya imaj üzerinde düşük düzeyli bilgileri döndürür
    kill      Konteyner işlemini sonlandırır
    load      Tar arşivinden imaj yükleyin
    login     Docker giriş yapın
    logout    Docker'dan çıkma
    logs      Konteyner günlüklerini getir
    network   Docker ağlarını yönet
    pause     Konteyner içindeki tüm işlemleri duraklatın
    port      Konteyner için bağlantı noktası eşlemelerini veya belirli bir yönlendirme 
listesini listeleyin
    ps        Konteyner listesi
    pull      Bir imaj veya Konteynerı çalışma alanına çekmek
    push      Bir imajı veya bir konteyneri uzak sunucuya itme
    rename    Konteyner ismini değiştir
    restart   Konteynerı yeniden başlat
    rm        Bir yada daha fazla konteyneri silme
    rmi       Bir yada daha fazla imajı silme
    run       Bir komutu yeni bir konteynerde çalıştırın
    save      Bir veya daha fazla imajı tar arşivi şeklinde kaydedin
    search    Docker Hub'da imaj arayın
    start     Bir veya daha fazla durdurulmuş konteynerı başlatır
    stats     Konteyner kaynak kullanımı istatistikleri görüntüleme
    stop      Çalışan bir konteynırı durdurur
    tag       Resmi depoya etiketleme
    top       Bir konteynerın çalışan süreçlerini görüntüleme
    unpause   Duraklatılmış bir konteynerda tüm işlemlere devam eder.
    update    Bir veya daha fazla konteynırın yapılandırmasını güncelleme
    version   Docker sürüm bilgisini göster
    volume    Docker yığınlarının yönetimi
    wait      Konteyner bekletme 
Buraya kadar herşey yolunda gitti,kurulum yaptık,imajı çalıştırdık. Şimdi ise bir konteynere ihtiyacımız olan paketleri kurarak kendi imajımızı oluşturmaya sıra geldi. 
Örneğin iş yerinde docker konteyner üzerinde jenkins CI çalıştırmamız istense ayrıca internet bağlantısında problem var docker repolara da ulaşamıyoruz!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ne yapmalıyız?

Benim başıma geldi. Bu istek geldiğinde mesainin bitmesine az kalmıştı, eve gidip uygun bir docker imajı indirdim (Ubuntu 16.04), sonrasında gerekli kurulumları (java 8+tomcat 7+ jenkins.war deploy) yaptım. Bu imajı evdeki makineme kaydettim. Ama bu imajı iş yerine getirmem gerekliydi. Şimdi nasıl imaj hazırlanır ve hazırlanan imaj başka bir makineye nasıl yüklenir konularına değineceğim. Bu işlemleri yapabilmek için aşağıdaki komutları sırası ile çalıştırmalıyız.
docker images
docker save -o /home/mehmet/ubuntu.tar ubuntu
ubuntu.tar dosyasını bir usb belleğe kopyalayıp, docker kurulu olan bir başka makineye kopyaladıktan sonra; docker load -i ubuntu.tar Komutu ile yüklüyoruz. Daha fazla bilgi için : http://stackoverflow.com/questions/23935141/how-to-copy-docker-images-from-one-host-to-another-without-via-repository NOT:Bu arada unutmadan bir imajda değişiklerin kalıcı olabilmesi için kurulum işlemleri sonrası; docker ps docker commit <
CONTAINER ID > image_name docker commit b4154ba90e3c ubuntu-jenkins docker images
Bu "commit"işlemini yapmazsak docker konteyneri kapattığımızda bütün kurulumlar atmosfere karışır ve bir daha da gelmez :) Sonra Ah Vah demeyin...
Son olarak ağır bir docker run komutu ile paylaşıma son vermek istiyorum. Bu komuttan önce yeni bir docker network ağı oluşturup sonrasında yüklediğimiz Jenkins CI konteyneri bu network üzerinden static bir ip adresi ve hostname ile multi port açarak(22 ve 8080) ayrıca jenkins CI imajdaki "/etc/hosts" dosyasınada adres ekleyerek çalıştıracağız.
Docker network ağı oluşturma:
docker network create --subnet=172.18.0.0/16 mocal
ifconfig -a
Network tanımı yaptık bu
172.18.0.0/16 kesmede 65536 ip adresi alınabilir.İsterseniz /24 kesme(256 host) kullanın. Daha fazl bilgi için: http://stackoverflow.com/questions/27937185/assign-static-ip-to-docker-container Herneyse devam ediyorum. İşte Jenkins CI için static ip adres| hostname|/etc/hosts|22ve8080| docker run -h jenkins --net mocal --ip 172.18.0.20 --add-host="mocal01:172.18.0.1" -p 2222:22 -p 81:8080 -ti ubuntu-jenkins /bin/bash Kısaca bu komutu açıklayım. -h hostname --net mocal networkü --ip 172.18.0.20 static ip --add-host="mocal01:172.18.0.1" /etc/hosts dosyasına girdi. -p 2222:22 -p 81:8080 ise konteynerde çalışan ssh servisi host makinanın 2222 portuna yine konteynerde çalışan tomcat servisin 8080 portunu host makinanın 81 portuna yönlendiği, -ti ubuntu-jenkins /bin/bash ise ubuntu-jenkins konyetnere terminal ile bağlan demek. Konteyner çalıştıktan sonra service ssh start && /opt/tomcat/bin/.catalina.sh start komutları ile servisleri başlatalım.
Jenkins ve ssh servisleri kontrol edelim.

Jenkins web arayüz
  Dış dünyadan ssh ile docker Jenkins CI konteynere bağlantı
Host üzerinde ssh ile bağlantı:
Docker hub url : https://hub.docker.com/r/mehmetocal79/ubuntu/
Bir paylaşımında sonuna geldik, görüşmek üzere;
Saygılarımla.


Mehmet ÖCAL 2017