Last updated on 28 Ocak 2021
Artık hangi imaj hazırlamaya başlama zamanı geldi, Dockerfile aracılığıyla kendimize bir tane imaj hazırlayalım. Bunun için bir Node.js uygulamasını dockerize edeceğiz. Test amaçlı bir node.js uygulamam mevcut.
Dockerfileimizda aşağıdaki katmanlara ihtiyacımız var:
1.Node.JS 10 Alpine görüntüsüne göre (node:10-alpine) 2./Home/node/app/node_modules dizinini oluşturun ve dizinin owner ve grup olarak ayarlanacak 3. Çalışma dizinini /home/node/app olarak ayarlar 4.Uygulama package* dosyalarını çalışma dizinine kopyala 5. NPM kaydını ayarlanması 6. Yüklemeler gerekli NPM paketlerinin kurulması 7. app/ verinin geri kalanını çalışma dizinine kopyalar ve çalışma dizininin sahibini ve grubunu şu şekilde ayarlar: node 8. node kullanıcısına geçiş yapar 9. Kullanılacak 8080 numaralı portu açar 10. Uygulamayı çalıştırır.
O halde Dockerfile’ımızı oluşturalım ve başlayalım.
vim Dockerfile
Dockerfiles, yalnızca belirli eylemleri gerçekleştiren anahtar sözcükler belirleyen talimatlar kullanılarak oluşturulur. Komut anahtar kelimelerinin tamamen büyük harfle yazılması gerekmez, ancak tercih edilir. FROM
, COPY
, ve CMD
.
Öncelikle ana imajımızı FROM ile tanımlamamız gerekiyor. Tüm geçerli Dockerfiles FROM ile başlamalıdır.
FROM node:10-alpine
Şimdi bir dizin oluşturmak ve sahibini ayarlamak istiyoruz. Bunun için RUN komutunu kullanabiliriz, bu shell üzerinde herhangi bir komut çalıştırmamızı sağlar. İmajımız Alpine dayanıyor, ash kabuğunu kullanacağız, bu yüzden komutumuz “mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app”. Tek yapmamız gereken bunu RUN komutu ile çalıştırmak.
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
Sonra, /home/node/app dizinine gitmemiz gerekiyor. Bunu WORKDIR ile bir çalışma dizini ayarlayarak yapıyoruz. Aşağıdaki tüm RUN, CMD, COPY, ADD ve ENTRYPOINT talimatları bu dizinde gerçekleştirilecektir:
WORKDIR /home/node/app
Şimdi dosyalarımızı eklemek istiyoruz. Bunun için iki seçeneğimiz var: COPY
ve ADD
. ADD, dosyaları dış URL’lerden çekebilir ve bu nedenle ek işlevler kullanır. Diğer bir deyişle, yapabiliyorsanız COPY kullanmak en iyisidir ve paket * dosyalarımızın tümü yerel üzerinde olduğundan, bunu yapabiliriz:
COPY package*.json ./
lk argüman bizim kaynak dosyalarımız ve ikincisi hedefimiz. Şimdi uygulamamız için ön koşul paketlerinin NPM’den kurulduğundan emin olmamız gerekiyor. Bunlar sadece daha fazla RUN komutudur.
RUN npm config set registry http://registry.npmjs.org/ RUN npm install
Artık uygulama dosyalarımızın geri kalanını COPY kullanarak kopyalayabiliriz. Ayrıca çalışma dizininizin sahibini düğüm kullanıcısı ve grubu olarak ayarlamak isteyeceğiz.Linux’ta olduğumuz için, bu aynı zamanda bazı özel COPY işlevi kullanılarak da gerçekleştirilebilir.
COPY --chown=node:node . .
Buradan kullanıcı değiştirmek istiyoruz. Bu, önceki WORKDIR komutuna benzer şekilde çalışır, ancak şimdi kullanıcıları aşağıdaki RUN, CMD ve ENTRYPOINT komutları için dizinleri değiştirmiyoruz.
USER node
Uygulamamız 8080 numaralı port noktasında barındırıldığından, bağlantı noktasının konteynerimizda da mevcut olduğundan emin olmak istiyoruz. Bunun için EXPOSE anahtar kelimesini kullanacağız.
EXPOSE 8080
Ve şimdi, son olarak, konteyner başlatılır başlatılmaz komutun (CMD) çalışmasını sağlamak istiyoruz. RUN’dan farklı olarak, CMD’nin tercih edilen biçimi bunu bir kabuk komutu olarak almaz. Bunun yerine, yürütülebilir dosya adı bir dizide ve ardından herhangi bir parametre ile sağlanmalıdır: CMD [“executable”,”param1″,”param2″]. Bizim durumumuzda bu şöyle olacaktır:
CMD [ "node", "index.js" ]
Son olarak Dockerfile’ımız şöyle görünmelidir:
FROM node:10-alpine RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app WORKDIR /home/node/app COPY package*.json ./ RUN npm config set registry http://registry.npmjs.org/ RUN npm install COPY --chown=node:node . . USER node EXPOSE 8080 CMD [ "node", "index.js" ]
:wq komutu ile kayıt edip çıkıyoruz.
Artık docker build komutunu kullanarak ve Dockerfile’ımızın konumunu belirterek konteynerimizi oluşturabiliriz. Aynı dizinde olduğumuz için, bunu bir . ile gösterebiliriz. Bununla birlikte, çıktı resmimiz için bir isim sağlamak isteyeceğiz, bu yüzden bir bayrak ayarlamak için -t komutunu kullanmak isteyeceğiz. Bunu Docker Hub’a eklemeyi planlıyorsak, etiket için bir <username>:<imagename> biçimini takip etmek isteyeceğiz. dockerhub a eklemeyeceğim için appimage ismi verecek şekilde ilerleyelim.
docker build . -t appimage
DockerFile olarka değil Dockerfile olarak isim oluşturmaya dikkat edin.
Artık konteynırımızı çalıştırabiliriz.
docker run -dt --name app01 appimage
Ve uygulamamızın çalıştığını görün.
docker inspect app01 | grep IPAddress curl 172.17.0.4:8080
https://docs.docker.com/engine/reference/builder/
Başka bir yazımızda görüşmek üzere,