İnfina Blog

Genel Hatları ile Docker

Genel Hatları ile Docker

İnfina Blog’da bu ay Operasyon ve Sanallaştırma Uzmanımız Alper Arınç, developerlar, BT sektöründe çalışanlar ve Devops tarafına yeni başlayanlar için “Genel hatları ile Docker, Docker Compose ve Dockerization” başlıklı yazıyı kaleme aldı.

Docker

Neden Docker?
Bu sorunun cevabı yazılım sektöründeki alanlara göre değişiklik gösterse de temel avantajı, hızlı deploy edilmesi, işletim sistemi bağımsız daha taşınabilir olmaları, büyük yapıları birbirinden bağımsız mikro yapılar haline getirebiliyor olmasıdır.

Peki Konteyner Nedir?
Konteyner, bir uygulamanın ihtiyaç duyulan tüm bağımlılıklar, kütüphaneler ve diğer dosyaların birlikte paketlenerek standart hale getirilmesidir. Konteyner üzerinde çalıştırmak istediğimiz uygulamanın, çalışabilmesi için ihtiyaç duyulan tüm bağımlılıkları, SSL kütüphanelerini, DLL dosyaları, uygulama kodları ve konfigurasyon dosyalarının tamamını içinde barındırması gerekmektedir. Docker’in avantajlarından bir tanesi, aynı uygulamanın birden fazla versiyonunu aynı sunucu üzerinde birinden bağımsız bir şekilde çalıştırabilmektir. Bu, Dockerın sterilizasyon özelliği sayesinde yapılabilmektedir. Sterilizasyon, çalıştırdığımız uygulamanın dış dünya ile bizim verdiğimiz bağlantılar dışında hiçbir bağlantısının olmamasıdır. Aynı zamanda istediğimiz herhangi bir ortama taşınmasını sağlamaktadır. Çünkü nerede taşımak istenilirse bütün bağımlılıklar ve çalışmak için ihtiyaç olan bütün dosyalar da beraberinde gelecektir. Linux temelli bir teknoloji olduğundan dolayı Linux işletim sistemleri üzerinde kullanımı tercih edilmektedir. Windows ve Mac Os üzerinde Docker Desktop ile kullanımı mümkündür. Kaynak kullanımı konusunda verimli olması, Docker’in avantajları arasındadır.

Aynı sunucu üzerinde sterile ve bağımsız birden fazla konteyner çalıştırabildiğinden, her uygulama için bir sunucu kurulumu yapmak zorunda kalınmamaktadır. Tek sunucu üzerinde birden fazla konteyner çalıştırılarak yönetim konusu başta olmak üzere pek çok konuda kolaylık sağlandığını söylemek mümkündür. Diğer türlü her uygulama için bir işletim sistemi kurulumu gibi bir maliyet ve iş yükünü çıkacaktır. Bu sistemlerin bakımları, güvenlik yamaları ve güncellemeleri birçok iş yük doğuracaktır.

Docker Compose

Compose, çok kapsayıcılı Docker uygulamalarını tanımlamaya ve çalıştırmaya yarayan bir araçtır. Bu, bir config dosyası ile birden fazla projeyi çalıştırabileceğimiz anlamına gelmektedir.

Compose ile uygulamanın hizmetlerini yapılandırmak için bir YAML dosyası kullanılabildiğinden yazılımın birçok alanında ve üretim, hazırlık, geliştirme ve test gibi iş akışlarında yararlanılabilmektedir. Aşağıda örnek bir yaml dosyası yer almaktadır:

version: '3.8'
services:
mssql:
build:
context: /opt/docker/mssql
dockerfile: dockerfile
ports:
- "${MSSQL_PORT}:1433"
environment:
SA_PASSWORD: "${MSSQL_PASS}"
ACCEPT_EULA: "Y"
MSSQL_PID: Express
MSSQL_COLLATION: Turkish_CS_AS
TZ: Europe/Istanbul
volumes:
- /opt/mssql/data: ${MSSQL_DATA_DIR}
- /opt/mssql/log: ${MSSQL_LOG_DIR}
- /opt/mssql/backup: ${MSSQL_BACKUP_DIR}

Docker Compose, versiyon bilgi ile başlaması gerekmektedir. Yukarıda gördüğünüz gibi “3” olarak belirtilmiştir ve zorunludur. Dosya içerisinde Servis Adı, Images, Build, Environment, Volumes, Ports gibi tanımlı özellikler bulunmaktadır. Bunları kısaca açıklamak istersek;

Build:

  • Build edilecek konteynerın configlerinin yer aldığı Dockerfile dosyasının ve Docker dosyalarının olduğu path belirtilen alandır,

Images:

  • Uygulamanızın çalışacağı ortam için gerekli olan image dosyasının belirtildiği alandır, images’ın local sunuc üzerinde veya Docker Hub üzerinde varolduğu sayılmaktadır (Örnek olarak tomcat,nginx,ubuntu,redis,python,postgres,node verilebilir),

Environment:

  • MSSQL kimlik bilgileri, dosya yolları gibi ortam değişkenlerini ve bağımlılıkları tanımlamaktadır.

SA_PASSWORD: "${MSSQL_PASS}"
ACCEPT_EULA: "Y"
MSSQL_PID: Express
MSSQL_COLLATION: Turkish_CS_AS
TZ: Europe/Istanbul

Ports:

  • Konteynerın içindeki portları Hosta maplamek için kullanılmaktadır.

ports:
- 443:443

Volumes:

  • Host üzerindeki dosya veya klasörü konteynera mount için kullanılmaktadır.

volumes:
- /Desktop/App:/var/lib/app

Docker-compose.yml dosyası içerinde değişkenler "${*******}" şeklinde tanımlanmaktadırlar. Bu değişken tanımları “.env” adında bir dosya üzerinde saklanmakta, bu dosyanın da docker-compose.yml dosyasının bulunduğu kök dizinde bulunması gerekmektedir. “.env” dosyasının kullanım amacı, güvenlik amaçlı olmakla birlikte aynı projeyi farklı configlerle çalıştırabilmemizdir. Yukarıdaki docker-compose.yml dosyasının “.env” dosyası aşağıdaki gibi olacaktır:

MSSQL_PORT=1923
MSSQL_PASS=******
MSSQL_DATA_DIR=var/opt/mssql/data
MSSQL_LOG_DIR=/var/opt/mssql/log
MSSQL_BACKUP_DIR=/var/opt/mssql/backup

Dockerfile ise Docker-compose.yml içerisinde “build” altında tanımlanan Dockerfile dosyasının herhangi bir uzantısı yoktur. Dockerfile dosyası, yayınlanacak uygulamanın nasıl bir ortamda çalışacağına dair talimatlar barındırmaktadır. Dockerfile dosyası base image ile başlar ve içerisinde yeralan bazı komutların açıklaması şöyledir:

FROM < image:tag>
*FROM mcr.microsoft.com/mssql/server:2022-latest
“Kullanılacak images”

RUN < komut>
*RUN apt-get update && apt-get upgrade && apt-get install -y docker
“Yürütülecek komutlar”

CMD < komut> < değer>
*CMD echo “Hello World”
“Container ayağa kalktığında ilk çalıştırılacak komutlar”

ADD < host_kaynak_dosya> < container_dosya_yolu>
*ADD https://www.java4coding.com/deploy.tar.gz /sources/
“local pathten veya internetten container içerisine data kopyalar”

COPY < src-path> < destination-path>
“COPY sources/config.xml app.xml”
“local pathtan container içerisine dosya kopyalar”

Dockerization

Yukarıdaki anlatmaya çalıştığım süreçlerin tamamı olup uygulamanın veya projenin docker üzerinde çalıştırmaya veya çalışır hale getirme sürecine Dockerization denilmektedir.

Dockerize edilen bir uygulama, Docker altyapısının sağladığı avantajlardan yararlanmaktadır. Bu avantajlar arasında uygulamanın izolasyonu, taşınabilirlik, hızlı dağıtım, ölçeklenebilirlik ve verimlilik yer almaktadır. Docker, mikro servis mimarileri, test ortamları ve daha birçok kullanım senaryosu için yaygın olarak kullanılan bir araçtır.

Ubuntu 20.04 üzerinden örnek Docker Compose ile Mssql Kurulumu

Sunucu Updatelerini Kontrol Edilmesi

sudo apt update && sudo apt upgrade -y

Sunucu Üzerine Docker ve Docker Compose Kurulumları

sudo apt install docker && sudo apt install docker -y

docker-compose.yml Dosyasını oluşturma

version: '3.8'
services:
mssql:
build:
context: /opt/docker/mssql
dockerfile: dockerfile
ports:
- "${MSSQL_PORT}:1433"
environment:
SA_PASSWORD: "${MSSQL_PASS}"
ACCEPT_EULA: "Y"
MSSQL_PID: Express
MSSQL_COLLATION: Turkish_CS_AS
TZ: Europe/Istanbul
volumes:
- /opt/mssql/data: ${MSSQL_DATA_DIR}
- /opt/mssql/log: ${MSSQL_LOG_DIR}
- /opt/mssql/backup: ${MSSQL_BACKUP_DIR}

Dockerfile Dosyasının oluşturulması

FROM mcr.microsoft.com/mssql/server:2022-latest

.env Dosyasının oluşturulması

MSSQL_PORT=1923
MSSQL_PASS=******
MSSQL_DATA_DIR=var/opt/mssql/data
MSSQL_LOG_DIR=/var/opt/mssql/log
MSSQL_BACKUP_DIR=/var/opt/mssql/backup

Uygulamayı ayağa kaldırma

Uygulama, docker compose.yml dosyasının bulunduğu kök dizinde aşağıdaki komutlarla ayağa kaldırabilmektedir:

docker-compose build
docker-compose up -d

Docker compose başlatma ve durdurma

docker-compose start / stop

Dcoker compose containerları silme

docker-compose down

Docker compose yeniden başlatma

docker-compose restart

İnfina Yazılım olarak, güncel teknolojiler kullanarak 28 yıldır sermaye piyasalarının dijitalleşmesine öncülük ediyoruz.