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