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
  • Buat 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 kontainerisasi.

Kode Sumber

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

Mengonfigurasi git

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

Membuat clone aplikasi sampel Cloud Source Repository

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 contoh

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

Output

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

Melihat pratinjau aplikasi yang berjalan

  • Klik tombol Cloud Shell Web Preview
  • Klik Preview pada port 8080

Setelah selesai

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

3. Dockerfile

Memasukkan Aplikasi ke dalam Dockerfile

Salah satu metode pengemasan 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 dalam repositori aplikasi contoh.

touch ${HOME}/sample-app/Dockerfile

Buka Dockerfile di editor pilihan Anda.

vi ${HOME}/sample-app/Dockerfile

Pilih gambar awal

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

Petunjuk FROM menginisialisasi tahap build baru dan menetapkan image dasar untuk perintah berurutan berikutnya. Dengan demikian, petunjuk FROM biasanya merupakan petunjuk pertama di Dockerfile dan hanya dapat diawali dengan petunjuk ARG opsional untuk mendukung variabel.

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

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

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

FROM openjdk:11.0-jdk

Menetapkan direktori kerja

Petunjuk WORKDIR menetapkan direktori kerja untuk setiap petunjuk berurutan yang mengikuti Dockerfile. Untuk 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

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

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

Untuk lab ini, kita akan menyalin semua file dalam repositori ke sistem file image. Tambahkan baris berikut ke bagian bawah Dockerfile Anda

COPY . /app

Mengompilasi aplikasi

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

Sintaksis: RUN <command>

Di 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

Memulai aplikasi

Petunjuk CMD menyediakan perintah default untuk container yang sedang berjalan. Hanya ada satu instruksi CMD di Dockerfile, jika lebih dari satu CMD ditentukan, maka hanya CMD terakhir yang akan berfungsi. Fungsi lanjutan lainnya tersedia menggunakan petunjuk CMD dan ENTRYPOINT, tetapi tidak dibahas di 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 telah 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 Final

Dockerfile final adalah

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

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 dengan menggunakan perintah docker build. Perintah ini menginstruksikan daemon docker untuk membangun image menggunakan petunjuk dari Dockerfile. 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 image container berhasil dibangun, sekarang kita dapat menjalankan aplikasi dan memastikan aplikasi berperilaku seperti yang diharapkan menggunakan perintah docker run. Perintah ini akan meluncurkan container di latar depan command prompt untuk pengujian atau proses debug. Lihat dokumentasi referensi Docker run untuk informasi selengkapnya.

Menjalankan 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 dalam container

  • Klik tombol Cloud Shell Web Preview
  • Klik Preview pada port 8080
  • Tekan CTRL + c di Cloud Shell untuk menghentikan container

Mengubah perilaku penampung

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

Mengaktifkan pencatatan 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 dalam container

  • Klik tombol Cloud Shell Web Preview
  • Klik Preview pada port 8080
  • Buka 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 dalam container

  • Klik tombol Cloud Shell Web Preview
  • 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 dapat dijalankan di lingkungan lain dan/atau oleh pengguna lain, kita perlu mengirim image ke repositori bersama. Hal ini seharusnya terjadi sebagai bagian dari pipeline build otomatis, tetapi di lingkungan pengujian, kita sudah mengonfigurasi repositori dan kita dapat mengirim image secara manual.

Mengirim commit Dockerfile ke repositori aplikasi sampel

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

Jika diminta, Do you want to continue (Y/n)? jawab y lalu 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 bahas

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