Host Üzerinde Çalışan MySql Servisine Docker Container’dan Ulaşmak

Uygulamalarımızı artık, docker’ın hayatımıza girmesiyle birlikte, container teknolojileri üzerine tasarlamaya başladık. Microservice yaklaşımını kullanarak, uygulamalarımızı birbirinden bağımsız, yönetilebilir parçalara ayırarak geliştiriyoruz. Docker Container’lar bu yaklaşımın en önemli bileşenlerinden birisidir.

Zaman zaman ortaya çıkan ihtiyaçlardan biriside, özellikle geliştirme ortamında, container içerisinden host bilgisayarda çalışan servislere örneğin MySql veritabanına erişebilmektir. Kendi servislerimize yaptığımız gibi veritabanını da bir container içerisinden kullanabiliriz. Fakat bu yaklaşım her zaman uygun bir seçenek olmayabiliyor. Böylesi durumlarda da veritabanına bir şekilde erişmek gerekiyor. Nasıl erişilebileceğini görmek için hem bir docker hem de bir docker-compose örneği yapacağız.

İlk olarak MySql üzerinde myuser diye bir kullanıcı tanımlayıp, yetki veriyoruz. Aşağıdaki şekilde yetki vermezsek, erişim hataları alacağız.

create user 'myuser'@'%' identified by 'test123';

GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' WITH GRANT OPTION;

flush privileges;

Komut satırında (powershell) docker run komutunu add-host parametresi ile çağıralım. Imaj olarak docker hub üzerindeki resmi mysql imajını kullanıyoruz:

docker run -it --add-host mysqldb:192.56.1.20 mysql mysql -h mysqldb -u myuser -ptest123

Gönderdiğimiz 192.56.1.20 değeri kendi lokal bilgisayarımızın (host) ip’sini ifade ediyor.

Ip değerini de basitçe şöyle alabiliriz (Powershell):

$ip=get-WmiObject Win32_NetworkAdapterConfiguration|Where {$_.Ipaddress.length -gt 1} 
$ip.ipaddress[0] 

Linux ortamında da benzer şekilde ip değerini aşağıdaki gibi gönderebiliriz.

 docker run -it --add-host mysqldb:$(ip addr show docker0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1) mysql mysql -h mysqldb -u myuser -ptest123

Böylece mysql’e bağlandık ve sql komutlarını çalıştırmaya başlayabiliriz.

docker-compose

docker-compose ile de aynı strateji uygulayabiliriz. Bir docker-compose.yml dosyası hazırlayalım:

version: '3'

services:
  mysqldb:
    environment: 
      - LOCALHOST
    image: mysql:latest
    command: mysql mysql -h mysqldb -u myuser -ptest123
    extra_hosts: 
      - "mysqldb:$LOCALHOST"

İmajımız resmi mysql imajı olmak üzere komut satırından (powershell) LOCALHOST ortam değişkenini atıyorum:

$ip=get-WmiObject Win32_NetworkAdapterConfiguration|Where {$_.Ipaddress.length -gt 1}
$env:LOCALHOST=$ip.ipaddress[0]

Linux üzerinde çalışıyorsak, ortam değişkenini aşağıdaki şekilde atıyoruz:

export LOCALHOST=$(ip addr show docker0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1)

Bu şekilde LOCALHOST ortam değişkenini set etmiş olduk.

docker-compose up

komut satırından docker-compose up diyerek işlemimizi başlatabiliriz.

docker-compose run ile mysqldb servisine bağlanarak mysql üzerinde işlem yapalım.

docker-compose run mysqldb mysql -h mysqldb -u myuser -ptest123

mysql üzerinde show schemas komutunu artık çağırabiliriz.

CircleCI ortamında MySql’e Bağlanmak

CircleCI Nedir?

CircleCI, kullanımı gittikçe yaygınlaşan bir sürekli entegrasyon (continuous integration) ve sürekli teslim (continuous delivery) platformudur.

Kodları commit eder etmez, Github’dan veya Bitbucket’tan kodları otomatik olarak çekip derleyebilen, testleri çalıştırabilen bir servis. Güzel olan tarafı, açık kaynak projeleri için ücretsiz paralel build çalıştırabilmesi, diğer özel projeler içinde yine sınırsız sayıda fakat aynı anda tek build çalıştırabilmesidir. Sorun çıkınca da ssh ile bağlanıp, hatayı giderme imkanı vermektedir.

CircleCI, pek çok proje tipini otomatik olarak derleyebilmektedir. Fakat CircleCI’ın build işini özelleştirmek istediğimiz zaman circle.yml diye bir dosya oluşturup, ayarlarımızı buraya girmemiz gerekiyor.

CircleCI üzerinde de pek çok servis, geliştiricilerin kullanımına sunulmak üzere, hazır kurulu gelmektedir. MySql’de bunlardan birisi. Bu servise erişmek için, daha önce uyguladığımız yöntemi burada da uyguluyoruz.

machine:
  pre:
    - curl -sSL https://s3.amazonaws.com/circle-downloads/install-circleci-docker.sh | bash -s -- 1.10.0
  services:
    - docker

test:
  pre: 
    - echo "bind-address = 0.0.0.0" | sudo tee -a /etc/mysql/my.cnf
    - sudo service mysql restart    
    - mysql -u ubuntu -e "CREATE USER 'ubuntu'@'%'"
    - mysql -u ubuntu -e "GRANT ALL PRIVILEGES ON *.* TO 'ubuntu'@'%' WITH GRANT OPTION"
  post:
    - docker run -e NODE_ENV="circleci" --add-host mysqldb:$(ip addr show docker0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1) -p 3000:3000 onbirkod/mywebapp:$CIRCLE_SHA1 mysql -u ubuntu -e "show schemas"

CircleCI üzerinde çalışan MySql’e container üzerinden erişmek için, öncelikle mysql ayar dosyasını değiştirmemiz gerekiyor.

echo “bind-address satırı ile başlayan kısımda, mysql’e her taraftan bağlanılabilmesine izin vermiş oluyoruz. Bu ayarı yaptıktan sonra, veritabanını tekrar başlatıyoruz. Herhangi bir host üzerinden bağlanabilen yeni bir ubuntu kullanıcısı oluşturup, yetkilerini veriyoruz.

Böylece veritabanına bağlanarak işlemlerimizi gerçekleştirebiliriz.

 

 

 

Yorum Gönder

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Scroll to Top