Creating A Dockerfile

Kendi Dockerfile’ını build etmek#

# Use an existing docker image as a base 
FROM alpine
# Download and install a dependency
RUN apk add --update redis
# Command instruction. Tell the image what to do when it starts as a container
CMD ["redis-server"]

Yukarıda verilen Dockerfile redis server image ı kuracaktır. Dosyanın bulunduğu dizine gidip;

docker build .

Dockerfile içeriğini image olarak oluşturacaktır. Ancak bu şekilde image oluşturulursa docker images ile imagelarımıza baktığımızda unnamed bir image göreceğiz. Bu bizim az önce build ettiğimiz image.

Bu durumu kurtarmak için yeni oluşacak image a tagederek bir isim verebiliriz.

docker build -t <docker_id>/<image_name>:<image_version> .
docker build -t atacankullabci/custom-redis-server:latest .

Node kullanarak npm içeren bir Dockerfile oluşturmak#

# Specify a base image. We have used node base image 
# because alpine base image does not have the npm pre-installed.
# This node version is named alpine. But it does not mean that
# we install alpine base image. In docker world alpine is meant
# for a small and concise image. So this node:alpine image has
# just what it's needed for basic installation, in other words
# most strip down node image.
FROM node:alpine

# Install some dependencies
RUN npm install

# Default Command
CMD ["npm", "start"]

Ancak bu Docker file hata verecektir. Çünkü bu base image’da node:alpine package.json adında bir dosya bulunmamakta. Bu dosyayı biz oluşturalım.

{
    "dependencies": {
        "express": "*"
    },
    "scripts": {
        "start": "node index.js"
    }
}

Bu dosya ise index.js. Basitce express frameworkü ile bir node server oluşturuyor ve 8080 portuna GET ile giden clienta bir mesaj dönüyor.

const express = require('express');

const app = express();

app.get('/', (req, res) => {
    res.send('Hi there !');
});

app.listen(8080, () => {
    console.log('Listening on port 8080 !');
});

Dosyayı oluşturduk ancak image Dockerfile ile build edilirken hala bu dosyaya ihtiyaç duyuyor. Bu nedenle bu dosyayı bizim local dizinimizden image’ın içine kopyalamamız gerekiyor. Bunun için Dockerfile içinde kullanmamız gereken instruction COPY RUN npm install dan önce package.json ı kopyalamamız gerek.

COPY ./ ./

Bu işlemden sonra image build edilecektir. Image id si ile docker run işlemini yapıp çalıştırabiliriz.

Docker container için port bilgileri#

Yukarıda bir node js app ini Dockerfile ile containerize ettik. Ancak index.js de belirttiğimiz 8080 portu oluşturulacak docker container ının içindeki network de sunulan port. Bizim local makinemizin şuan da bu network ile herhangi bir bağlantısı yok. Bu bağlantıyı yapmak için docker run komutumuza bir port bilgisi ekleyeceğiz. Bu port bilgisinin sadece bir defa set edilmesi yeterlidir.

docker run -p 8080:8080 <image_id>

Yukarıdaki instruction daki ilk 8080 bizim local makinemizdeki 8080 portu. İkincisi ise container içindeki networkdeki portu temsil ediyor. Yani bu komutun anlamı; bu image id’li container ın içindeki networkden 8080 portu ile dışardaki local makinenin 8080 portunu bağla dır.

Çalışan bir Docker Container ın içine shell atmak#

Yukarıda oluşturduğumuz image a bash atmak için;

Contariner’ın çalıştığını varsayarak.

docker exec -it <container_id> sh

Burada root directory e gidip ls attığımızda projenin içerisindeki tüm folder ların burada /directory sinde olduğuu görürüz. Bu durum iyi değildir çünkü ileriki zamanlarda proje büyüdüğünde bu directory de bulunan başka dosyalarla conflict olabilir. Bu durumu düzeltmek için Dockerfile a yeni bir instruction eklemeliyiz. WORKDIR

FROM node:alpine

WORKDIR /usr/app

COPY ./ ./ 
RUN npm install

CMD ["npm", "start"]

Image tekrar build edildikten sonra ; Bu komut docker container ına bizim uygulamamızın dosyalarının usr/appdirectory sinin altına atmasını söyler. Tekrar bash atıp deneyelim !

Atacan KULLABCI © 2024