Docker: “Bu Bilgisayarda Çalışmıyor!” Sorununa Elveda
Giriş
Docker, yazılımların daha hızlı, daha güvenilir ve daha verimli bir şekilde çalıştırılmasını sağlar. Peki, Docker tam olarak nedir ve nasıl çalışır? Bu yazıda Docker hakkında temel bilgiler üzerinde duracağız. Ardından basit bir Node.js uygulaması yazarak kendi image ve container’ımızı yaratacağız. Hatta GitHub Actions ile attığımız her commit ile Docker paketimizi, Docker Hub üzerinde güncelleyeceğiz.
Biraz uzun bir yazı olacak. Hadi başlayalım!
Docker Nedir?
Docker, uygulamaların ve bağımlılıklarının bir arada bulunduğu, izole edilmiş ortamlar olan konteynerlerde çalıştırılmasını sağlayan bir platformdur. Bu konteynerler, sanal makinelerden farklı olarak, daha hafif ve daha hızlıdır. Docker sayesinde, bir uygulamayı geliştirme ortamından üretim ortamına taşırken oluşabilecek “bu bende çalışıyor ama sende çalışmıyor” sorunları ortadan kalkar.
Docker’ın Temel Bileşenleri
1. Docker Engine
Docker Engine, Docker’ın çekirdeğidir. İki ana bileşeni vardır:
- Docker Daemon: Konteynerleri oluşturan ve yöneten arka plan servisidir.
- Docker CLI: Docker komutlarını çalıştırmamıza olanak tanıyan komut satırı aracıdır.
2. Docker Image
Docker Image, uygulamanın ve çalışması için gerekli tüm bağımlılıkların paketlendiği, salt okunur şablonlardır. Bir image, bir konteyner oluşturmak için temel olarak kullanılır.
3. Docker Container
Docker Container, bir Docker Image’in çalıştırılmış halidir. Her konteyner, izole bir ortamda çalışır ve sistem kaynaklarını verimli bir şekilde kullanır.
Nerde bu paketler?
Docker Hub, Docker konteyner imajlarını depolamak, paylaşmak ve dağıtmak için kullanılan bir bulut tabanlı kayıt deposudur. Docker Hub, geliştiricilerin ve ekiplerin konteyner imajlarını merkezi bir yerde barındırmalarına ve bu imajları hızlı ve kolay bir şekilde paylaşmalarına olanak tanır. İşte Docker Hub hakkında bilmeniz gerekenler:
Docker Hub’ın Temel Özellikleri
1. Depolama
Docker Hub, kullanıcıların kendi özel ya da halka açık Docker imajlarını depolayabilecekleri bir kayıt deposu sunar. Her kullanıcı kendi imajlarını oluşturabilir, yükleyebilir ve diğer kullanıcılarla paylaşabilir.
2. Paylaşım
Docker Hub, imajları paylaşmayı ve işbirliği yapmayı kolaylaştırır. Halka açık imajlar herkes tarafından erişilebilirken, özel imajlar yalnızca belirli kullanıcılar veya ekipler tarafından görülebilir.
3. Otomatik Yapılar (Automated Builds)
Docker Hub, GitHub veya Bitbucket ile entegre olabilir. Bu sayede, bir depo güncellendiğinde Docker Hub otomatik olarak yeni bir imaj oluşturabilir. Bu, CI/CD (Continuous Integration/Continuous Deployment) süreçlerini kolaylaştırır.
4. Resmi İmajlar (Official Images)
Docker Hub, yaygın olarak kullanılan uygulamalar ve hizmetler için resmi imajlar sunar. Bu imajlar, Docker tarafından doğrulanmış ve güvenlik açısından test edilmiştir. Örneğin, resmi MySQL, Redis, NGINX gibi imajlara Docker Hub üzerinden erişilebilir.
5. Topluluk İmajları
Kullanıcılar, kendi oluşturdukları imajları Docker Hub’a yükleyebilir ve bunları toplulukla paylaşabilir. Bu imajlar, çeşitli uygulamalar ve çözümler için hazır yapılandırmalar sunar.
Docker Hub Kullanımı
- Docker Hub Hesabı Oluşturma :Docker Hub’ı kullanabilmek için öncelikle bir Docker Hub hesabı oluşturmanız gerekir. Docker Hub adresine giderek ücretsiz bir hesap açabilirsiniz.
- İmaj Yükleme : Docker Hub hesabınızı oluşturduktan sonra, yerel makinenizde oluşturduğunuz Docker imajlarını Docker Hub’a yükleyebilirsiniz. İşte temel adımlar:
- Docker Hub’a giriş yapın ve bir depo oluşturun.
- Terminal üzerinden Docker CLI kullanarak Docker Hub’a giriş yapın:
docker login
Yerel imajınızı Docker Hub’a göndermek için imajınızı etiketleyin:
docker tag myimage username/repository:tag
İmajınızı Docker Hub’a yükleyin:
docker push username/repository:tag
3. İmaj Çekme ve Kullanma
Docker Hub’dan bir imajı çekmek ve kullanmak çok kolaydır. Örneğin, resmi bir NGINX imajını çekmek için şu komutu kullanabilirsiniz:
docker pull nginx
Ardından bu imajı bir konteyner olarak çalıştırabilirsiniz:
docker run -d -p 80:80 nginx
Kendi paketimizi yaratalım!
Docker’ın çalışma mantığını daha iyi anlamak için basit bir örnek üzerinden gidelim. Diyelim ki bir nodejs uygulaması geliştirdiniz ve bu uygulamayı Docker kullanarak çalıştırmak istiyorsunuz.
1. Basit Bir Node.js Uygulaması Oluşturun
Öncelikle, basit bir Node.js uygulaması oluşturacağız. Proje dizininizde app.js
dosyasını oluşturun ve içine şu kodları ekleyin:
const http = require('http');
const hostname = '0.0.0.0';
const port = 3000;
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello, World!\\n');
});
server.listen(port, hostname, () => {
console.log(`Server running at <http://$>{hostname}:${port}/`);
});
Bu uygulama, http://localhost:3000 adresinde “Hello, World!” yanıtını veren basit bir HTTP sunucusudur.
2. package.json Dosyasını Oluşturun
Node.js bağımlılıklarını yönetmek için package.json dosyasını oluşturun. Terminalde şu komutu çalıştırın:
npm init -y
Bu komut, temel bilgileri içeren bir package.json dosyası oluşturur.
3. Dockerfile Oluşturun
Docker image’ınızı tanımlamak için bir Dockerfile oluşturmanız gerekiyor. Proje dizininizin kökünde Dockerfile adlı bir dosya oluşturun ve aşağıdaki içeriği ekleyin:
# Temel image olarak resmi Node.js image'ını kullanın
FROM node:14
# Çalışma dizinini belirleyin
WORKDIR /usr/src/app
# package.json ve package-lock.json dosyalarını çalışma dizinine kopyalayın
COPY package*.json ./
# Bağımlılıkları yükleyin
RUN npm install
# Uygulama kodunuzu kopyalayın
COPY . .
# Uygulamanın çalışacağı portu belirleyin
EXPOSE 3000
# Uygulamanızı çalıştırın
CMD ["node", "app.js"]
4. Docker Image Oluşturun ve Çalıştırın
Docker image’ınızı oluşturmak için terminalde şu komutu çalıştırın:
docker build -t serkanuslu/docker-example-app .
Bu komut, Docker image’ınızı oluşturur. Şimdi, image’ı bir container olarak çalıştırın:
docker run -p 3000:3000 serkanuslu/docker-example-app
Tarayıcınızda http://localhost:3000 adresine giderek uygulamanızın çalışıp çalışmadığını kontrol edin.
5. GitHub Actions ile Otomasyon
Her push işlemi sonrası Docker image’ınızı otomatik olarak güncellemek için GitHub Actions kullanacağız. Proje dizininizde .github/workflows adında bir dizin oluşturun ve docker-image.yml adında bir dosya oluşturun:
name: Docker Image CI
on:
push:
branches:
- main # Ana dalda push yapıldığında çalışacak
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Login to Docker Hub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build and push Docker image
uses: docker/build-push-action@v2
with:
context: .
push: true
platforms: linux/amd64,linux/arm64/v8
tags: serkanuslu/docker-example-app:latest
- name: Logout from Docker Hub
run: docker logout
6. GitHub Secrets Oluşturun
GitHub’da repository’nizin ayarlarına gidin ve “Secrets” sekmesine tıklayın. Burada iki yeni secret oluşturun:
DOCKER_USERNAME
: Docker Hub kullanıcı adınız.DOCKER_PASSWORD
: Docker Hub parolanız.
7. Docker Hub Repository Oluşturun
Docker Hub’da serkanuslu/docker-example-app
adında bir repository oluşturun.
8. Workflow Dosyasını Commit ve Push Edin
Workflow dosyanızı commit edip GitHub repository’nize pushlayın:
git add .github/workflows/docker-image.yml
git commit -m "feat: GitHub Actions workflow for Docker image"
git push origin main
Bu adımları tamamladıktan sonra, her main branchine push yaptığınızda GitHub Actions otomatik olarak Docker image’ınızı oluşturacak ve Docker Hub’a pushlayacaktır.
Anlatımdaki çalışmanın github reposuna ait linki ve oluşturduğum docker paketine ait linki ekliyorum.
Neden Docker Kullanmalıyız?
1. Tutarlılık ve Taşınabilirlik
Docker, uygulamaların her ortamda aynı şekilde çalışmasını sağlar. Geliştirici bilgisayarında çalışan bir uygulama, aynı şekilde test, staging ve üretim ortamlarında da çalışır.
2. Kolay Bağımlılık Yönetimi
Karmaşık bağımlılıklara sahip projelerde Docker, tüm bağımlılıkları tek bir konteyner içinde yönetir. Bu, özellikle projeler arası geçişlerde büyük bir avantaj sağlar.
3. Hızlı Kurulum ve Çalışma
Docker ile yeni bir projeye başlamak veya mevcut bir projeyi kurmak sadece birkaç komutla mümkündür. Bu, hem zaman kazandırır hem de kurulum hatalarını en aza indirir.
Sonuç
Docker, frontend geliştiricilerin de öğrenmesi gereken güçlü bir araçtır. Uygulamalarınızın tutarlılığını artırır, bağımlılık yönetimini kolaylaştırır ve kurulum sürecini hızlandırır. Bu yazıda Docker’ın temel kullanımını ve avantajlarına değindik.
Faydalı olması dileğiyle…