Kısaca Docker
Bu yazının amacı, docker komutlarından bahsetmek ve kısaca ne anlama geldiklerini açıklamak.
Docker’ı bilgisayarınıza kurduktan sonra root olmanız gerekiyor. sudo su
komutunu girip root olduktan sonra systemctl start docker
komutuyla docker servisini başlatıyoruz.
Örnek: Wordpress + Mysql
Şimdi bir örnek ile hub.docker.com üzerinden image çekelim ve container oluşturalım. docker search wordpress
hub.docker’da wordpress image’larını listeledik.docker pull wordpress
ile wordpress image çektik.docker pull mysql
ile mysql image çektik.
Şimdi mysql için container oluşturalım,docker run -d --name container_ismi -e MYSQL_ROOT_PASSWORD="" mysql
run; container oluşturmak için girilir.
-d ; container arka planda da çalışmaya devam etsin diye parametreyi girdik.
name; oluşturulan container için isim girmemizi sağlıyor (mysqlcon dedim).
-e MYSQL_ROOT_PASSWORD=” ” ile parola giriyoruz.
mysql; son olarakta bu container oluşurken kullanılacak image’ı belirtiyoruz.
Şimdi wordpress için container oluşturalım,docker run -d --link mysqlcon:mysql -p 8080:80 wordpress
link; bu iki containerın birlikte çalışmasını sağlar.
-p; ile çalışacak port bilgisini verdik.
(Container ismi belirtmediğimiz zaman docker kendisi bir isim atıyor.)
Tarayıcınızda localhost:8080 yazarsanız wordpressin ayakta olduğunu göreceksiniz.
Komutlar
docker ps
ile çalışan containerları listeleyebiliriz.docker ps -a
ile çalışan çalışmayan tüm containerlar listelenir.docker images
ile çektiğimiz imagelar listelenir.
Burada container ve image listeleme komutları farklı olduğu için sonraki sürümlerde buna bir düzenleme getirilmiş. Güncel listeleme komutları şöyle;docker container ls
docker image ls
Containerlar üzerinde işlem yapmak için, verilen id veya isim kullanılabilir.docker logs container_ismi veya container_id
docker logs container_ismi
ile loglara bakarak hata analizi yapılabilir.docker stop container_ismi
bu komutla çalışan bir container durdurulabilir.docker start container_ismi
ile başlatılabilir.docker stop container_ismi && rm container_ismi
komutu ile bir container durdurulup silinebilir. Docker, containerlar durdurulmadan silinmesine izin vermez. docker rm -f container_ismi
ile çalışır durumda olan containerı zorla sildik. docker rm -f $(docker ps -aq)
komutu ile tüm containerlar silinir.
docker rmi image_ismi
rmi komutu ile de image silebiriz.docker rmi $(docker images)
ile tüm imagelar silinir.
Image Oluşturma
Şimdi kendi imagemizi oluşturalım. Bunun için bir image çekip ondan container oluşturacağız. Oluşturduğumuz container içinde işlemler yapıp bunu image haline getireceğiz. Son olarak bunu hub.docker.com hesabımıza yükleyeceğiz.
hub.docker hesabınıza girip, create repository seçeneği ile reponuza isim verin. Yükleyeceğimiz ortamı hazırlamış olalım.
Konsol ekranında;docker run --name ubuntum -i -t ubuntu
ile ubuntu imagenı kullanarak ubuntum adında bir container oluşturduk (Eğer ubuntu image yoksa run komutu image çeker sonra container oluşturur).
-i ve -t parametrelerini container içine erişebilmemiz için kullanıyoruz (-it şeklinde beraber kullanılabilirler).
docker exec -it ubuntum bash
komutu ile container içine girdik.apt-get update
ile güncelleme yaptık.apt-get install nano
ile nano kuralım.
Gördüğünüz gibi burda kullandığımız komutlar tamamıyla terminal komutları. Burada dilediğiniz dizinde bir klasör oluşturabilir, dosya açabilirsiniz. Burda istediğiniz işlemleri yaptıktan sonra,exit
komutu ile container içinden çıkın.
Şimdi image oluşturalım;
Burada image için vereceğimiz ismi hub.docker repo ismiyle aynı verelim. benimki, hadeyici/deneme olacak.docker commit -a "Hatice Ergün <haticergun5295@gmail.com>" ubuntum hadeyici/deneme
burada -a ile (author) kişinin bilgisini giriyoruz. Sizin imagenizi kullanan biri sorun yaşadığında size ulaşabilmesi için mail adresini de ekliyoruz. docker image ls
ile listede, oluşturduğunuz image görünecektir.
Bunu hub.docker hesabına atalım;docker login
ile giriş yapıp kullanıcı adınızı ve şifrenizi girin.docker push hadeyici/deneme
ile oluşturduğum image repoma gitmiş oldu.
Şimdi docker üzerinde image silip repomuzdan çekelim;docker rmi hadeyici/deneme
kendi repomuzdan image kullanarak container oluşturduk.
docker image ls
docker run -d -it hadeyici/denemedocker image ls
- Eğer oluşturduğunuz image ismi ile hub.docker hesabınızdaki reponun ismi aynı değilse;
docker tag image_ismi hubhesapadı/repoismi
docker push hubhesapadı/repoismi
Yereldeki çalışma ortamını container ile bağlama
docker run -d -p 80:80 --name php-apache -v "$PWD":/home/hadeyici/Desktop/Sunucum/Proje -v /home/hadeyici/Desktop/Sunucum/Proje:/var/www/html php:7.0-apache
php-apache adında bir container oluşturuyorum. 80 portundan çalışacak ve php:7.0-apache image kullanarak oluşacak. Benim yereldeki Proje adındaki klasörüm ile php-apache containerı bağlanacak.
Bu bağlanmayı sağlayan -v (valume) parametresi.
Bu bağlanma sayesinde, ben yerel makinamda proje içerisinde ne değişkliği yaparsam yapayım container içinde de bu değişiklik gerçekleşecek. Aynı şekilde container içinde çalışırken de yerel makinamda değişiklik otomatik olmuş olacak.
Dockerfile
Image oluşturma işlemini biraz daha kısa yoldan yapmak için Dockerfile kullanılıyor. Image oluşturmak için gerekli komutları Dockerfile dosyasına ekliyoruz. Sonrasında docker build -t image_ismi . komutu ile image oluşmuş oluyor.
Dockerfile dosyasını kendimiz oluşturuyoruz. Kullanacağınız image için hub.docker sitesinde ilgili image sayfasında Dockerfile içine yazmanız gereken komutlar mevcut. Her image için farklı komut dizisi var.
Docker Compose
Gerekli ortamı biraz daha kısa yoldan oluşturmak için Compose kullanılıyor. Tek tek image indirip daha sonra onlardan container üretmek ve birbirlerine bağlamak için uzun işlemler yapmak yerine, docker-compose.yml dosyası oluşturulur.
Bu dosya içerisine gerekli komutlar yazılır. Sonrasında docker-compose up komutu ile ortam oluşmuş olur. Image ve containerlar bu dosya içerisindeki komutlar ile tek seferde kurulmuş olur.
İyi çalışmalar.
Kaynaklar:
https://docs.docker.com/
https://medium.com/monitisemea/docker-serisi-4-docker-compose-cfc51b6b455
http://www.gokhansengun.com/docker-ipuclari-soru-ve-cevaplar-bolum-1/
https://www.youtube.com/watch?v=DGVxpFeV16M
https://www.youtube.com/watch?v=isbsABbZghs&list=PL_Z0TaFYSF3LTfMIRjPUlVoUipQA0JlL2