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