Dockerfiles ile Container Geliştirme

1. Genel Bakış

Docker; uygulama geliştirmek, göndermek ve çalıştırmak 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 ele alabilirsiniz. Docker; kodları daha hızlı göndermenize, daha hızlı test etmenize, daha hızlı dağıtım yapmanıza ve kod yazma ile kod çalıştırma arasındaki süreyi kısaltmanıza yardımcı olur.

Docker, çekirdek container mimarisine alma ö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 ve böylece Kubernetes Engine'de kolayca çalışabilir. Docker ile ilgili temel bilgileri edindikten sonra Kubernetes ve container mimarisine alınmış uygulamalar geliştirmeye başlamak için gerekli becerilere sahip olacaksınız.

Neler öğreneceksiniz?

Bu laboratuvarda aşağıdakileri nasıl yapacağınızı öğreneceksiniz:

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

Ön koşullar

Bu laboratuvar giriş düzeyindedir. Docker ve container'larla ilgili çok az deneyimli veya deneyimsiz olduğunuz varsayılır. Cloud Shell ve komut satırı hakkında bilgi sahibi olmanız önerilir ancak zorunlu değildir.

Kendi hızınızda ortam kurulumu

  1. Google Cloud Console'da oturum açıp 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 dizesidir ve bunu istediğiniz zaman güncelleyebilirsiniz.
  • Proje Kimliği, tüm Google Cloud projelerinde benzersiz olmalıdır ve değiştirilemez (belirlendikten sonra değiştirilemez). Cloud Console, otomatik olarak benzersiz bir dize oluşturur. bunun ne olduğunu umursamıyorsunuz. Çoğu codelab'de, Proje Kimliğine referans vermeniz gerekir (ve bu kimlik genellikle PROJECT_ID olarak tanımlanır). Beğenmezseniz başka bir rastgele kod oluşturun ya da kendi proje kimliğinizi deneyip mevcut olup olmadığına bakın. Sıcaklık "soğudu" takip etmeniz gerekir.
  • Bazı API'lerin kullandığı üçüncü bir değer, yani Proje Numarası daha vardır. Bu değerlerin üçü 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 çalıştırmanın maliyeti, yüksek değildir. Bu eğitim dışında faturalandırmayla karşılaşmamak için kaynakları kapatmak istiyorsanız tüm "temizleme" işlemlerini uygulayın buradaki talimatları uygulayın. Yeni Google Cloud kullanıcıları, 300 ABD doları değerindeki ücretsiz denemeden yararlanabilir.

2. Örnek Uygulama

Bu laboratuvarın kolaylaştırılması için örnek bir uygulama sağlanmıştır. Bu bölümde, container mimarisine alma işlemine geçmeden önce kaynak kodunu alacak ve uygulamayı yerel biçiminde derleyeceksiniz.

Kaynak Kodu

Bu laboratuvarın kaynak kodu, örnek uygulama belgeleriyle 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 uygulamayı Cloud Source Repository'yi klonlama

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ı derleme

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 bağlantı noktasında Önizleme'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

Uygulamayı Dockerfile ile Container mimarisine alma

Bir uygulamayı container'a paketleme yöntemlerinden biri Dockerfile kullanmaktır. Dockerfile, arka plan programına container görüntüsünün nasıl derleneceği ile ilgili 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'ı istediğiniz düzenleyicide açın.

vi ${HOME}/sample-app/Dockerfile

Bir başlangıç resmi seçin

Dockerfile yöntemini container derlemek için kullanmak, container'ı derlemek için uygulama hakkında doğrudan bilgi 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 sizin şirketiniz olan 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 resmi ayarlar. Dolayısıyla, FROM talimatı genellikle bir Dockerfile'daki ilk talimattır ve değişkenleri desteklemek için öncesinde yalnızca isteğe bağlı bir ARG talimatı verilebilir.

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

Resim biçimi <image>:<tag> veya <image>@<digest> şeklindedir. Bir etiket veya özet belirtilmezse varsayılan olarak :latest etiketi kullanılır. <image> biçimi, resmi depolamak için kullanılan kayıt otoritesine bağlı olarak değişiklik gösterir. Artifact Registry için <image> biçimi <region>-docker.pkg.dev/<project ID>/<repository name>/<image name>:<image tag> şeklindedir.

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

FROM openjdk:11.0-jdk

Çalışma dizinini ayarlama

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

Sözdizimi: WORKDIR <path>

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

WORKDIR /app

Uygulama dosyalarını kopyalama

COPY talimatı, dizinleri veya dosyaları <source> konumundan resim dosya sisteminin <destination> yoluna kopyalar. Birden fazla <source> kaynağı belirtilebilir ve bunların tümü derleme bağlamıyla ilişkilidir. Derleme bağlamı, Derleme bölümünde daha ayrıntılı olarak açıklanacaktır. Daha fazla bilgi için Dockerfile referans dokümanlarının KOPYALAMA bölümüne bakın

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

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

COPY . /app

Uygulamayı derleyin

RUN talimatı, komutları mevcut resmin üzerindeki yeni bir görüntü katmanında yürütür ve sonuçları kaydeder. Elde edilen kaydedilen görüntü, Dockerfile'da ardışık adımlarda kullanılır. Daha fazla bilgi için Dockerfile referans belgelerinin RUN bölümüne bakın.

Sözdizimi: RUN <command>

Bu laboratuvarda Maven'i kullanarak uygulamayı bir JAR dosyası olarak derleyeceğiz. Dockerfile'ınızın alt kısmına aşağıdaki satırı ekleyin.

RUN ./mvnw compile assembly:single

Uygulamayı başlat

CMD talimatı, çalışan bir kapsayıcı için varsayılan komutu sağlar. Bir 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ı kullanıldığında daha gelişmiş işlevler mevcuttur, ancak bu işlevler bu laboratuvarda ele alınmamıştı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. Aşağıdaki satırı Dockerfile'ınızın altına ekleyin.

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

Nihai Dockerfile

Son Dockerfile ise

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, Dockerfile'ımızdaki talimatları kullanarak Docker arka plan programına görüntü derlemesi talimatını verir. Daha fazla bilgi için docker derleme referansı belgelerine 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 derledikten sonra artık uygulamamızı çalıştırabiliyoruz ve Docker Run komutunu kullanarak uygulamanın 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 çalıştırma referans belgelerine bakın.

Görüntüyü kullanarak container ç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

Bir kapsayıcıda çalışan uygulamayı önizleme

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

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

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

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

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

Bir kapsayıcıda çalışan uygulamayı önizleme

  • Cloud Shell Web Önizlemesi düğmesini tıklayın
  • 8080 bağlantı noktasında Önizleme'yi tıklayın
  • Cloud Shell sekmesine geçin ve ek günlük kaydı
  • Container'ı 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}

Bir 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 girin
  • Değiştir ve Önizle'yi tıklayın
  • Container'ı durdurmak için Cloud Shell'de CTRL + c tuşlarına basın

6. Push

Container görüntüsünün düzgün bir şekilde çalıştığından ve bu container'ı başka ortamlarda ve/veya diğer kullanıcılar tarafından kullanılabilir hale getirmek istediğimizden emin olduktan sonra, görüntüyü paylaşılan bir depoya aktarmamız gerekir. Bu, otomatik bir derleme ardışık düzeninin parçası olarak gerçekleştirilmelidir ancak test ortamımızda zaten yapılandırılmış bir depomuz var ve görüntümüzü manuel olarak aktarabiliyoruz.

Dockerfile kaydını örnek uygulama deposuna aktar

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

Görüntüyü Artifact Registry için etiketleyin

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ırın

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

Sorulduğunda Do you want to continue (Y/n)?, y yanıtını verin ve Enter tuşuna basın

Görüntüyü Artifact Registry'ye aktarma

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.

İşledikleriniz

  • Örnek uygulama için Dockerfile oluşturuldu
  • Görüntü oluşturdu
  • Görüntü, yerel olarak container olarak çalıştırıldı
  • Kapsayıcı davranışı değiştirildi
  • Görüntü, Artifact Registry'ye aktarıldı