Dua puluh section materi telah kita tempuh, dari Apa itu Docker? sampai Memilih Platform Orchestration, dan setiap konsepnya kita lihat dalam potongan kecil: satu Dockerfile di sini, satu flag di sana. Section Proyek membuka babak penerapan — seluruh pengetahuan itu dirangkai menjadi produk nyata yang bisa dijalankan dan diuji dari ujung ke ujung. Proyek pertama sengaja dipilih yang paling ramping: sebuah situs katalog produk statis yang dikemas menjadi image nginx, dijalankan sebagai container, lalu dinyatakan penuh dalam compose.yaml. Jangan tertipu ukurannya — proyek mungil ini menyentuh hampir semua otot Course ini: image layer, build cache, konfigurasi server, port publishing, restart policy, sampai membaca log akses.
Apa yang Kita Bangun #
Kita berperan sebagai pengelola situs Kopi Nusantara, toko kopi yang butuh halaman katalog sederhana. Situs yang kita bangun memiliki karakter berikut:
- satu berkas HTML mandiri berisi katalog tiga kopi — tanpa CSS eksternal, tanpa JavaScript, tanpa proses build front-end,
- image berbasis
nginx:1.29-alpinedengan konfigurasi kustom: kompresigzip, kebijakan cache 7 hari untuk aset,no-cacheuntukindex.html, dan fallback404untuk jalur yang tak ada, - container yang dijalankan dulu manual lewat
docker runagar tiap flag terasa, lalu dideklarasikan penuh dalamcompose.yaml, - verifikasi menyeluruh dengan
curldandocker logs: header HTTP dibedah satu per satu, gzip diukur byte-nya, siklus stop-start diuji, dan stack dibongkar dengan bersih.
Hasil Akhir dalam Dua Perintah #
Seluruh proyek bermuara pada dua perintah berikut, dijalankan dari dalam folder proyek setelah keempat bagian selesai:
$ docker compose up -d --buildOutput yang Dihasilkan:
[+] Building 1.8s (12/12) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 686B 0.0s
...
=> CACHED [6/6] RUN nginx -t 0.0s
=> => naming to docker.io/library/container-web-statis:1.0 0.0s
[+] Running 2/2
✔ Network container-web-statis_default Created 0.2s
✔ Container web-statis Started 0.4sPotongan tengah build dipotong agar ringkas — Bagian 3 membacanya baris demi baris. Satu perintah ini membangun image, membuat network, dan menghidupkan container. Perintah kedua mengetuk pintunya:
$ curl -I http://localhost:8080Output yang Dihasilkan:
HTTP/1.1 200 OK
Server: nginx/1.29.4
Date: Tue, 13 Oct 2026 15:07:31 GMT
Content-Type: text/html
Content-Length: 2154
Last-Modified: Tue, 13 Oct 2026 14:56:26 GMT
Connection: keep-alive
ETag: "6ace469a-86a"
Cache-Control: no-cache
Accept-Ranges: bytesSepuluh baris respons itu adalah kartu nama proyek kita: Server membocorkan image dasarnya, Content-Length menghitung isi index.html byte-per-byte, ETag merangkum waktu dan ukuran berkas, dan Cache-Control adalah buah dari satu trik konfigurasi nginx yang kita pasang di Bagian 2. Bagian 4 membuktikan asal-usul setiap barisnya — termasuk mengapa no-cache justru melekat pada halaman depan.
Tujuan Pembelajaran #
Setelah menyelesaikan proyek ini, kita mampu:
- menyusun situs statis satu berkas yang sadar-container sejak baris pertamanya,
- menulis Dockerfile utuh dari nol —
FROMyang dipin,LABELOCI, duaCOPYyang diurutkan demi cache,EXPOSE, dan validasinginx -tsaat build, - mengonfigurasi nginx gaya
conf.d: gzip, kebijakan cache per pola URL, dantry_files, - membaca output BuildKit, menjalankan container dengan flag yang tepat, lalu memindahkan seluruh definisi ke compose.yaml,
- memverifikasi container web dengan
curl,docker logs, dan siklus hidup stop-start-down.
Prasyarat #
Proyek ini tidak memperkenalkan konsep baru; ia merangkai yang lama. Pastikan mesin latihan memenuhi hal berikut:
- Docker Engine 29.9.0 dengan plugin Compose v5.6.0 terpasang dan lulus ritual Verifikasi Instalasi,
- klien
curltersedia di host — Bagian 4 memakainya sebagai alat uji utama, - browser apa pun untuk mempratinjau situs di Bagian 1.
Chapter yang paling sering dirujuk: Membangun Image dengan Dockerfile dan docker build untuk anatomi resep serta output BuildKit, .dockerignore untuk penyaringan context, Port Publishing untuk pemetaan 8080:80, Pengantar Docker Compose serta Menjalankan dan Mengelola Stack untuk sisi deklaratifnya, Restart Policy untuk nuansa unless-stopped, dan Docker Logs untuk membaca jejak akses.
Peta File Proyek #
Struktur lengkap proyek yang kita bangun bertahap:
container-web-statis/
├── Dockerfile
├── nginx.conf
├── .dockerignore
├── compose.yaml
├── site/
│ └── index.html
└── README.mdPeran setiap berkas dan bagian tempat ia lahir:
| Berkas | Peran | Bagian |
|---|---|---|
site/index.html | Konten situs — katalog Kopi Nusantara | Bagian 1 |
Dockerfile | Resep image: basis nginx, konfigurasi, konten, validasi build | Bagian 2 |
nginx.conf | Konfigurasi server: gzip, cache, fallback 404 | Bagian 2 |
.dockerignore | Penyaring build context | Bagian 2 |
compose.yaml | Deklarasi service web untuk Compose | Bagian 3 |
README.md | Ringkasan cara menjalankan dan menguji proyek | — |
Tahapan #
Proyek dikerjakan dalam empat bagian berurutan. Setiap bagian berdiri di atas berkas bagian sebelumnya:
- Bagian 1: Menyiapkan File Website — struktur folder dan
index.htmlutuh, plus bedah kenapa situs ini lahir sebagai satu berkas. - Bagian 2: Membuat Dockerfile — tiga berkas sekaligus:
Dockerfile,nginx.conf, dan.dockerignore, lengkap dengan benang merah internal redirect. - Bagian 3: Membangun dan Menjalankan Image —
docker build,docker runmanual, lalu perpindahan kedocker compose up. - Bagian 4: Menguji Container Web — header, gzip, log akses, siklus hidup, dan teardown yang bersih.
Mulailah dari Bagian 1 dan pertahankan urutannya: konfigurasi nginx di Bagian 2 hanya masuk akal bila kita tahu isi site/, dan angka-angka di Bagian 4 hanya bermakna bila output build di Bagian 3 sudah kita pahami.
Referensi #
- nginx di Docker Hub — halaman image resmi yang menjadi basis proyek, beserta daftar tag dan varian alpine.
- Docker Compose — filosofi deklaratif Compose yang kita pakai pada Bagian 3.
- Dokumentasi nginx
— rujukan directive yang dipakai di
nginx.conf.
Susun berkas HTML dan struktur folder yang akan dikemas menjadi image.
Buka → # Bagian 2: Membuat DockerfileTulis Dockerfile dan konfigurasi nginx yang menyalin situs ke dalam image.
Buka → # Bagian 3: Membangun dan Menjalankan ImageBangun image dengan docker build dan jalankan container manual maupun lewat Compose.
Buka → # Bagian 4: Menguji Container WebUji respons HTTP, gzip, cache, siklus stop-start, dan kebersihan teardown.
Buka → # Buka →Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
compose.yaml
Unduh berkasname: container-web-statis
services:
web:
build: .
image: container-web-statis:1.0
container_name: web-statis
ports:
- "8080:80"
restart: unless-stopped
site/index.html
Unduh berkas<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Katalog produk Kopi Nusantara: Torabika, Gayo, dan Kintamani.">
<title>Katalog Produk — Kopi Nusantara</title>
<style>
/* Palet warna terpusat sebagai custom properties. */
:root {
--latar: #f7f4ef;
--teks: #2b2723;
--aksen: #6f4e37;
--kartu: #ffffff;
}
body {
font-family: Georgia, serif;
background: var(--latar);
color: var(--teks);
margin: 0;
line-height: 1.6;
}
header, footer { background: var(--aksen); color: #fff; text-align: center; padding: 1rem; }
h1 { margin: 0; font-size: 1.6rem; }
main { max-width: 680px; margin: 2rem auto; padding: 0 1rem; }
h2 { color: var(--aksen); margin: 0 0 1rem; }
.pengantar { margin: 0 0 1.5rem; }
section.produk { display: grid; gap: 1rem; }
.kartu {
background: var(--kartu);
border: 1px solid #e6dfd3;
border-radius: 8px;
padding: 1rem;
}
.kartu h3 { margin: 0 0 0.25rem; }
.harga { color: var(--aksen); font-weight: bold; margin: 0 0 0.25rem; }
.kartu p { margin: 0; }
</style>
</head>
<body>
<header>
<h1>Kopi Nusantara</h1>
<p>Kopi pilihan Indonesia</p>
</header>
<main>
<h2>Daftar Produk</h2>
<p class="pengantar">Tiga kopi favorit kami, disangrai segar setiap pekan.</p>
<section class="produk">
<article class="kartu">
<h3>Kopi Torabika</h3>
<p class="harga">Rp 28.000</p>
<p>Robusta dengan aroma kuat, favorit pelanggan.</p>
</article>
<article class="kartu">
<h3>Kopi Gayo</h3>
<p class="harga">Rp 45.000</p>
<p>Arabika dataran tinggi Aceh dengan aroma rempah.</p>
</article>
<article class="kartu">
<h3>Kopi Kintamani</h3>
<p class="harga">Rp 42.000</p>
<p>Arabika Bali dengan sentuhan rasa sitrus.</p>
</article>
</section>
</main>
<footer>
<p>© 2026 Kopi Nusantara — disajikan oleh nginx</p>
</footer>
</body>
</html>