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
- 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.



- 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_IDolarak 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.
- 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