Program
Docker’ı gerçekten öğrenmenin yolu uygulamalı çalışmaktan geçer. Docker, modern yazılım geliştirme ve veri biliminde temel bir araçtır; uygulamaları konteynerlerde oluşturmanıza, dağıtmanıza ve yönetmenize olanak tanır.
Bu yazıda, çok aşamalı derlemelere, Docker imajlarını optimize etmeye ve Docker’ı veri biliminde uygulamaya odaklanan başlangıç, orta ve ileri seviye Docker projelerine örnekler veriyorum. Bu projeler, Docker’a olan hâkimiyetinizi derinleştirmek ve pratik becerilerinizi geliştirmek için tasarlandı.
Docker Projelerine Başlarken
Projelerden önce, bilgisayarınızda Docker’ın kurulu olduğundan emin olun. Kullandığınız işletim sistemine (Windows, macOS, Linux) bağlı olarak Docker’ı resmi Docker web sitesinden indirebilirsiniz.
Ayrıca şu konularda temel bir anlayışa ihtiyaç duyacaksınız:
- Dockerfile’lar (konteynerlerinizin içinde ne olduğunu tanımlamak için)
- Docker Compose (çok konteynerli uygulamalar için)
docker build,docker run,docker-compose upgibi temel CLI komutları
Yukarıdaki kavramlarda kendinizi tazelemeniz gerekiyorsa, Introduction to Docker veya Containerization and Virtualization Concepts kurslarına göz atın.
Hadi başlayalım!
Başlangıç Seviyesi Docker Projeleri
Docker’a yeni başlarken, hem seviyenize uygun hem de yeni kavramlar öğrenmenizi sağlayacak projeleri seçmek önemlidir. İşte başlamak için bazı proje fikirleri:
Proje 1: Basit bir web sunucusu kurma
Bu projede, Nginx kullanan temel bir web sunucusunu çalıştıran bir Docker konteyneri oluşturacaksınız. Nginx, ters proxy, yük dengeleme ve daha fazlası için en popüler açık kaynak web sunucularından biridir. Projenin sonunda, Docker ile konteyner oluşturup çalıştırmayı ve uygulamaya yerel makinenizden erişebilmek için portları açmayı öğrenmiş olacaksınız.
Zorluk seviyesi: Başlangıç
Kullanılan teknolojiler: Docker, Nginx
Adım adım yönergeler
- Docker’ı kurun: Sisteminizde Docker’ın kurulu olduğundan emin olun.
- Proje dizinini oluşturun: Yeni bir klasör ve içinde Nginx’in sunacağı bir
index.htmldosyası oluşturun. - Dockerfile yazın: Dockerfile, konteynerin ortamını tanımlayan bir betiktir. Docker’a hangi temel imajın kullanılacağını, hangi dosyaların ekleneceğini ve hangi portların açılacağını söyler:
FROM nginx:alpine
COPY ./index.html /usr/share/nginx/html
EXPOSE 80
- Docker imajını oluşturun: Proje klasörünüze gidin ve şu komutla imajı oluşturun:
docker build -t my-nginx-app .
- Konteyneri çalıştırın: Konteyneri başlatın ve konteynerin 80 numaralı portunu makinenizdeki 8080 portuna eşleyin:
docker run -d -p 8080:80 my-nginx-app
- Web sunucusuna erişin: Tarayıcınızı açın ve oluşturduğunuz sayfayı görmek için http://localhost:8080 adresine gidin.
Proje 2: Bir Python betiğini Docker’laştırma
Bu proje, bir CSV dosyasını pandas kütüphanesini kullanarak işleyen basit bir Python betiğinin konteynerleştirilmesini içerir. Amaç, bağımlılıkları yönetmeyi ve Python betiklerini Docker konteynerleri içinde çalıştırmayı öğrenerek betiği taşınabilir ve her ortamda çalıştırılabilir hale getirmektir.
Zorluk seviyesi: Başlangıç
Kullanılan teknolojiler: Docker, Python, pandas
Adım adım yönergeler
- Python betiğini yazın: Bir CSV dosyasını okuyan ve işleyen
process_data.pyadlı bir betik oluşturun. İşte örnek bir betik:
import pandas as pd
df = pd.read_csv('data.csv')
print(df.describe())
requirements.txtdosyasını oluşturun: Bu dosya, betiğin ihtiyaç duyduğu Python kütüphanelerini listeler. Bu durumda yalnızcapandasgerekiyor:
pandas
- Dockerfile yazın: Bu dosya, Python betiği için ortamı tanımlar:
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "process_data.py"]
- Docker imajını oluşturun:
docker build -t python-script .
- Konteyneri çalıştırın:
docker run -v $(pwd)/data:/app/data python-script
Proje 3: Basit bir çok konteynerli uygulama oluşturma
Bu proje, çok konteynerli bir uygulama oluşturarak Docker Compose’a aşina olmanıza yardımcı olacak. Frontend olarak Flask ve backend veritabanı olarak MySQL kullanan basit bir web uygulaması oluşturacaksınız. Docker Compose, birlikte çalışan birden fazla konteyneri yönetmenizi sağlar.
Zorluk seviyesi: Başlangıç
Kullanılan teknolojiler: Docker, Docker Compose, Flask, MySQL
Adım adım yönergeler
- Flask uygulamasını yazın: MySQL veritabanına bağlanan ve bir mesaj gösteren basit bir Flask uygulaması oluşturun. İşte bir örnek:
from flask import Flask
import mysql.connector
app = Flask(__name__)
def get_db_connection():
connection = mysql.connector.connect(
host="db",
user="root",
password="example",
database="test_db"
)
return connection
@app.route('/')
def hello_world():
connection = get_db_connection()
cursor = connection.cursor()
cursor.execute("SELECT 'Hello, Docker!'")
result = cursor.fetchone()
connection.close()
return str(result[0])
if __name__ == "__main__":
app.run(host='0.0.0.0')
docker-compose.ymldosyasını oluşturun: Docker Compose, çok konteynerli Docker uygulamalarını tanımlar ve çalıştırır. Bu dosyada Flask uygulamasını ve MySQL veritabanı servislerini tanımlayacaksınız:
version: '3'
services:
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: test_db
ports:
- "3306:3306"
volumes:
- db_data:/var/lib/mysql
web:
build: .
ports:
- "5000:5000"
depends_on:
- db
environment:
FLASK_ENV: development
volumes:
- .:/app
volumes:
db_data:
- Flask için Dockerfile yazın: Bu, Flask uygulaması için Docker imajını oluşturacaktır:
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "app.py"]
- Konteynerleri oluşturun ve çalıştırın: Tüm uygulamayı ayağa kaldırmak için Docker Compose kullanın:
docker-compose up --build
- Flask uygulamasına erişin: Tarayıcınızda http://localhost:5000 adresine gidin.
Orta Seviye Docker Projeleri
Aşağıdaki projeler, Docker’ın temellerine sağlam şekilde hâkim olanlar içindir. Çok aşamalı derlemeler ve optimizasyon teknikleri gibi daha karmaşık kavramları tanıtacaktır.
Proje 4: Bir Node.js uygulaması için çok aşamalı derleme
Çok aşamalı derlemeler, derleme ve çalışma zamanını ayırarak Docker imaj boyutlarını küçültmeye yardımcı olur. Bu projede, bir Node.js uygulamasını çok aşamalı derlemelerle konteynerleştireceksiniz.
Zorluk seviyesi: Orta
Kullanılan teknolojiler: Docker, Node.js, Nginx
Adım adım yönergeler
- Basit bir Node.js uygulaması oluşturun: Basit bir mesaj döndüren temel bir Node.js sunucusu yazın. İşte bir örnek:
const express = require('express');
const app = express();
app.get('/', (req, res) => res.send('Hello from Node.js'));
app.listen(3000, () => console.log('Server running on port 3000'));
- Çok aşamalı derlemeli Dockerfile yazın: İlk aşama uygulamayı derler, ikinci aşama daha hafif bir temel imajla uygulamayı çalıştırır.
# Stage 1: Build
FROM node:14 as build-stage
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
# Add the following line if there's a build step for the app
# RUN npm run build
# Stage 2: Run
FROM node:14-slim
WORKDIR /app
COPY --from=build-stage /app .
EXPOSE 3000
ENV NODE_ENV=production
CMD ["node", "server.js"]
- İmajı oluşturun:
docker build -t node-multi-stage .
- Konteyneri çalıştırın:
docker run -p 3000:3000 node-multi-stage
Proje 5: TensorFlow ile bir makine öğrenmesi modelini Docker’laştırma
Bu proje, TensorFlow kullanarak bir makine öğrenmesi modelinin konteynerleştirilmesini içerir. Amaç, TensorFlow modellerini altyapı kurulumuyla uğraşmadan, farklı sistemlerde çalıştırabileceğiniz taşınabilir bir ortam oluşturmaktır.
Zorluk seviyesi: Orta
Kullanılan teknolojiler: Docker, TensorFlow, Python
Adım adım yönergeler
- Python betiğine TensorFlow kurun: Bir önceden eğitilmiş TensorFlow modelini yükleyip çalıştıran
model.pyadlı bir Python betiği oluşturun:
import tensorflow as tf
model = tf.keras.applications.MobileNetV2(weights='imagenet')
print("Model loaded successfully")
- Dockerfile yazın: TensorFlow için Docker içinde ortamı tanımlayın:
FROM tensorflow/tensorflow:latest
WORKDIR /app
COPY . .
CMD ["python", "model.py"]
- İmajı oluşturun:
docker build -t tensorflow-model .
- Konteyneri çalıştırın:
docker run tensorflow-model
Proje 6: Jupyter ve Docker ile bir veri bilimi ortamı oluşturma
Bu proje, Docker ve Jupyter notebook’ları kullanarak tekrarlanabilir bir veri bilimi ortamı oluşturmayı amaçlar. Ortam, pandas, NumPy ve scikit-learn gibi popüler Python kütüphanelerini içerecektir.
Zorluk seviyesi: Orta
Kullanılan teknolojiler: Docker, Jupyter, Python, scikit-learn
Adım adım yönergeler
docker-compose.ymldosyasını oluşturun: Jupyter Notebook servisini ve gerekli kütüphaneleri tanımlayın. İşte bir örnek:
version: '3'
services:
jupyter:
image: jupyter/scipy-notebook
ports:
- "8888:8888"
volumes:
- ./notebooks:/home/joelwembo/work
- Jupyter Notebook’u başlatın: Jupyter Notebook’u başlatmak için Docker Compose kullanın.
docker-compose up
- Jupyter Notebook’a erişin: Tarayıcınızı açın ve http://localhost:8888 adresine gidin.
İleri Seviye Docker Projeleri
Bu ileri seviye projeler, gerçek dünya uygulamalarına ve derin öğrenme boru hatları ile otomatik veri boru hatları gibi gelişmiş Docker kavramlarına odaklanır.
Proje 7: Bir Python uygulaması için Docker imaj boyutunu küçültme
Bu projede, Alpine Linux gibi minimal temel imajlar kullanarak ve imaj boyutunu olabildiğince küçük tutmak için çok aşamalı derlemeleri uygulayarak bir Python uygulamasının Docker imajını optimize edeceksiniz.
Zorluk seviyesi: İleri
Kullanılan teknolojiler: Docker, Python, Alpine Linux
Adım adım yönergeler
- Python betiğini yazın: pandas kullanarak verileri analiz eden bir betik oluşturun. İşte bir örnek betik:
import pandas as pd
df = pd.read_csv('data.csv')
print(df.head())
- Dockerfile’ı optimize edin: Hafif bir imaj oluşturmak için çok aşamalı derlemeler ve Alpine Linux kullanın.
# Stage 1: Build stage
FROM python:3.9-alpine as build-stage
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY script.py .
# Stage 2: Run stage
FROM python:3.9-alpine
WORKDIR /app
COPY --from=build-stage /app/script.py .
CMD ["python", "script.py"]
- İmajı oluşturun:
docker build -t optimized-python-app .
Proje 8: PyTorch ile bir derin öğrenme boru hattını Docker’laştırma
Bu proje, PyTorch kullanarak bir derin öğrenme boru hattının konteynerleştirilmesini içerir. Odak noktası, performans ve boyut için Dockerfile’ı optimize ederek derin öğrenme modellerini farklı ortamlarda kolayca çalıştırmaktır.
Zorluk seviyesi: İleri
Kullanılan teknolojiler: Docker, PyTorch, Python
Adım adım yönergeler
- Python betiğine PyTorch kurun: Önceden eğitilmiş bir PyTorch modelini yükleyip çıkarım yapan bir betik oluşturun. İşte bir örnek:
import torch
model = torch.hub.load('pytorch/vision', 'resnet18', pretrained=True)
print("Model loaded successfully")
- Dockerfile yazın: PyTorch için ortamı tanımlayın:
FROM pytorch/pytorch:1.9.0-cuda11.1-cudnn8-runtime
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY model.py .
CMD ["python", "model.py"]
- İmajı oluşturun:
docker build -t pytorch-model .
- Konteyneri çalıştırın:
docker run pytorch-model
Proje 9: Apache Airflow ve Docker ile veri boru hatlarını otomatikleştirme
Bu projede, veri boru hatlarını otomatikleştirmek için bir Apache Airflow ortamı kuracak ve konteynerleştireceksiniz. Apache Airflow, veri mühendisliğinde yaygın olarak kullanılan, karmaşık iş akışlarını orkestre eden popüler bir araçtır.
Zorluk seviyesi: İleri
Kullanılan teknolojiler: Docker, Apache Airflow, Python, PostgreSQL
Adım adım yönergeler
docker-compose.ymldosyasını oluşturun: Airflow servislerini ve PostgreSQL veritabanını tanımlayın:
version: '3'
services:
postgres:
image: postgres:latest
environment:
POSTGRES_USER: airflow
POSTGRES_PASSWORD: airflow
POSTGRES_DB: airflow
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
webserver:
image: apache/airflow:latest
environment:
AIRFLOW__CORE__SQL_ALCHEMY_CONN: postgresql+psycopg2://airflow:airflow@postgres/airflow
AIRFLOW__CORE__EXECUTOR: LocalExecutor
depends_on:
- postgres
ports:
- "8080:8080"
volumes:
- ./dags:/opt/airflow/dags
command: ["webserver"]
scheduler:
image: apache/airflow:latest
environment:
AIRFLOW__CORE__SQL_ALCHEMY_CONN: postgresql+psycopg2://airflow:airflow@postgres/airflow
AIRFLOW__CORE__EXECUTOR: LocalExecutor
depends_on:
- postgres
- webserver
volumes:
- ./dags:/opt/airflow/dags
command: ["scheduler"]
volumes:
postgres_data:
- Airflow ortamını başlatın: Airflow ortamını ayağa kaldırmak için Docker Compose kullanın:
docker-compose up
- Airflow arayüzüne erişin: Tarayıcınızı açın ve http://localhost:8080 adresine gidin.
Proje 10: FastAPI ve Docker ile bir veri bilimi API’si dağıtma
Bir FastAPI kullanarak veri bilimi API’si oluşturun ve dağıtın. API’yi Docker ile konteynerleştirecek ve üretim ortamları için optimize etmeye odaklanacaksınız.
Zorluk seviyesi: İleri
Kullanılan teknolojiler: Docker, FastAPI, Python, scikit-learn
Adım adım yönergeler
- FastAPI uygulamasını yazın: Tahminler için bir makine öğrenmesi modeli kullanan basit bir API oluşturun. İşte bir örnek:
from fastapi import FastAPI
import pickle
app = FastAPI()
with open("model.pkl", "rb") as f:
model = pickle.load(f)
@app.post("/predict/")
def predict(data: list):
return {"prediction": model.predict(data)}
- Dockerfile yazın: FastAPI için ortamı tanımlayan bir Dockerfile oluşturun:
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000"]
- İmajı oluşturun:
docker build -t fastapi-app .
- Konteyneri çalıştırın:
docker run -p 8000:8000 fastapi-app
Docker Projelerinde Çalışmak İçin İpuçları
Bu projeler üzerinde çalışırken aşağıdaki ipuçlarını aklınızda bulundurun:
- Küçük başlayın: Biraz zorlayıcı projelerle başlayın, ardından daha karmaşık görevlere geçin. Daha basit görevlerle güven kazanmak kritik önemdedir.
- İlerlemenizi belgeleyin: Öğreniminizi takip etmek ve gelecekte başvurmak üzere projelerinizin ayrıntılı bir kaydını tutun.
- Docker topluluklarına katılın: Deneyimlerinizi paylaşmak, soru sormak ve başkalarından öğrenmek için çevrimiçi forumlara ve yerel buluşmalara katılın.
- Deneyin ve özelleştirin: Projeleri değiştirmekten, farklı yaklaşımlar denemekten ve yeni Docker özelliklerini keşfetmekten çekinmeyin.
- Öğrenmeye devam edin: Bilginizi Kubernetes, Docker Swarm veya mikroservis mimarisi gibi ileri konular ve araçlarla genişletmeyi sürdürün.
Sonuç
Docker’a hâkim olmak yalnızca komutları ve yapılandırmaları öğrenmekten ibaret değildir. Docker’ın modern uygulama geliştirme, veri bilimi iş akışları ve altyapı yönetimindeki yerini anlamakla ilgilidir.
Bu rehberde paylaştığım projeler, gerçek dünya senaryolarında başarılı olmak için gereken temel becerileri ve uygulamalı deneyimi oluşturmanıza yardımcı olacak fikirler sundu.
Bu noktada, bilginizi pekiştirmek için şu kursları takip etmenizi öneririm:
SSS
Verimli Dockerfile yazımı için en iyi uygulamalar nelerdir?
Verimli Dockerfile yazımı için en iyi uygulamalar arasında komutları birleştirerek katman sayısını en aza indirmek, imaj boyutunu küçültmek için çok aşamalı derlemeler kullanmak, hafif temel imajlar seçmek, bağımlılıkları önbelleğe almak ve son imaja gereksiz dosyaları dahil etmekten kaçınmak yer alır.
Docker’da çok aşamalı derleme nedir?
Çok aşamalı derleme, derleme ve çalışma zamanı ortamlarını ayırarak Docker imajlarını optimize etme yöntemidir. Bu sayede daha küçük ve daha güvenli imajlar elde edilir.
Bir Docker imajının boyutu nasıl küçültülebilir?
Minimal temel imajlar kullanın, bağımlılıkları verimli yönetin ve imaj boyutunu küçültüp performansı artırmak için çok aşamalı derlemelerden yararlanın.
Docker imajları oluştururken karşılaşılan yaygın hataları nasıl gideririm?
Docker imajları oluşturulurken yaygın hatalar arasında izin sorunları, yanlış Dockerfile sözdizimi ve bağımlılık kurulumlarının başarısız olması yer alır. Sorun gidermek için Docker’ın derleme günlüklerini kontrol edin, doğru temel imajı kullandığınızdan emin olun ve yol ile dosya izinlerinin doğru ayarlandığını doğrulayın. docker build --no-cache gibi araçlar önbellekleme sorunlarını belirlemeye yardımcı olabilir.
Bu projelerde Docker’ı Kubernetes ile kullanabilir miyim?
Evet, Docker’a alıştıktan sonra Kubernetes bir sonraki adım olabilir. Kubernetes, konteynerleştirilmiş uygulamaları ölçekli şekilde yönetmeye yardımcı olur. Docker projelerinizi bir Kubernetes kümesine dağıtarak birden çok örneği yönetebilir, ölçeklemeyi ele alabilir ve dağıtımları otomatikleştirebilirsiniz.
Docker volumeleri ve kalıcı veriyi yönetmek için en iyi uygulamalar nelerdir?
Docker volumeleriyle çalışırken, konteyner yeniden başlatmalarında veri kalıcılığını sağlamak için adlandırılmış volumeleri kullanmak önemlidir. Volumelerinizi düzenli olarak yedekleyin ve disk G/Ç kaynaklı olası performans darboğazlarını izleyin. Hassas verileri doğrudan konteynerlerde saklamaktan kaçının; bunun yerine güvenli depolama çözümleri veya haricî veritabanları kullanın.
Bir Dockerfile’da ENTRYPOINT yönergesinin amacı nedir?
ENTRYPOINT yönergesi, bir konteyner başlatıldığında her zaman çalışacak komutu belirtir. Konteynerin yürütülebilir bir dosya gibi ele alınmasını sağlar; çalışma zamanında argümanlar geçirilebilir ve esnekliği artırır.
Bir Dockerfile’da CMD ile ENTRYPOINT arasındaki fark nedir?
Hem CMD hem de ENTRYPOINT, bir konteyner başladığında çalışacak komutları belirtir. Ancak CMD, üzerine yazılabilen varsayılan argümanlar sağlar; ENTRYPOINT ise her zaman çalışacak komutu tanımlar. ENTRYPOINT, yürütülebilir gibi davranan konteynerler oluşturmak için yararlıdır; CMD ise varsayılan komutları belirtmede daha esnektir.
Yüksek erişilebilirlik mimarisi ve kavramları konusunda derin bilgiye sahip AWS Sertifikalı Bulut Çözümleri Mimarı, DevOps ve Bulut Mühendisi. Bulut mühendisliği ve DevOps konularında yetkinim ve kurumsal uygulamaları hayata geçirmek için açık kaynak kaynaklarını etkin biçimde kullanırım. AWS, AWS CDK, AWS SAM, CloudFormation, Serverless Framework, Terraform ve Django kullanarak bulut tabanlı uygulamalar geliştiriyorum.

