Genel Hatları ile Docker
Alper Arınç
İnfina Yazılım Operasyon ve Sanallaştırma Uzmanı
İ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.