Tag Archives: Docker

Genel Yazılım ve Sistem Mühendisliği

MySQL ile 5 Dakikada Replikasyon ve Docker Üzerinde Deneme Ortamının Oluşturulması

MySQL veritabanınızın kopyalarını farklı sunuculara dağıtarak okuma işlemlerinden doğan yükü farklı makinelere dağıtabilirsiniz. Replikasyon denilen bu işlemin gerçekleştirildiği yapılarda, okuma işlemi slave denilen çok sayıdaki sunucudan gerçekleştirilebilirken, yazma işlemi yalnızca master denilen ana mysql sunucusuna gerçekleştirilmektedir.MySQL üzerinde replikasyon işlemini gerçekleştirmek son derece basittir. Aşağıdaki işlem basamaklarını gerçekleştirerek siz de varolan veritabanınızın kopyalarını oluşturarak okuma işlemini farklı makinelere dağıtabilirsiniz.

Halihazırdaki MySQL Sunucusunun Master MySQL Sunucusu Olarak Konfigüre Edilmesi

Hali hazırda çalışan MySQL sunucunuzu Master MySQL Server olarak atamak için;

* favori text editörünüz ile /etc/mysql/conf.d/repl.cnf dosyasını olşuturun.

$ sudo vim /etc/mysql/conf.d/repl.cnf

* Aşağıdaki içeriği oluşturduğunuz /etc/mysql/conf.d/repl.cnf dosyasına kayıt edin.

[mysqld]
bind-address	= 0.0.0.0
server-id		= 1
log-bin			= /var/log/mysql/mysql-bin.log

Şayet replikasyon işlemini yalnızca spesifik bir veritabanı için gerçekleştirmek isterseniz aşağıdaki satırı konfigürasyon dosyanıza ekleyebilirsiniz.

	binlog-do-db	= veritabaninizin_adi

* MySQL sunucunuzu yeniden başlatın.

Yukarıdaki konfigürasyonda belrittiğiniz bind-addresstanımı, MySQL sunucusunun hangi IP adresi üzerinden servis portunu dinleyeceğini, server-id tanımı, sunucunun kimliğini ifade eden 2^32 max değerine sahip sayısal değer; log-bin tanımı, master mysql sunucusunun değişiklikleri tutacağı log dosyasını ifade eder.

* MySQL sunucunuza root kullanıcısı ile oturum açın.

	$ mysql --user=root --password=root_kullanicisinin_parolasi

* Replika sunucuların (slave mysql sunucuları) Master MySQL sunucunuza bağlanacağı yeni bir kullanıcı oluşturarak replikasyon yetkisi verin.

mysql> CREATE USER 'repl'@'%' IDENTIFIED BY 'repl_kullanici_parolasi'; 
	   GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

Replikasyon parolasını belirlerken parola uzunluğu ile ilgili güvenlik ilkesini göz önünde bulundurunuz. Aksi halde slave sunucular, master mysql sunucusuna oturum açarken bağlantı hatası alacaklardır.

* Master mysql veritabanınızı kilitleyerek yedek alma işlemi için hazırlık yapalım.

mysql> FLUSH TABLES WITH READ LOCK;
SET GLOBAL read_only = ON;
EXIT

* Aşağıdaki komutu çalıştırarak master mysql sunucumuzdaki tüm veritabanlarının yedeğini alma işlemini başlatalım.

$ mysqldump --user=root --password=root_kullanicisinin_parolasi --lock-all-tables --all-databases > master_mysql.dump

* Oluşturduğumuz veritabanı yedeğini sıkıştırarak slave mysql sunucusu olarak belirlediğimiz sunucuya transfer edelim.

$ tar -czvf /tmp/master_mysql.dump.tar.gz master_mysql.dump
$ scp master_mysql.dump.tar.gz slave_server_ip:/tmp/.

* Kilidi kaldırmak için tekrar mysql konsoluna giriş yapın.

$ mysql --user=root --password=root_kullanicisinin_parolasi

* Aşağıdaki komutları çalıştırarak master mysql sunucusundaki kilidi kaldırın.

mysql> SET GLOBAL read_only = OFF;
UNLOCK TABLES;

* Artık MySQL sunucunumuz kullanıma hazır. Aşağıdaki komutu çalıştırarak master mysql sunucunuzun durumunu görüntüleyi.

mysql> SHOW MASTER STATUS;

Şayet herşey yolundaysa aşağıdaki benzeri bir komut çıktısı ile karşılaşmanız gerekir. Slave Mysql sunucularını kurarken buradaki log dosyasının adı ve pozisyonu gibi bilgilere ihtiyacınız olacaktır.

+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      107 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

Slave MySQL Sunucusu Kurulumu

Yeni bir slave MySQL Server kurmak için;

* Aşağıdaki komutu kullanarak MySQL server kurulumunu gerçekleştirin.

$ sudo apt-get update; \
sudo apt-get install -y mysql-server

Master mysql sunucusundan kopyaladığımız veritabanı yedeğini, slave mysql sunucusuna yükleyelim.

$ cd /tmp
$ tar -zxvf master_mysql.dump.tar.gz 
$ mysql --user=root --password=root_kullanicisinin_parolasi < master_mysql.dump

* Favori text editörünüzle /etc/mysql/conf.d/repl.cnf isimli yeni bir dosya oluşturun.

$ sudo vim /etc/mysql/conf.d/repl.cnf

* Aşağıdaki içeriği /etc/mysql/conf.d/repl.cnf dosyasına kayıt edin.

[mysqld]
bind-address	= 0.0.0.0
server-id		= 2

Yukarıdaki içerik, master mysql sunucunuzdaki ile aynı amaca hizmet eder. server-id parametresi sunucuya spesifik olarak atandığı için ilk slave sunucumuzun sunucu kimliğini 2 olarak atadık.

* Master mysql sunucusu ile ilgili tanımlamaları yapmak üzere mysql konsolunu root kullanıcısı ile çalıştıralım.

	$ mysql --user=root --password=root_kullanicisinin_parolasi

Aşaığdaki komutu çalıştırarak slave sunucumuza, master mysql sunucusunun kim olduğunu gösterelim :)
Buradaki MASTER_LOG_FILE ve MASTER_LOG_POST parametrelerine atanacak değerler, master mysql sunucusunun kurulumu sırasında çalıştırdığınız SHOW MASTER STATUS; komutunun çıktısında yeralan değerler ile aynı olmalıdır.

mysql> CHANGE MASTER TO
MASTER_HOST='master_mysql_sunucusunun_ip_adresi',
MASTER_USER='repl',
MASTER_PASSWORD='repl_kullanicisinin_parolasi',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=107;

Artık hazır olduğumuza göre slave mysql sunucusunun master mysql sunucusuna bağlanmasını sağlayalım.

mysql> START SLAVE;

Aşağıdaki komutu çalıştırarak slave mysql sunucunuzun durumunu kontrol edebilirsiniz.

mysql> SHOW SLAVE STATUS;

Şimdi gelin dilerseniz Docker Compose kullanarak Master/Slave veritabanı replikasyonunu kendi geliştirme ortamımızda deneyelim.

MySQL Replikasyonu İçin Docker Üzerinde Deneme Ortamının Oluşturulması

Öncelikle text editörünüzle docker-compose.yml isimli yeni bir dosya oluşturun.

$ vim docker-compose.yml

Şayet siz de benim gibi vim sever biriyseniz docker-compose un yaml parser ı kızmasın diye tab karakterlerini boşluğa dönüştürmeyi unutmayın.

:set expandtab

Aşağıdaki içeriği yaml dosyasına kayıt edin.

version: "2.0"
services:
    master_mysql:
        container_name: master_mysql
        image: mysql:5.5
        environment:
            - "MYSQL_ROOT_PASSWORD=benim_gizli_root_parlam"
        networks:
            my_network:
                aliases:
                    - "masterdb.mynetwork.net"
                ipv4_address: 10.0.0.2
    slave_mysql1:
        container_name: slave_mysql_1
        image: mysql:5.5
        environment:
            - "MYSQL_ROOT_PASSWORD=benim_gizli_root_parlam"
        networks:
            my_network:
                aliases:
                    - "slavedb1.mynetwork.net"
                ipv4_address: 10.0.0.3
networks:
    my_network:
        driver: bridge
        ipam:
            driver: default
            config:
                - subnet: 10.0.0.0/24
                  gateway: 10.0.0.1

Aşağıdaki komutu çalıştırarak ortamimizi ayaklandıralım. Komutu, oluşturduğunuz yaml dosyası ile aynı dizinde çalıştırdığınızdan emin olun.

$ docker-compose up -d

Buradaki -d parametresi, docker-compose un containerları arka planda çalıştırmasını sağlayacaktır.

Master mysql sunucusunu konfigüre etmeye başlamadan önce, kullandığımız docker imajı normal şartlarda sunucunuza kuracağınız bir mysql sunucusuna göre biraz daha minimal bir konfigürasyona sahip olduğu için mysql loglarının baırndırılacağı klöasörün yaratılması ve yetkielndirilmesi gibi bir iki ufak işlemi başlangıçta manual olarak gerçekleştireceğiz. Normal bir kurulumda bu tarz bir işlem yapmanıza pek gerek olmayacaktır.

$ docker exec master_mysql /bin/bash -c 'mkdir /var/log/mysql; chown mysql:mysql /var/log/mysql'

Hemen master mysql sunucusunun konfigüre edilmesi ile ilgili bölümde belirttiğimiz /etc/mysql/conf.d/repl.cnf dosyasını oluşturarak master_mysql konteynerinin içine kopyalayalım.

$ echo '[mysqld]
bind-address	= 0.0.0.0
server-id		= 1
log-bin			= /var/log/mysql/mysql-bin.log' > repl_master.cnf

Oluşturduğumuz dosyayı master_mysql konteynerine kopyalayalım.

$ docker cp repl_master.cnf master_mysql:/etc/mysql/conf.d/repl.cnf

Aynı şekilde slave mysql sunucumuz için de slave sunucusunun konfigüre edilmesi ile ilgili bölümde anlattığımız biçimde yeni bir konfigürasyon dosyası oluşturarak slave_mysql_1 konteynerinin içine kopyalayalım.

$ echo '[mysqld]
bind-address	= 0.0.0.0
server-id		= 2' > repl_slave.cnf

Oluşturduğumuz dosyayı slave_mysql_1 konteynerine kopyalayalım.

$ docker cp repl_slave.cnf slave_mysql_1:/etc/mysql/conf.d/repl.cnf

Artık konteynerlerimiz replikasyon işlemine hazır olduğuna göre her iki konteyneri de docker-compose marifetiyle yeniden başlatalım.

$ docker-compose restart

Aşağıdaki komutu çalıştırarak mysql konteynerlerinin ayakta olup olmadığını kontrol edin.

$ docker-compose ps

Şayet herşey yolunda ise aşağıdaki gibi bir çıktı ile karşılaşmanız gerekir.

    Name                  Command             State    Ports
--------------------------------------------------------------
master_mysql    docker-entrypoint.sh mysqld   Up      3306/tcp
slave_mysql_1   docker-entrypoint.sh mysqld   Up      3306/tcp

Aşağıdaki komutu çalıştırarak slave sunucumuzun, master mysql sunucusuna bağlanacağı replikasyon kullanıcısını oluşturalım.

	
$ docker exec -i master_mysql mysql --user=root --password=benim_gizli_root_parlam <<< "CREATE USER 'repl'@'%' IDENTIFIED BY 'repl_password'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';"

Slave mysql sunucumuza master mysql sunucusu ile ilgili tanımlamaları gerçekleştirebilmek için master mysql sunucumuzun durum bilgisini görüntüleyelim.

$ docker exec master_mysql /bin/bash -c '/usr/local/mysql/bin/mysql --user=root --password=$MYSQL_ROOT_PASSWORD -e "show master status;"'

Çalıştırdığınız komut, aşağıdakine benzer bir çıktı üretmelidir.

File	Position	Binlog_Do_DB	Binlog_Ignore_DB
mysql-bin.000001	107

Yukarıda, ortam kurulumu sırasında oluşturduğumuz yml dosysından hatırlayacağınız üzere, master mysql sunucunumuzu 10.0.0.2, slave mysql sunucumuz 10.0.0.3 ip adresleriyle adreslemiştik. Bu doğrultuda aşağıdaki komutu çalıştırarak slave mysql sunucumuza, master mysql sunucusunun kim oldğu ile ilgili tanımlamaları gerçekleştirelim.

MYSQL_QUERY="CHANGE MASTER TO "\
"MASTER_HOST='10.0.0.2', "\
"MASTER_USER='repl', "\
"MASTER_PASSWORD='repl_password',"\
"MASTER_LOG_FILE='mysql-bin.000001',"\
"MASTER_LOG_POS=107; "; \
docker exec -i slave_mysql_1 mysql --user=root --password=benim_gizli_root_parlam <<< $MYSQL_QUERY

Artık herşey hazır olduğuna göre slave sunucumuzun master mysql server ile iletişimini başlatalım.

$ docker exec slave_mysql_1 /bin/bash -c '/usr/local/mysql/bin/mysql --user=root --password=$MYSQL_ROOT_PASSWORD -e "START SLAVE;"'

Son olarak bir durum kontrolü yaparak slave sunucumuzun master mysql server ile iletişimi ile ilgili bir sorun olup olmadığını kontrol edelim.

$ docker exec slave_mysql_1 /bin/bash -c '/usr/local/mysql/bin/mysql --user=root --password=$MYSQL_ROOT_PASSWORD -e "SHOW SLAVE STATUS;"'

Şayet herşey yolundaysa aşağıdaki çıktı ile karşılaşıyor olmalısınız.

Slave_IO_State	Master_Host	Master_User	Master_Port	Connect_Retry	Master_Log_File	Read_Master_Log_Pos	Relay_Log_File	Relay_Log_Pos	Relay_Master_Log_File	Slave_IO_Running	Slave_SQL_Running	Replicate_Do_DB	Replicate_Ignore_DB	Replicate_Do_Table	Replicate_Ignore_Table	Replicate_Wild_Do_Table	Replicate_Wild_Ignore_Table	Last_Errno	Last_Error	Skip_Counter	Exec_Master_Log_Pos	Relay_Log_Space	Until_Condition	Until_Log_File	Until_Log_Pos	Master_SSL_Allowed	Master_SSL_CA_File	Master_SSL_CA_Path	Master_SSL_Cert	Master_SSL_Cipher	Master_SSL_Key	Seconds_Behind_Master	Master_SSL_Verify_Server_Cert	Last_IO_Errno	Last_IO_Error	Last_SQL_Errno	Last_SQL_Error	Replicate_Ignore_Server_Ids	Master_Server_Id
Waiting for master to send event	10.0.0.2	repl	3306	60	mysql-bin.000001	329	405c4af91c66-relay-bin.000002	475	mysql-bin.000001	Yes	Yes							0		0	329	638	None		0	No						0	No	00			1

Hemen ufk bir deneme yaparak master mysql sunucusu üzerinde bir veritabanı yaratalım ve yarattığımız bu veritabanını slave mysql server üzerinde oluşup oluşmadığını görelim.

Aşağıdaki komutu çalıştrarak master mysql sunucusu üzerinde test_db isimli yeni bir veritabanı oluşturalım.

$ docker exec -i master_mysql mysql --user=root --password=benim_gizli_root_parlam <<< "CREATE DATABASE test_db;"

Oluşturduğumuz veritabanının slave sunucusunda da oluştuğunu görelim.

$ docker exec slave_mysql_1 /bin/bash -c '/usr/local/mysql/bin/mysql --user=root --password=$MYSQL_ROOT_PASSWORD -e "SHOW DATABASES;"'

Ta-daaaa….

Database
information_schema
mysql
performance_schema
test_db
Genel Yazılım ve Sistem Mühendisliği

Docker İle Geliştirme Ortamınızı Taşınabilir Hale Getirin #1

Yazılım geliştirme ekiplerinin büyük problemlerinden biri de taşınabilirliktir. Eğer yazdığınız yazılımın yeterli/güncel bir kurulum dökümanı yoksa, yazılımı geliştirildiği ortamdan farklı bir ortama taşımak büyük problemdir. Taşınma, geliştirme ortamı ile test/production ortamları arasından olmasının yanında, projenin ekibe yeni dahil olan ekip arkadaşınızın bilgisayarın geliştirme ortamının kurulması da olabilir.

Docker, yazılımınızın tüm sistem paketleriyle birlikte çalışabieceği izole ve taşınabilir ortamlar sağlar. Geliştirme ortamınızı bir docker imajı haline getirerek gerek test/production ortamlarına, gerekse yeni bir geliştiricinin makinesine kolaylıkla taşıyabilirsiniz.

Başlamadan önce bazı temel kavramları netleştirelim:

Temel Docker Kavramları

Imaj (image): Bir yazılımın çalışabilmesi için gerekli sistem bağımlılıklarını ve hatta yazılımın kendisini içeren izole alanın taşınabilir görüntüsüdür. Docker imajları Docker tarafından sağlanan dockerhub.com üzeirnden saklanır. Docker dilediğinizde çalıştığınız ortamdaki imajları tar arşivi olarak yedeklemenize olanak sağlar. Docker imajları katmanlı ve salt okunur bir yapıya sahiptir. Imajların katmanlı yapısı, yeniden kullanılabilirliği sağlamaktadır.

Konteyner (Container): Imajların çalışır durumdaki örnekleridir. Bir imajdan birden fazla konteyner oluşturulabilir. Konteynerler, kendisini oluşturan katmanlı imajın üstüne yazılabilir yeni bir katman oluşturur. Konteyner içinde çalşıan yazılımın gerçekleştirdiği tüm değişiklikler bu katmanda meydana gelir. Konteynerde gerçekleşen değişiklikler imajları değiştirmez.

Konuyla ilgili daha fazla ayrıntı için şu dökümanı inceleyebilirsiniz.

Yeni Bir Docker Konteyneri Oluşturmak

Docker run komutu ile varolan veya docker registry (dockerhub.com) da yeralan docker imajlarından yeni bir container oluşturur. Imaj, şayet docker registry den temin edilmişse container ın çalıştırıldığı dosya sisteminde saklanır ve bir sonraki container oluşturma işleminde dosya sisteminde saklanan imajdan yararlanılır.

$ docker run --name cache_server -d -p 6379:6379 redis:latest 

Unable to find image 'redis:latest' locally


latest: Pulling from library/redis

43c265008fae: Downloading [============>                                      ] 13.09 MB/51.35 MB
2738f760012a: Download complete
a3b2771d56b8: Downloading [=======================================>           ] 12.98 MB/16.61 MB
5d98f21a4432: Download complete
79007f20bee8: Download complete
438fc7d50051: Waiting
5e8f776b71d7: Waiting

Yukarıdaki komutu çalıştırdığınızda docker, redis imajının latest etiketli sürümü için ilk defa container oluşturuyorsanız öncelikle dockerhub.com’da bu imajı arayarak bilgisayarınıza indirir. Indirme işlemi sonuçlandığında ise bu imajdan yeni bir örnek oluşturur.
Komut çıktısından da görebileceğiniz gibi imajı oluşturan tüm katmanlar ayrı ayrı indirilmektedir. Yine yukarıdaki komut çıktısında yeralan “Unable to find image ‘redis:latest’ locally” ifadesi, imajın yerel ortamda bulunamadığını ifade eder. Docker bu nedenle imajı dockerhub.com dan indirmektedir.

Örnekteki parametrelerden biraz bahsedelim.

–name Bu parametre, oluşturulan konteyneri isimlendirmek için kullanılır. Bu parametreyi belirtmediğimiz takdirde docker, oluşturulan konteynere otomatik olarak isim verir.

-d: Bu parametre Daemonize anlamına gelir. Çalıştırılmak istenen konteyneri arka planda çalıştırır.

-p 6379:6379 Çalıştırılan portun 6379 nolu portunu, docker servisinin çalıştığı bilgisayarın 6379 nolu TCP portuna map eder. Parametre değerinde iki nokta işareti(:) ile ayrılmış olan sayısal ifadelerden ilki, host (docker servisinin çalıştığı bilgisayar), ikinci sayısal ifade konteynerin portunu ifade eder. Docker, sanal makinelerden aşina olduğunuz farklı ağ modellerine destek vermektedir. Ancak bu bir giriş yazısı olduğu için burada bu konulara hiç girmeyeceğim.
Aynı host üzerinde barındırılan docker konteynerleri, ekstra bir konfigürasyon yapmadan aralarında sağlıklı iletişim sağlayabilirler. Ancak konteynerlerin farklı sunucularda barındırılması veya docker servisinin linux dışındaki bir işletim sisteminde çalışıyor olması çeşitli routing sorunlarına olabileceğinden, bu gibi durumlarda konteyner portları, ev sahibi bilgisayarın portlarına map edilmelidir.

redis:latest: “Redis” repositorysindeki “latest” etiketi ile etiketlenmiş docker imajını ifade eder.

Dilerseniz gelin biraz önce oluşturduğumuz konteynerin durumuna göz atalım.

$ docker ps -a

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
a30b208e1da2        redis:latest        "docker-entrypoint.sh"   51 seconds ago      Up 51 seconds       0.0.0.0:6379->6379/tcp   cache_server

Docker imajları, varsayılan bir giriş noktası (entrypoint) e sahiptir. Imaj isminden sonra belirtilecek parametre, varsayılan giriş noktasını ezmek için kullanılır.

$ docker run --name cache_server -d -p 6379:6379 redis:latest /bin/bash

Bilgisayarınızda sakladığınız imajların listesini şu şekilde görüntüleyebilirsiniz.

$ docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
redis               latest              74b99a81add5        41 hours ago        182.9 MB
ubuntu              14.04               1e0c3dd64ccd        2 weeks ago         187.9 MB

İki Konteyner Arasında İletişim Kurmak

Docker konteynerleri, siz aksini söylemediğiniz sürece docker tarafından sağlanan dahili bir dhcp sunucusu üerinden IP adresi alırlar. IP adresini bildiğiniz* durumda konteynerlar arasında ileitşim sağlayabilirsiniz. Bunun dışında pratikte containerlar ile ilgili IP bilgilerini konteynerler arasında paylaşmak için –link parametresi kullanılır.

Yeni bir linux container oluşturarak bir önceki örnekte oluşturduğumuz konteyner e bağlayalım. Yapacağımız bu işlem, yeni oluşturduğmuz konteynerde açtığımız bash oturumunda, diğer konteynerdeki redis sunucusuna bağlanmamızı sağlayacak.

$ docker run --name linux_machine1 --link=cache_server:cache -i -t ubuntu:14.04 /bin/bash

Yukarıdaki komutu çalıştırdığınızda docker, ubuntu repositorysindeki 14.04 etiketiyle etiketlenmiş docker imajından linux_machine1 isimli yeni bir konteyner oluşturur. Konteyner açıldığında bash oturumu başlatır. Buradaki -t parametresi pseudo (sözde) terminal ayırmasını ve -i klavyeden yapılan girişlerin konteynere iletilmesini sağlar. Redis sunucusu ile ilgili bağlantı bilgileri, –link parametresi ile cache takma adıyla ortam değişkeni olarak konteynere iletilir.

Gelin, redis konteyneri ile ilgili aktarılan iletişim bilgilerini, yeni açılan konteynerden görüntüleyelim.

root@1e3ffaec27b0:/# env|grep -i cache

CACHE_PORT_6379_TCP_PORT=6379
CACHE_PORT_6379_TCP_PROTO=tcp
CACHE_PORT=tcp://172.17.0.2:6379
CACHE_ENV_REDIS_DOWNLOAD_SHA1=6f6333db6111badaa74519d743589ac4635eba7a
CACHE_ENV_REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-3.2.5.tar.gz
CACHE_ENV_REDIS_VERSION=3.2.5
CACHE_NAME=/linux_machine1/cache
CACHE_PORT_6379_TCP_ADDR=172.17.0.2
CACHE_PORT_6379_TCP=tcp://172.17.0.2:6379
CACHE_ENV_GOSU_VERSION=1.7

Redis sunucusuna erişerek bir iki deneme yapmak için, yeni açtıığımız konteynere redis istemcisi kuralım.

root@1e3ffaec27b0:/# apt-get update; apt-get install -y redis-tools

Haydi redis container e bağlanalım.

root@1e3ffaec27b0:/# redis-cli -h ${CACHE_PORT_6379_TCP_ADDR}

172.17.0.2:6379> SET test-key 1
OK
172.17.0.2:6379> GET test-key
"1"

Konu biraz büyük olduğu için bu yazıyı burada sonlandırıyorum. Bir sonraki devam yazısında kendi docker imajınızı nasıl üretebileceğinizden söz edeceğim.

Genel Yazılım ve Sistem Mühendisliği

Docker’la Daha Taşınabilir Ortamlara Merhaba

Şu sıralar hem benden hem çevrenizden yoğun olarak bir docker muhabbeti duyuyorsunuzdur. Bugün bu blog yazısında sizlere Docker ve docker araçları ile ilgili fikir sağlayacak bazı küçük bilgiler vermeyi amaçlıyorum.

Linux işletim sisteminin çekirdeği, proseslerin gruplanarak yönetilebilmesine olanak sağlar. Böylelikle linux üzerinde koşturan yazılımlar, yalnızca kendisine ait sistem paketlerinin yeraldığı izole alanlarda mutlu mesut çalışabilmektedirler. 2008 yılında hayatımıza giren LXC, Linux’un bu güzelliğini insani seviyeye indirgeyerek sağladığı image ve kaynak yönetimi konseptiyle tek host üzerinde çok sayıda izole alan yaratılmasını kolaylaştırmıştır.

Linux ve LXC nin sağladığ çekirdek sanallaştırma konsepti, bilinen işletim sistemi sanallaştırma konspetinden tamamen farklıdır. İşletim sistemi sanallaştırma konseptinde bilgisayarın üzerinde çalışan ev sahibi işletim sistemi, sanallaştırılmış işletim sistemlerini barındırır. Bu nedenle böyle yapılarda donanom, hem ev sahibi işletim sisteminin hem de diğer sannalştırılmış işletim sistemlerinin rahatça çalışabileceği seviyede yüksek olmalıdır. Çekirdek sanallaştırma konseptinde ise sanallaştırma, kabaca çalışan proseslerin belirli alanlarda gruplanması şeklinde gerçekleştirildiğinden daha az kaynak gereksinimi vardır.

LXC, gelecekte benzer konseptleri farklı bakış açılarıyla sağlayacak olan LXD ve Docker’ın ortaya çıkmasına olanak sağlamıştır.
(Bkz. LXC Wiki Article )

Docker Nedir ?

Docker, linux’un kernel sanallaştırma kütüphaneleri ve lxc kullanarak, işletim sistemi üzerinde, belirli bir yazılımın, gereksinim duyduğu tüm sistem bağımlılıklarıyla birlikte çalışabildiği, kendi ağ kaynaklarına sahip izole ortamlar oluşturulmasına olanak sağlayan bir araçtır. Docker’ı diğer sanallaştırma araçlarından ayıran en can alıcı özelliği dağıtık çalışabilme yeteneğidir. Docker herhangibir ortamda ürettiğiniz konteyneri imajlar vasıtasıyla başka ortamlara taşıyabilmenize olanak sağlar.

Neden Docker ?

Docker, bir yazılımı ihtiyaç duyduğu tüm sistem paketi bağımlılıklarıyla birlikte bir konteyner içine yerleştirebilmenize ve dilediğiniz herhangibir yere taşıyabilmenize olanak sağlar. Yazılım, konteyner halinde deploy edileceği için ortam farklılıkları ile ilgil sorunlar ortadan kalkar.

Konteyner imajları sayesinde ölçeklenmiş ortamlarda sistem paketlerinin kurulması, konfigürasyon, yazılım kurulumu gibi tekrarlayan işlerin bir kerede daha soyut biçimde gerçekleştirilebilmesini sağlar.

Docker, özellikle çok sayıda servis ve mikro servisten oluşan yazılımların taşınabilirliğinde büyük kolaylık sağlar. Docker, Compose ve Swarm gibi araçları sayesinde bir web uygulaması, mysql server, redis/memcache ve çok sayıda mikro servislerden oluşan bir ortamı ister bir geliştiricinin makinesine isterseniz çok sayıda clusterdan oluşan bir ortama kolaylıkla taşımanıza olanak sağlar. Ölüm ve aşk acısı dışında her türlü derde devadır Docker :)

Bir sonraki yazıda kullanım pratikleri konusunda daha detayları bilgileri sizlerle paylaşıyor olacağım.