EMZETT.
Giriş yap

Dockerfile: bir konteyner imajı oluşturmak

Kısaca: Dockerfile, Docker’ın konteynerlerin şablonu olan imajı oluşturduğu adımları içeren bir metin dosyasıdır.

Biraz daha ayrıntılı: Bir imaj programı, çalışma zamanını ve bağımlılıkları içerir; konteynerler ondan başlatılır. Dockerfile, imajın komut komut nasıl oluşturulduğunu tanımlar. Her komut önbelleğe alınan bir katman oluşturur; böylece yeniden derlemede yalnızca değişen katmanlar yeniden oluşturulur.

Ayrıntılı

Bir Node.js uygulaması için örnek

FROM node:22-alpine           # temel imaj
WORKDIR /app                  # çalışma dizini
COPY package*.json ./         # önce yalnızca paket listeleri
RUN npm ci --omit=dev         # bağımlılıkları kur
COPY . .                      # sonra geri kalanı kopyala
EXPOSE 3000                   # port hakkında not
USER node                     # root olarak çalıştırma
CMD ["node", "server.js"]     # başlatma komutu

Derleme ve başlatma:

docker build -t my-app:1.0 .
docker run -p 3000:3000 my-app:1.0

Önemli yönergeler

  • FROM: temel imaj (mümkün olduğunca küçük ve sabit sürümlü).
  • RUN: derleme zamanında bir komut yürütür.
  • COPY / ADD: dosyaları içeri kopyalar (COPY tercih edin).
  • ENV, ARG: değişkenler.
  • CMD, ENTRYPOINT: konteynerin başlangıcındaki komut.
  • HEALTHCHECK: uygulamanın çalışıp çalışmadığını denetler.

İyi uygulama

  • Sıradan yararlanın: nadiren değişenler (bağımlılıklar) önce, kaynak kod en son; böylece önbellek işe yarar.
  • .gitignore gibi .dockerignore: node_modules, .git, sırları imaja koymayın.
  • Çok aşamalı derlemeler (multi-stage): bir aşamada derleyin, yalnızca sonucu ince bir son imaja kopyalayın.
  • Root olarak çalıştırmayın, temel imajı güncel tutun ve açıkları denetleyin (docker scout, Trivy).
  • Dockerfile’da parola olmasın: katmanlarda görünür kalırlar.

Çok aşamalı örnek

FROM golang:1.23 AS build
WORKDIR /src
COPY . .
RUN CGO_ENABLED=0 go build -o /app
FROM gcr.io/distroless/static
COPY --from=build /app /app
CMD ["/app"]

Son imaj yalnızca bitmiş programı içerir, derleyiciyi değil; bu yüzden küçüktür ve saldırıya daha az açıktır.

Ayrıca bak: Docker, Konteyner güvenliği, Podman ve Docker, Ortam değişkenleri