dersblog

Docker

Docker bir sanal makina teknolojisi. MacOs üzerinde Ubuntu, Ubuntu üzerinde Windows, envai türden sanal makina işletebilmek için kullanılabilir.

Docker ile paylaşmak istediğimiz herhangi bir programı artık ona gereken tüm işletim sistemi destek programları ile beraber paketleyip sunabiliriz. Bir servis için filanca python paketleri gerekiyor bunları python paket listesiyle sunabilirdik. Ya peki apt-get ile kurulması gereken yan programlar, hatta yan dosyalar, diğer büyük programlar da varsa? Docker tüm bunları paketleyebilir.

Bizim şirkette sürekli Docker sözü duyuluyor, "abi vs programı işletmem gerekiyor onun Docker imajı neredeydi?", ya da "Docker'i aldım işlettim, hangi makina üzerinde işleteyim". vs. Yani program kurmaktan bahsetme kalmadı, kurulmuş, hazır programların Docker imajı olarak paylaşılması konuşuluyor.

Çoğunlukla bir sistem Dockerfile dosyası üzerinden kuruluyor, bu Dockerfile için gereken imajlar (Ubuntu gibi) bilinen referans noktalardan indiriliyor. Fakat kendimiz bir docker imajı kaydedip onu paylaşabilirdik.

https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-18-04

sudo apt install apt-transport-https ca-certificates curl software-properties-common

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"

sudo apt update

apt-cache policy docker-ce

sudo apt install docker-ce

docker --version

isliyor olmali (basa her zaman sudo koymak gerekebilir). Basit kontrol

docker run hello-world

Altta bir web servisi isletmenin yolu

docker run -d -p 80:80 --name webserver nginx

Tarayıcı ile localhost ziyaret edince orada bir servis işlediğini göreceksiniz! Alttaki komut mevcut sanal makinaları / kapları (container) gösterir,

docker container ls

Sanal makinayi durdurmak icin

docker container stop webserver

Silmek

docker container rm webserver
docker image rm nginx

Simdi Mac uzerinde Ubuntu kuralim. Docker sitesinde onceden hazirlanmis bir Ubuntu kurulumu var,

docker run -it --name ubuntu ubuntu:xenial bash

docker exec -it ubuntu bash

Bu komut bizi işleyen bir Ubuntu içine taşır! Bu izole bir sanal makina, orada yapılan hiçbir şeyin "dış" sisteme etkisi yok.

Sistem icinde

apt-get update

Sonra mesela C derleyicisi kurabiliriz,

Mesela apt-get install gcc

Python kuralim,

apt-get install python python-pip python3 python3-pip

Ubuntu versiyon

cat /etc/*release

16.04 dedi.

Kopyalama (Dışarıdan içeri)

MacOS'ten sanal makina Ubuntu'ya dosya kopyalamak icin, docker container ls ile listelenen container id (kimlik) alinir, ve

docker cp [YEREL DOSYA] [CONTAINER KIMLIK]:/

Mevcut imajlari listelemek,

docker image ls

Silmek icin

docker image rm [IMAGE ID]

Eğer hata gelirse (container [ID] hala silinmemiş diye) docker container rm ile container silinir, sonra image silinir.

Şimdi üstteki örnekte iskelet bir kap yarattık ve o sanal makinaya girip orada komutlar işlettik. Acaba tek bir komutla üstteki her programı kurduramaz mıyız? Dockerfile yaklaşımı ile evet.

Bir Dockerfile icinde alttakileri yazalim,

```` FROM ubuntu:16.04 RUN apt-get update RUN apt-get install -y python python-pip RUN apt-get install -y python3 python3-pip RUN pip install virtualenv RUN virtualenv -p /usr/bin/python2 pyenv2 RUN /bin/bash -c "source /pyenv2/bin/activate && pip install ipython pandas && deactivate"


apt-get komutuna -y vererek y/n sorusuna otomatik y cevap vermis
oluyoruz, bunu yapmazsak apt-get soru sorup cevap bekliyor, biz
otomatik kurulum yaptigimiz icin bu takilmayi istemiyoruz.

Simdi imaji yaratalim,

docker build -t ubuntu_image .


Bu kadar. Listeleyelim,

docker image ls


REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu_image latest cf7c904f9a65 47 seconds ago 675MB ubuntu 16.04 b9e15a5d1e1a 7 days ago 115MB


Simdi sanal makinaya girelim,

docker run -it --name ubuntu2 ubuntu_image bash ```

Kurduğumuz tüm programların hazır bizi beklediğini göreceğiz.

Zihin egzersizi: Docker ile izole bir makina kurulumu yaratmış olduk. Ama üstteki örnekte bu sanal makinada bir de sanal Python ortamı yarattık, aslinda tum Python paketlerini global Python icin kurabilirdik. Sanal ortama gerek var mıydı? Gerek olmayabilir. Fakat virtualenv ile çalışmaya alıştıysak, ve sanal makina bile olsa onun üzerinde de farklı Python derleyicileri kullanma olasılığı olduğu için, yine de virtualenv kullanmakta sakınca yok.

Not: Usttte MacOS üzerinde Ubuntu örneği gösterdik. Docker sanal makina işleticisi bir mikroişlemciyi de mi (mesela Intel) sanal olarak işletiyor? Buna gerek yok, altta kullandığımız makina bir MacBook Pro 3,1 GHz Intel Core i7, yani Intel işlemcisi var, yani mikroislemci komutlarini cevirmeye gerek yok. Makina / ikisel kod olduğu gibi MacOS'in mikroişlemcisinde işletebilir.

https://stackoverflow.com/questions/44480740/how-to-save-a-docker-container-state

https://docs.docker.com/develop/develop-images/dockerfile_best-practices/

https://stackoverflow.com/questions/23935141/how-to-copy-docker-images-from-one-host-to-another-without-via-repository

https://www.howtoforge.com/tutorial/how-to-create-docker-images-with-dockerfile/

https://stackoverflow.com/questions/48561981/activate-python-virtualenv-in-dockerfil


Yukarı