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