Mengembangkan Container dengan Dockerfile

1. Ringkasan

Docker adalah platform terbuka untuk mengembangkan, mengirim, dan menjalankan aplikasi. Dengan Docker, Anda dapat memisahkan aplikasi dari infrastruktur dan memperlakukan infrastruktur layaknya aplikasi terkelola. Docker membantu mengirim kode, menguji, dan men-deploy lebih cepat, serta mempersingkat siklus antara menulis dan menjalankan kode.

Docker melakukan proses tersebut dengan menggabungkan fitur containerization kernel dengan alur kerja serta peralatan yang membantu Anda mengelola dan men-deploy aplikasi.

Container Docker dapat langsung digunakan di Kubernetes, sehingga memudahkan container dijalankan di Kubernetes Engine. Setelah mempelajari hal-hal penting mengenai Docker, Anda akan memiliki keterampilan untuk mulai mengembangkan Kubernetes serta aplikasi dalam container.

Yang akan Anda pelajari

Di lab ini, Anda akan mempelajari cara melakukan hal-hal berikut:

  • Membuat Dockerfile untuk aplikasi contoh
  • Membangun gambar
  • Menjalankan image sebagai container secara lokal
  • Mengubah perilaku penampung
  • Mengirim image ke Artifact Registry

Prasyarat

Ini adalah lab tingkat pendahuluan. Anda dianggap tidak memiliki atau hanya memiliki sedikit pengalaman terkait Docker dan container. Pemahaman dalam menggunakan Cloud Shell dan command line direkomendasikan, tetapi tidak wajib.

Penyiapan lingkungan mandiri

  1. Login ke Google Cloud Console dan buat project baru atau gunakan kembali project yang sudah ada. Jika belum memiliki akun Gmail atau Google Workspace, Anda harus membuatnya.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Nama project adalah nama tampilan untuk peserta project ini. String ini adalah string karakter yang tidak digunakan oleh Google API, dan Anda dapat memperbaruinya kapan saja.
  • Project ID harus unik di semua project Google Cloud dan tidak dapat diubah (tidak dapat diubah setelah ditetapkan). Cloud Console otomatis menghasilkan string unik; biasanya Anda tidak peduli dengan kata-katanya. Pada sebagian besar codelab, Anda harus mereferensikan Project ID (dan biasanya diidentifikasi sebagai PROJECT_ID). Jadi, jika Anda tidak menyukainya, buat ID acak lain, atau, Anda dapat mencoba sendiri dan melihat apakah tersedia. Kemudian file akan "dibekukan" setelah project dibuat.
  • Ada nilai ketiga, Nomor Project yang digunakan oleh beberapa API. Pelajari lebih lanjut ketiga nilai ini di dokumentasi.
  1. Selanjutnya, Anda harus mengaktifkan penagihan di Cloud Console untuk menggunakan API/resource Cloud. Menjalankan operasi dalam codelab ini seharusnya tidak memerlukan banyak biaya, bahkan mungkin tidak sama sekali. Untuk menonaktifkan resource agar tidak menimbulkan penagihan di luar tutorial ini, ikuti petunjuk "pembersihan" yang ada di akhir codelab. Pengguna baru Google Cloud memenuhi syarat untuk mengikuti program Uji Coba Gratis senilai $300 USD.

2. Contoh Aplikasi

Aplikasi contoh telah disediakan untuk memfasilitasi lab ini. Di bagian ini, Anda akan mengambil kode sumber dan membangun aplikasi dalam bentuk aslinya sebelum melanjutkan ke proses penampungan.

Kode Sumber

Kode sumber untuk lab ini tersedia di repositori GoogleCloudPlatform/container-developer-workshop bersama dengan dokumentasi aplikasi contoh.

Mengonfigurasi git

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

Meng-clone Cloud Source Repository aplikasi contoh

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

Output

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'

Membangun aplikasi contoh

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

Output

[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] ------------------------------------------------------------------------

Menjalankan aplikasi sampel

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

Output

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

Melihat pratinjau aplikasi yang sedang berjalan

  • Klik tombol Pratinjau Web Cloud Shell
  • Klik Preview on port 8080

Setelah selesai

  • Tekan CTRL + c di Cloud Shell untuk menghentikan aplikasi yang sedang berjalan

3. Dockerfile

Membuat Container Aplikasi dengan Dockerfile

Salah satu metode untuk mengemas aplikasi ke dalam container adalah dengan menggunakan Dockerfile. Dockerfile mirip dengan skrip yang menginstruksikan daemon tentang cara menyusun image container. Lihat dokumentasi referensi Dockerfile untuk mengetahui informasi selengkapnya.

Buat Dockerfile kosong di repositori aplikasi contoh.

touch ${HOME}/sample-app/Dockerfile

Buka Dockerfile di editor pilihan Anda.

vi ${HOME}/sample-app/Dockerfile

Memilih gambar awal

Menggunakan metode Dockerfile untuk membangun container memerlukan pengetahuan langsung tentang aplikasi untuk merakit container. Langkah pertama untuk membuat Dockerfile adalah memilih image yang akan digunakan sebagai dasar image Anda.Image ini harus berupa image induk atau dasar yang dikelola dan dipublikasikan oleh sumber tepercaya, biasanya perusahaan Anda.

Petunjuk FROM menginisialisasi tahap build baru dan menetapkan image dasar untuk perintah berurutan berikutnya. Oleh karena itu, petunjuk FROM biasanya merupakan petunjuk pertama dalam Dockerfile dan hanya dapat didahului oleh petunjuk ARG opsional untuk mendukung variabel.

Sintaksis: FROM <image>[:<tag> | @<digest>] [AS <name>]

Format gambar adalah <image>:<tag> atau <image>@<digest>. Jika tag atau ringkasan tidak ditentukan, tag defaultnya adalah :latest. Format <image> bervariasi berdasarkan registry yang digunakan untuk menyimpan gambar. Untuk Artifact Registry, format <image> adalah <region>-docker.pkg.dev/<project ID>/<repository name>/<image name>:<image tag>.

Untuk lab ini, kita menggunakan image openjdk:11.0-jdk publik, tambahkan baris berikut ke Dockerfile Anda

FROM openjdk:11.0-jdk

Menetapkan direktori kerja

Instruksi WORKDIR menetapkan direktori kerja untuk setiap instruksi berurutan yang mengikuti di Dockerfile. Untuk mengetahui informasi selengkapnya, lihat bagian WORKDIR dalam dokumentasi referensi Dockerfile

Sintaksis: WORKDIR <path>

Untuk lab ini, kita menggunakan direktori /app sebagai WORKDIR, tambahkan baris berikut ke bagian bawah Dockerfile Anda

WORKDIR /app

Menyalin file aplikasi

Instruksi COPY menyalin direktori atau file dari lokasi <source> ke jalur <destination> sistem file gambar. Beberapa aset <source> dapat ditentukan dan semuanya relatif terhadap konteks build. Konteks build akan dibahas lebih lanjut di bagian Build. Untuk mengetahui informasi selengkapnya, lihat bagian COPY dalam dokumentasi referensi Dockerfile

Sintaksis: COPY <source>... <destination>

Untuk lab ini, kita akan menyalin semua file di repositori ke sistem file image, tambahkan baris berikut ke bagian bawah Dockerfile Anda

COPY . /app

Kompilasi aplikasi

Petunjuk RUN mengeksekusi perintah di lapisan image baru di atas image saat ini dan menjalankan hasilnya. Image yang dihasilkan akan digunakan untuk langkah berurutan di Dockerfile. Untuk mengetahui informasi selengkapnya, lihat bagian RUN dalam dokumentasi referensi Dockerfile

Sintaksis: RUN <command>

Untuk lab ini, kita akan menggunakan Maven untuk mengompilasi aplikasi ke file JAR. Tambahkan baris berikut ke bagian bawah Dockerfile Anda

RUN ./mvnw compile assembly:single

Mulai aplikasi

Instruksi CMD memberikan perintah default untuk container yang sedang berjalan. Hanya boleh ada satu instruksi CMD dalam Dockerfile. Jika lebih dari satu CMD ditentukan, hanya CMD terakhir yang akan berlaku. Ada fungsi yang lebih canggih yang tersedia menggunakan petunjuk CMD dan ENTRYPOINT, tetapi hal itu tidak dibahas dalam lab ini. Untuk mengetahui informasi selengkapnya, lihat bagian CMD` dalam dokumentasi referensi Dockerfile

Sintaksis: CMD ["executable","param1","param2"]

Untuk lab ini, kita menjalankan file JAR yang kita kompilasi, tambahkan baris berikut ke bagian bawah Dockerfile Anda

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

Dockerfile akhir

Dockerfile akhir akan menjadi

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"]

Lakukan commit Dockerfile secara lokal

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

4. Build

Sekarang kita akan membangun image dari Dockerfile menggunakan perintah docker build. Perintah ini menginstruksikan daemon Docker untuk membangun image menggunakan petunjuk dari Dockerfile kita. Lihat dokumentasi referensi build Docker untuk mengetahui informasi selengkapnya.

Membangun image

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

Output

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

Setelah berhasil membangun image container, kita sekarang dapat menjalankan aplikasi dan memastikan aplikasi berperilaku seperti yang diharapkan menggunakan perintah docker run. Perintah ini akan meluncurkan penampung di latar depan command prompt untuk pengujian atau proses debug. Lihat dokumentasi referensi docker run untuk mengetahui informasi selengkapnya.

Jalankan container menggunakan image

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

Output

Listening at http://localhost:8080

Melihat pratinjau aplikasi yang berjalan di container

  • Klik tombol Pratinjau Web Cloud Shell
  • Klik Preview on port 8080
  • Tekan CTRL + c di Cloud Shell untuk menghentikan penampung

Mengubah perilaku penampung

Menjalankan Docker Run menggunakan konfigurasi default di Dockerfile. Petunjuk dan parameter tambahan dapat ditambahkan untuk mengubah perilaku ini.

Mengaktifkan logging TRACE

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

Melihat pratinjau aplikasi yang berjalan di container

  • Klik tombol Pratinjau Web Cloud Shell
  • Klik Preview on port 8080
  • Beralih ke tab Cloud Shell dan lihat logging tambahan
  • Tekan CTRL + c di Cloud Shell untuk menghentikan container

Ubah port

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}

Melihat pratinjau aplikasi yang berjalan di container

  • Klik tombol Pratinjau Web Cloud Shell
  • Klik Ubah port
  • Masukkan 8081
  • Klik Ubah dan Pratinjau
  • Tekan CTRL + c di Cloud Shell untuk menghentikan container

6. Push

Setelah yakin bahwa image container berjalan dengan benar dan kita ingin membuat container ini tersedia untuk dijalankan di lingkungan lain dan/atau oleh pengguna lain, kita perlu mengirimkan image ke repositori bersama. Hal ini akan terjadi sebagai bagian dari pipeline build otomatis, tetapi di lingkungan pengujian, kita sudah mengonfigurasi repositori dan dapat mengirim image secara manual.

Kirim commit Dockerfile ke repositori sample-app

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

Memberi tag pada image untuk Artifact Registry

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

Mengonfigurasi kredensial Anda untuk Artifact Registry

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

Saat diminta Do you want to continue (Y/n)? jawab y dan tekan Enter

Mengirim image ke Artifact Registry

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

Output

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

Selamat, Anda telah menyelesaikan codelab!

Yang telah Anda pelajari

  • Membuat Dockerfile untuk aplikasi contoh
  • Membangun gambar
  • Menjalankan image sebagai container secara lokal
  • Perilaku penampung yang berubah
  • Mengirim image ke Artifact Registry