Dockerfiles ile Container Geliştirme

1. Genel Bakış

Docker, uygulamaları geliştirme, gönderme ve çalıştırma için kullanılan açık bir platformdur. Docker ile uygulamalarınızı altyapınızdan ayırabilir ve altyapınızı yönetilen bir uygulama gibi değerlendirebilirsiniz. Docker, kodu daha hızlı göndermenize, daha hızlı test etmenize, daha hızlı dağıtmanıza ve kod yazma ile kodu çalıştırma arasındaki döngüyü kısaltmanıza yardımcı olur.

Docker, çekirdek container'laştırma özelliklerini, uygulamalarınızı yönetmenize ve dağıtmanıza yardımcı olan iş akışları ve araçlarla birleştirerek bunu yapar.

Docker container'ları doğrudan Kubernetes'te kullanılabilir. Bu sayede Kubernetes Engine'de kolayca çalıştırılabilirler. Docker'ın temel bilgilerini öğrendikten sonra Kubernetes ve container mimarisine alınmış uygulamalar geliştirmeye başlayabilirsiniz.

Neler öğreneceksiniz?

Bu laboratuvarda şunları yapmayı öğreneceksiniz:

  • Örnek uygulama için Dockerfile oluşturma
  • Görüntü oluşturma
  • Resmi yerel olarak kapsayıcı olarak çalıştırma
  • Kapsayıcı davranışını değiştirme
  • Görüntüyü Artifact Registry'ye aktarın.

Ön koşullar

Bu laboratuvar giriş düzeyine uygundur. Docker ve kapsayıcılar konusunda çok az deneyimli veya deneyimsiz olduğunuz varsayılır. Cloud Shell ve komut satırına aşina olmanız önerilir ancak zorunlu değildir.

Yönlendirmesiz ortam kurulumu

  1. Google Cloud Console'da oturum açın ve yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanın. Gmail veya Google Workspace hesabınız yoksa hesap oluşturmanız gerekir.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Proje adı, bu projenin katılımcıları için görünen addır. Google API'leri tarafından kullanılmayan bir karakter dizisidir ve istediğiniz zaman güncelleyebilirsiniz.
  • Proje kimliği, tüm Google Cloud projelerinde benzersiz olmalı ve sabittir (ayarlandıktan sonra değiştirilemez). Cloud Console, benzersiz bir dizeyi otomatik olarak oluşturur. Genellikle bu dizenin ne olduğuyla ilgilenmezsiniz. Çoğu codelab'de proje kimliğine (genellikle PROJECT_ID olarak tanımlanır) başvurmanız gerekir. Bu nedenle, proje kimliğini beğenmezseniz başka bir rastgele kimlik oluşturabilir veya kendi kimliğinizi deneyip kullanılabilir olup olmadığını görebilirsiniz. Proje oluşturulduktan sonra bu değer "dondurulur".
  • Bazı API'lerin kullandığı üçüncü bir değer olan Proje Numarası da vardır. Bu üç değer hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.
  1. Ardından, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i tamamlamak neredeyse hiç maliyetli değildir. Bu eğitimin ötesinde faturalandırma ücreti alınmaması için kaynakları kapatmak üzere codelab'in sonunda bulunan "temizleme" talimatlarını uygulayın. Google Cloud'un yeni kullanıcıları 300 ABD doları değerinde ücretsiz deneme programından yararlanabilir.

2. Örnek Uygulama

Bu laboratuvarı kolaylaştırmak için örnek bir uygulama sağlanmıştır. Bu bölümde, kapsülleme işlemine geçmeden önce kaynak kodu alıp uygulamayı yerel biçiminde oluşturacaksınız.

Kaynak Kod

Bu laboratuvarın kaynak kodu, örnek uygulama belgeleri ile birlikte GoogleCloudPlatform/container-developer-workshop deposunda bulunabilir.

Git'i yapılandırma

git config --global user.name ${USER}
git config --global user.email ${USER}@qwiklabs.net

Örnek uygulama Cloud Source Repository'sini klonlayın.

gcloud source repos clone sample-app ${HOME}/sample-app &&
cd ${HOME}/sample-app &&
git checkout main

Çıkış

Cloning into '/home/student_03_49720296e995/sample-app'...
remote: Finding sources: 100% (16/16)
remote: Total 16 (delta 0), reused 16 (delta 0)
Receiving objects: 100% (16/16), 47.23 KiB | 681.00 KiB/s, done.
warning: remote HEAD refers to nonexistent ref, unable to checkout.

Project [qwiklabs-gcp-02-4327c4e03d82] repository [sample-app] was cloned to [/home/student_03_49720296e995/sample-app].
Branch 'main' set up to track remote branch 'main' from 'origin'.
Switched to a new branch 'main'

Örnek uygulamayı oluşturma

cd ${HOME}/sample-app
./mvnw compile

Çıkış

[INFO] Scanning for projects...
...
[INFO] Compiling 1 source file to /home/student_03_49720296e995/sample-app/target/classes
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  10.080 s
[INFO] Finished at: 2022-02-23T17:14:30Z
[INFO] ------------------------------------------------------------------------

Örnek uygulamayı çalıştırma

cd ${HOME}/sample-app
./mvnw exec:java

Çıkış

[INFO] Scanning for projects...
...
Listening at http://localhost:8080

Çalışan uygulamayı önizleme

  • Cloud Shell Web Önizlemesi düğmesini tıklayın.
  • 8080 numaralı bağlantı noktasında önizle'yi tıklayın.

İşlemi tamamladığınızda

  • Çalışan uygulamayı durdurmak için Cloud Shell'de CTRL + c tuşlarına basın.

3. Dockerfile

Dockerfile ile uygulamayı kapsayıcıya alma

Bir uygulamayı container'a paketlemenin bir yöntemi Dockerfile kullanmaktır. Dockerfile, container görüntüsünün nasıl oluşturulacağı konusunda arka plan programına talimat veren bir komut dosyasına benzer. Daha fazla bilgi için Dockerfile referans belgelerine bakın.

Örnek uygulama deposunda boş bir Dockerfile oluşturun.

touch ${HOME}/sample-app/Dockerfile

Dockerfile'ı tercih ettiğiniz düzenleyicide açın.

vi ${HOME}/sample-app/Dockerfile

Başlangıç resmi seçme

Container oluşturmak için Dockerfile yöntemini kullanmak, container'ı bir araya getirmek için uygulama hakkında doğrudan bilgi sahibi olmayı gerektirir. Dockerfile oluşturmanın ilk adımı, görüntünüzün temeli olarak kullanılacak bir görüntü seçmektir.Bu görüntü, genellikle şirketiniz gibi güvenilir bir kaynak tarafından bakımı yapılan ve yayınlanan bir üst veya temel görüntü olmalıdır.

FROM talimatı yeni bir derleme aşamasını başlatır ve sonraki sıralı komutlar için temel görüntüyü ayarlar. Bu nedenle FROM talimatı genellikle bir Dockerfile'daki ilk talimattır ve değişkenleri desteklemek için yalnızca isteğe bağlı bir ARG talimatı ile başlayabilir.

Sözdizimi: FROM <image>[:<tag> | @<digest>] [AS <name>]

Resim biçimi <image>:<tag> veya <image>@<digest> olmalıdır. Etiket veya özet belirtilmezse varsayılan olarak :latest etiketi kullanılır. <image> biçimi, görüntüyü depolamak için kullanılan kayıt defterine göre değişir. Artifact Registry için <image> biçimi <region>-docker.pkg.dev/<project ID>/<repository name>/<image name>:<image tag>'dir.

Bu laboratuvarda herkese açık openjdk:11.0-jdk görüntüsünü kullanıyoruz. Dockerfile'ınıza aşağıdaki satırı ekleyin.

FROM openjdk:11.0-jdk

Çalışma dizinini ayarlama

WORKDIR talimatı, Dockerfile'da takip eden sıralı talimatlar için çalışma dizinini ayarlar. Daha fazla bilgi için Dockerfile referans belgelerindeki WORKDIR bölümüne bakın.

Sözdizimi: WORKDIR <path>

Bu laboratuvarda /app dizinini WORKDIR olarak kullanıyoruz. Dockerfile dosyanızın en altına aşağıdaki satırı ekleyin.

WORKDIR /app

Uygulama dosyalarını kopyalama

COPY talimatı, dizinleri veya dosyaları <source> konumundan görüntü dosya sisteminin <destination> yoluna kopyalar. Birden fazla <source> kaynağı belirtilebilir ve bunların tümü derleme bağlamına göre belirlenir. Derleme bağlamı, Derleme bölümünde daha ayrıntılı olarak ele alınacaktır. Daha fazla bilgi için Dockerfile referans belgelerindeki COPY bölümüne bakın.

Sözdizimi: COPY <source>... <destination>

Bu laboratuvarda, depodaki tüm dosyaları görüntü dosya sistemine kopyalayacağız ve Dockerfile'ınızın en altına aşağıdaki satırı ekleyeceğiz.

COPY . /app

Uygulamayı derleme

RUN talimatı, komutları mevcut resmin üstündeki yeni bir resim katmanında yürütür ve sonuçları işler. Sonuç olarak oluşturulan resim, Dockerfile'daki sıralı adımlar için kullanılır. Daha fazla bilgi için Dockerfile referans belgelerinin RUN bölümüne bakın.

Sözdizimi: RUN <command>

Bu laboratuvarda uygulamayı JAR dosyası olarak derlemek için Maven'ı kullanacağız. Dockerfile'ınızın en altına aşağıdaki satırı ekleyin.

RUN ./mvnw compile assembly:single

Başvuruyu başlatma

CMD talimatı, çalışan bir kapsayıcı için varsayılan komutu sağlar. Dockerfile'da yalnızca bir CMD talimatı olabilir. Birden fazla CMD belirtilirse yalnızca son CMD geçerli olur. Hem CMD hem de ENTRYPOINT talimatlarını kullanarak daha gelişmiş işlevler elde edebilirsiniz ancak bu laboratuvarda bu konu ele alınmamaktadır. Daha fazla bilgi için Dockerfile referans belgelerinin CMD bölümüne bakın.

Sözdizimi: CMD ["executable","param1","param2"]

Bu laboratuvarda derlediğimiz JAR dosyasını çalıştırıyoruz. Dockerfile'ınızın en altına aşağıdaki satırı ekleyin.

CMD ["java","-jar","/app/target/sample-app-1.0.0-jar-with-dependencies.jar"]

Son Dockerfile

Nihai Dockerfile şu şekilde olur:

FROM openjdk:11.0-jdk
WORKDIR /app
COPY . /app
RUN ./mvnw compile assembly:single
CMD ["java","-jar","/app/target/sample-app-1.0.0-jar-with-dependencies.jar"]

Dockerfile'ı yerel olarak kaydetme

cd ${HOME}/sample-app
git add Dockerfile
git commit -m "Added Dockerfile"

4. Derleme

Şimdi docker build komutunu kullanarak Dockerfile'dan görüntüyü oluşturacağız. Bu komut, Docker arka plan programına Dockerfile'ımızdaki talimatları kullanarak görüntüyü oluşturmasını söyler. Daha fazla bilgi için Docker Build Referans Belgeleri'ne bakın.

Görüntüyü oluşturma

cd ${HOME}/sample-app
export IMAGE_TAG=$(git rev-parse --short HEAD)
docker build --tag sample-app:${IMAGE_TAG} .

Çıkış

Sending build context to Docker daemon  221.2kB
Step 1/4 : FROM openjdk:11.0-jdk
11.0-jdk: Pulling from library/openjdk
0c6b8ff8c37e: Pull complete
412caad352a3: Pull complete
e6d3e61f7a50: Pull complete
461bb1d8c517: Pull complete
e442ee9d8dd9: Pull complete
542c9fe4a7ba: Pull complete
41de18d1833d: Pull complete
Digest: sha256:d72b1b9e94e07278649d91c635e34737ae8f181c191b771bde6816f9bb4bd08a
Status: Downloaded newer image for openjdk:11.0-jdk
---> 2924126f1829
Step 2/4 : WORKDIR /app
---> Running in ea037abb273d
Removing intermediate container ea037abb273d
---> bd9b6d078082
Step 3/4 : COPY . /app
---> b9aec2b5de51
Step 4/4 : RUN ./mvnw compile jar:jar
---> Running in 3f5ff737b7fd
[INFO] Scanning for projects...
...
[INFO] Building jar: /app/target/sample-app-1.0.0.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  22.952 s
[INFO] Finished at: 2022-02-23T18:09:08Z
[INFO] ------------------------------------------------------------------------
Removing intermediate container 331443caebd3
---> 152f65cc441e
Step 5/5 : CMD ["java", "-jar", "/app/target/sample-app-1.0.0.jar"]
---> Running in 3d595a72231c
Removing intermediate container 3d595a72231c
---> 0e40d7548cab
Successfully built 0e40d7548cab
Successfully tagged sample-app:aaa8895

5. Çalıştır

Container görüntümüzü başarıyla oluşturduktan sonra artık uygulamamızı çalıştırabiliyor ve docker run komutunu kullanarak beklendiği gibi çalıştığından emin olabiliyoruz. Bu komut, test veya hata ayıklama için kapsayıcımızı komut istemimizin ön planında başlatır. Daha fazla bilgi için docker run referans belgelerine bakın.

Görüntüyü kullanarak bir kapsayıcı çalıştırma

cd ${HOME}/sample-app
export IMAGE_TAG=$(git rev-parse --short HEAD)
docker run \
  --rm \
  -p 8080:8080 \
  sample-app:${IMAGE_TAG}

Çıkış

Listening at http://localhost:8080

Kapsayıcıda çalışan uygulamayı önizleme

  • Cloud Shell Web Önizlemesi düğmesini tıklayın.
  • 8080 numaralı bağlantı noktasında önizle'yi tıklayın.
  • Kapsayıcıları durdurmak için Cloud Shell'de CTRL + c tuşlarına basın.

Kapsayıcı davranışını değiştirme

Docker Run komutunu yürütürken Dockerfile'daki varsayılan yapılandırma kullanılır. Bu davranışı değiştirmek için ek talimatlar ve parametreler eklenebilir.

TRACE günlük kaydını etkinleştirme

cd ${HOME}/sample-app
export IMAGE_TAG=$(git rev-parse --short HEAD)
docker run \
  --rm \
  -p 8080:8080 \
  sample-app:${IMAGE_TAG} \
  java -Dorg.slf4j.simpleLogger.defaultLogLevel=trace -jar /app/target/sample-app-1.0.0-jar-with-dependencies.jar

Kapsayıcıda çalışan uygulamayı önizleme

  • Cloud Shell Web Önizlemesi düğmesini tıklayın.
  • 8080 numaralı bağlantı noktasında önizle'yi tıklayın.
  • Cloud Shell sekmesine geçin ve ek günlük kaydının yapıldığını görün.
  • Kapsayıcıyı durdurmak için Cloud Shell'de CTRL + c tuşlarına basın.

Bağlantı noktasını değiştir

cd ${HOME}/sample-app
export IMAGE_TAG=$(git rev-parse --short HEAD)
docker run \
--rm \
-e PORT=8081 \
-p 8081:8081 \
sample-app:${IMAGE_TAG}

Kapsayıcıda çalışan uygulamayı önizleme

  • Cloud Shell Web Önizlemesi düğmesini tıklayın.
  • Bağlantı noktasını değiştir'i tıklayın.
  • 8081 yazın.
  • Değiştir ve Önizle'yi tıklayın.
  • Kapsayıcıyı durdurmak için Cloud Shell'de CTRL + c tuşlarına basın.

6. Push

Kapsayıcı görüntünün düzgün çalıştığından emin olduktan ve bu kapsayıcının diğer ortamlarda ve/veya diğer kullanıcılar tarafından çalıştırılmasını istedikten sonra görüntüyü paylaşılan bir depoya göndermemiz gerekir. Bu işlem, otomatik derleme ardışık düzeninin bir parçası olarak gerçekleşmelidir ancak test ortamımızda zaten yapılandırılmış bir depo vardır ve görüntümüzü manuel olarak gönderebiliriz.

Dockerfile kaydetmesini sample-app deposuna gönderin.

cd ${HOME}/sample-app
export IMAGE_TAG=$(git rev-parse --short HEAD)
git push

Artifact Registry için görüntüyü etiketleme

docker tag sample-app:${IMAGE_TAG} \
    us-central1-docker.pkg.dev/${GOOGLE_CLOUD_PROJECT}/apps/sample-app:${IMAGE_TAG}

Artifact Registry için kimlik bilgilerinizi yapılandırma

gcloud auth configure-docker us-central1-docker.pkg.dev

İstendiğinde Do you want to continue (Y/n)? yanıtlayın y ve Enter tuşuna basın.

Görüntüyü Artifact Registry'ye aktarın.

docker push us-central1-docker.pkg.dev/${GOOGLE_CLOUD_PROJECT}/apps/sample-app:${IMAGE_TAG}

Çıkış

 The push refers to repository [us-central1-docker.pkg.dev/qwiklabs-gcp-04-b47ced695a3c/apps/sample-app]
  453b97f86449: Pushed
  e86791aa0382: Pushed
  d404c7ee0850: Pushed
  fe4f44af763d: Pushed
  7c072cee6a29: Pushed
  1e5fdc3d671c: Pushed
  613ab28cf833: Pushed
  bed676ceab7a: Pushed
  6398d5cccd2c: Pushed
  0b0f2f2f5279: Pushed
  aaa8895: digest: sha256:459de00f86f159cc63f98687f7c9563fd65a2eb9bcc71c23dda3351baf13607a size: 2424

7. Tebrikler!

Tebrikler, codelab'i tamamladınız.

Kapsamınıza aldığınız alanlar

  • Örnek uygulama için Dockerfile oluşturduysanız
  • Görüntü oluşturma
  • Görüntüyü yerel olarak kapsayıcı olarak çalıştırma
  • Kapsayıcı davranışını değiştirme
  • Görüntüyü Artifact Registry'ye aktardıysanız