Merhaba;
“Docker” ile ilgili daha önce yazdığım aşağıdaki makaleleri sizlerle paylaşmıştım.
https://asiyeyigit.com/docker-bolum-6/
https://asiyeyigit.com/docker-bolum-5/
https://asiyeyigit.com/docker-bolum-4/
https://asiyeyigit.com/docker-bolum-3/
https://www.linkedin.com/pulse/docker-b%C3%B6l%C3%BCm-2-asiye-yigit/
https://www.linkedin.com/pulse/docker-asiye-yigit/
Bu yazımda “Docker” ile ilgili tüm bu dökümanlarda yazdıklarımı elbette yeni eklemelerle geliştirmeyi ve daha anlaşılır kılmayı hedefliyorum. “zero” isimli Red Hat 7.4 sistemini bu çalışma için kullanacağız.
[root@zero ~]# uname -a
Linux zero 3.10.0-693.1.1.el7.x86_64 #1 SMP Thu Aug 3 08:15:31 EDT 2017 x86_64 x86_64 x86_64 GNU/Linux
[root@zero ~]#
[root@zero etc]# more redhat-release
Red Hat Enterprise Linux Server release 7.4 (Maipo)
[root@zero etc]#
Sistem üzerinde “docker” ve “docker-compose”u ayrı olarak kurduk. Kurulum adımlarını aşağıdaki şekilde paylaşmak istiyorum.
yum update
sudo tee /etc/yum.repos.d/docker.repo << ‘EOF’
yum install docker-engine
docker run –rm hello-world
komutlarıyla docker kurulumunu yaptık ve ardından “docker” ‘ın çalıştığından emin olduk. Aşağıdaki adımlarla da “docker-compose” u kurmuş olduk.
sudo yum install epel-release
wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -ivh epel-release-latest-7.noarch.rpm
sudo yum install -y python-pip
sudo pip install docker-compose
sudo yum upgrade python*
Sistem üzerinde, “docker”, “docker-compose” ve “docker-machine” sürüm bilgilerini kontrol edelim.
[root@zero etc]# docker version
Client:
Version: 17.05.0-ce
API version: 1.29
Go version: go1.7.5
Git commit: 89658be
Built: Thu May 4 22:06:25 2017
OS/Arch: linux/amd64
Server:
Version: 17.05.0-ce
API version: 1.29 (minimum version 1.12)
Go version: go1.7.5
Git commit: 89658be
Built: Thu May 4 22:06:25 2017
OS/Arch: linux/amd64
Experimental: false
[root@zero etc]#
[root@zero etc]# docker-compose version
docker-compose version 1.17.1, build 6d101fb
docker-py version: 2.6.1
CPython version: 2.7.5
OpenSSL version: OpenSSL 1.0.1e-fips 11 Feb 2013
[root@zero etc]#
Sistem üzerinde şu an sadece, “docker” ı test etmek amacıyla kullandığımız, “docker run –rm hello-world” komutunun çıktısı olarak “hello-world” imajını görüyoruz. Sistem üzerinde henüz herhangi bir “container” olmadığını görüyoruz.
[root@zero docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest f2a91732366c 10 days ago 1.85kB
[root@zero docker]#
[root@zero ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@zero ~]#
Sistem üzerine “docker-machine”’de yükleyelim. “docker-machine” ve “docker-engine” arasındaki farkı aktaracağım.
[root@zero ~]# curl -L https://github.com/docker/machine/releases/download/v0.13.0/docker-machine-`uname -s`-`uname -m` >/tmp/docker-machine &&
> chmod +x /tmp/docker-machine &&
> sudo cp /tmp/docker-machine /usr/local/bin/docker-machine
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 617 0 617 0 0 140 0 –:–:– 0:00:04 –:–:– 158
100 25.3M 100 25.3M 0 0 935k 0 0:00:27 0:00:27 –:–:– 2289k
[root@zero ~]# docker-machine version
docker-machine version 0.13.0, build 9ba6da9
[root@zero ~]#
“docker-machine”, bize pek çok farklı Linux üzerinde docker host oluşturmamızı ve yönetmemizi sağlar. Aynı zamanda Windows ve Mac üzerinde de “docker” çalıştırmamıza imkan sağlar.
Senaryo 1: Windows ve Mac üzerinde docker çalıştırmak isterseniz “docker machine” ihtiyaç vardır.
Senaryo 2: “Docker machine”, birden fazla host üzerinde docker host yapılandırmak için de kullanılır.
Daha önceki yazılarımda da ifade ettiğim gibi, “docker engine”, Linux sistem üzerinde çalışır. Eğer sizin lokal bir Linux sisteminiz varsa ve “docker” çalıştırmak istiyorsanız “Docker Engine”’i Linux sistemine yüklemeniz yeterlidir. Biz daha önceki tüm pratik çalışmalarımızı “terry” isimli Red Hat 7 üzerine “Docker Engine” yükleyerek yapmıştık. Diğer taraftan network’ünüz üzerinde, bulut üzerine birden fazla “docker” host oluşturmak için, “Docker Machine”e ihtiyacımız vardır.
İnsanlar, “Docker” dediklerinde bizim anlamamız gereken “Docker Engine” dir. “Docker- Engine”, bir istemci-sunucu uygulamasıdır. “Docker daemon”, REST API ve komut satırı arabiriminden oluşur. “Docker Engine”, “docker” komutlarını (docker ps, docker images gibi) komut satırından kabul eder.
“Docker Machine” ise, “docker host” ları oluşturmak ve yönetmek için kullanılır. Genellikle, lokal host üzerine yüklenir. “Docker Machine” nin “docker-machine” komut satırı istemcisi ve “Docker Engine” istemcisi (docker) vardır. “Docker machine”, bir veya birden fazla sistem üzerine “Docker Engine” yüklemek için kullanılır.
“Docker Machine” nin, AWS, DigitalOcean, Azure, Google Compute Engine, Rackspace, OpenStack, Virtualbox, Vmware Fusion, Vmware vSphere, Hyper-v için sürücüleri vardır.
Yine önceki yazılarımda, “image” ve “container” farkı üzerinde durmuştum. İmajları (images), uygulamanızı depolayabildiğiniz ve taşıyabildiğiniz yapılar olarak düşünmeniz doğru olur. Konteynerleri (container) ise uygulamanın çalıştığı zamanki hali olarak düşünmek gerekir. İmajlar sadece okunabilirdir. Konteynerlar üzerinde değişiklikle yapılabilir. Yani konteynerlar okunabilir ve yazılabilirlerdir.
“Docker” akışından yine bahsetmiştik. İmajları, “docker pull” komutuyla “Docker Container Image Registry”den indirebildiğimiz gibi, bir “Dockerfile” oluşturarak, “docker build” komutuyla kendi imajımızı oluşturabilir ve arzu edersek oluşturduğumuz imajı paylaşabiliriz.
“zero” isimli “docker host” makinemize “Docker Hub” dan “MySQL” imajını alalım. Bu amaç ile kullandığımız komut “docker pull mysql”.
[root@zero ~]# docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
85b1f47fba49: Pull complete
5671503d4f93: Pull complete
3b43b3b913cb: Pull complete
4fbb803665d0: Pull complete
05808866e6f9: Pull complete
1d8c65d48cfa: Pull complete
e189e187b2b5: Pull complete
02d3e6011ee8: Pull complete
d43b32d5ce04: Pull complete
2a809168ab45: Pull complete
Digest: sha256:1a2f9361228e9b10b4c77a651b460828514845dc7ac51735b919c2c4aec864b7
Status: Downloaded newer image for mysql:latest
[root@zero ~]#
[root@zero ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest f2a91732366c 2 weeks ago 1.85kB
mysql latest 5709795eeffa 4 weeks ago 408MB
[root@zero ~]#
İşlem sonrası, “mysql” imajının geldiğini görüyoruz.
[root@zero ~]# docker run –name gan-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql
8c48eb14f989a27e1f82c991042292413594dfda991b97319fa3af7d568aa228
Yukardaki komut sonrası, gan-mysql konteyner oluştu.
[root@zero ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8c48eb14f989 mysql “docker-entrypoint…” About a minute ago Up 42 seconds 3306/tcp gan-mysql
[root@zero ~]#
[root@zero ~]# docker exec -it gan-mysql bash
root@8c48eb14f989:/# uname -a
Linux 8c48eb14f989 3.10.0-693.1.1.el7.x86_64 #1 SMP Thu Aug 3 08:15:31 EDT 2017 x86_64 GNU/Linux
root@8c48eb14f989:/#
“gan-mysql” konteynera login olduk.
root@8c48eb14f989:/# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.20 MySQL Community Server (GPL)
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.
mysql>
mysql> create database gandb;
Query OK, 1 row affected (0.00 sec)
mysql>
mysql> use gandb;
Database changed
mysql> select database();
+————+
| database() |
+————+
| gandb |
+————+
1 row in set (0.00 sec)
mysql>
mysql> show tables;
Empty set (0.00 sec)
mysql>
Elbette size “mysql” anlatmayacağım ama göstermek istediğim, dakikalar içerisinde “mysql” sistemini oluşturabildik ve ihtiyaç duyduğumuz veritabanı işlemlerini yapmaya başladık.
“Docker compose” kavramını yine ilk yazılarımızdan hatırlayalım. Eğer birden fazla uygulama varsa, bu uygulamaların birbirine bağımlılıkları varsa, “Dockerfile” kullanmak işlerimizi oldukça zorlaştırır. Bu durumda “docker-compose.yml” dosyasını kullanmak doğru olur. Bu dosyada uygulamalarımızı, servislerimizi, servisler arası bağlantıyı, kullanılacak network tanımlarını yapabiliriz. Ardından tek bir komutla bu dosya olan konfigürasyonun gerçekleşmesini sağlayabiliriz. Aşağıdaki şekilde örnek bir “docker-compose.yml” dosyasını görebiliriz. Dosyada web ve redis servislerini görüyoruz. Web servisinin “links” ile redis servisine olan bağlantısını tanımlayabiliriz.
Dağıtık yapıda uygulamaları “container” yapılarda çalıştırmamız gerektiğini düşünelim. Örneğin web sunucunun farklı bir fiziksel host üzerindeki konteynerde, database’in farklı bir fiziksel host üzerindeki konteynerde, uygulamanın farklı bir fiziksel host üzerindeki konteynerde çalışmasını isteyebiliriz. “Docker swarm” öncesi aşağıdaki gibi bir yapı kurgulamak durumundaydık.
“Docker swarm” sonrasında; docker ajanlarını gruplayarak tek bir “virtual docker” ajan olarak çalıştırabiliriz. “Docker swarm” bu fonksiyonu sağladığı “cluster” özellikleri sayesinde yapabilir.
“Docker swarm” da manager ve worker node’lar vardır. “High availability” için aşağıdaki şekilde görüldüğü gibi birden fazla manager node olabilir.
Konteyner orkestrasyon aracı olarak Kubernetes’den de bahsetmemiz önemli.
Ortamda birden fazla fiziksel makine olacaktır. Bu durumda bir orkestrasyon aracı ile “container” yapısını yönetmek mantıklı olacaktır. Bir orkestrasyon aracından, en azından planlama (“scheduling”), kaynak yönetimi (“resource management”) ve servis yönetimi (“service management”) bekleriz. Aşağıdaki şekiller görsel olarak yapıyı detaylı açıklamaktadır.
Gelecek bölümde, “Docker swarm” ve “Kubernetes” ile ilgili pratik örnekler yapıyor olacağız.
17 Şubat 2018 – Asiye Yiğit
[…] https://asiyeyigit.com/docker-bolum-7/ […]