Tutorial Ubuntu 26.04 / Menjalankan Docker Compose dengan data persisten dan port terbatas
Image kontainer menyediakan lingkungan untuk menjalankan aplikasi, sedangkan data persisten dan port yang dipublikasikan perlu dikelola terpisah. Latihan ini memasang Docker Engine dan Compose pada VM Ubuntu 26.04 khusus, lalu mempertahankan data aplikasi Nginx yang hanya dipublikasikan ke loopback saat kontainernya dibuat ulang.
Tentukan sumber instalasi dan model hak akses
Image adalah paket sistem berkas dan konfigurasi untuk membuat kontainer. Kontainer adalah instans yang menjalankan aplikasi; menghapusnya dapat menghilangkan data pada lapisan tulisnya. Docker Engine menjalankan kontainer, sedangkan Compose mendefinisikan layanan, jaringan, dan volume melalui berkas YAML, format konfigurasi yang memakai indentasi.
Pada server yang sudah memakai Docker, containerd, atau Kubernetes, inventarisasikan kontainer, volume, repositori, dan paket sebelum merencanakan perubahan. Jangan mencampur metode instalasi atau menghapus paket secara membabi buta. Prosedur berikut hanya untuk VM Ubuntu baru; berhenti jika docker.sources atau docker.asc sudah ada, termasuk sebagai symlink. Periksa pula entri Docker lama pada berkas repositori dengan nama lain.
Panduan pemasangan Docker untuk Ubuntu mencantumkan Ubuntu 26.04 LTS dan paket yang dapat berbenturan, termasuk docker.io, paket Compose distribusi, containerd, dan runc. Jika salah satunya sudah dipakai, susun rencana migrasi beserta cadangan terlebih dahulu; skrip ini tidak menghapus paket tersebut secara otomatis.
Keanggotaan grup docker dan akses soket Docker memberikan hak setingkat root pada model daemon ini. Contoh memakai sudo secara eksplisit dan tidak mengubah soket menjadi dapat ditulis semua pengguna. Menjalankan image yang tidak tepercaya merupakan keputusan kepercayaan dengan dampak pada host.
Pasang melalui repositori resmi
Simpan seluruh skrip sebagai ~/install-docker-lab.sh, lalu jalankan bash ~/install-docker-lab.sh pada VM yang memenuhi prasyarat. Pemeriksaan rilis dan berkas dilakukan sebelum penulisan konfigurasi. Signed-By membatasi kunci ke repositori terkait.
set -eu
. /etc/os-release
if [ "$ID" != ubuntu ] || [ "$VERSION_ID" != 26.04 ]; then
printf "Latihan ini memerlukan Ubuntu 26.04.\n" >&2
exit 1
fi
if [ -e /etc/apt/sources.list.d/docker.sources ] || [ -L /etc/apt/sources.list.d/docker.sources ] || [ -e /etc/apt/keyrings/docker.asc ] || [ -L /etc/apt/keyrings/docker.asc ]; then
printf "Periksa repositori Docker yang sudah ada terlebih dahulu.\n" >&2
exit 1
fi
sudo apt update
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
sudo tee /etc/apt/sources.list.d/docker.sources >/dev/null <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: ${UBUNTU_CODENAME:-$VERSION_CODENAME}
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo docker version
sudo docker compose version
sudo docker run --rm hello-world
Pastikan keluaran docker version memuat versi klien dan server, Compose tersedia, serta hello-world menampilkan pesan keberhasilan. Jika daemon tidak berjalan, periksa status layanan docker dan log kegagalannya sebelum melanjutkan. Catat versi yang benar-benar terpasang. Jangan mengabaikan kegagalan APT, tanda tangan, atau jaringan.
Jika pemasangan berhenti setelah membuat berkas, periksa hasil parsial dan entri repositorinya; jangan memaksa penimpaan untuk mengulang skrip. Menghapus entri repositori saja tidak menghapus Engine atau datanya. Pertahankan data dan sumber lain ketika merencanakan pemulihan.
Pertahankan port 8080 pada latihan situs Nginx. Kontainer berikut memakai port host 8081 dan port internal 80. Jika 8081 sudah digunakan, periksa pemiliknya melalui ss dan compose ps; sesuaikan port host pada Compose dan semua URL curl secara konsisten, tanpa menghentikan proses lain secara paksa.
Buat aplikasi Compose dan volume
Buat direktori baru ~/compose-lab dan simpan isi berikut sebagai compose.yaml di dalamnya. Jika direktori atau proyek dengan nama itu sudah ada, berhenti dan periksa agar tidak memakai volume berisi data nyata. Sebelum mulai, gunakan ss -lnt untuk memeriksa ketersediaan 127.0.0.1:8081. Menghilangkan alamat host pada ports dapat memublikasikan port ke antarmuka lain.
services:
web:
image: nginx:stable-alpine
ports:
- "127.0.0.1:8081:80"
volumes:
- lab-html:/usr/share/nginx/html
restart: unless-stopped
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
volumes:
lab-html:
Urutan pemetaan port adalah alamat host, port host, lalu port kontainer. Dalam dokumentasi publikasi port Docker, binding loopback membatasi akses ke host pada konfigurasi jaringan standar. Docker sebelum 28.0.0 memiliki pengecualian akses dari segmen jaringan lapisan 2 (L2) yang sama, misalnya perangkat pada switch yang sama; periksa versi aktual. Pengaturan direct routing atau jaringan khusus juga perlu ditinjau tersendiri, bukan disamakan dengan bridge standar latihan ini.
lab-html adalah named volume, yaitu penyimpanan bernama yang dikelola Docker di luar lapisan tulis kontainer. Volume kosong dapat diisi dengan berkas awal dari direktori image yang dipasangi volume; kemudian latihan ini menulis index.html sendiri. Dokumentasi volume Docker menjelaskan siklus hidup dan pengisian awal tersebut.
Tag stable-alpine dapat menunjuk image berbeda di kemudian hari. Untuk penerapan yang dapat direproduksi, gunakan digest yang sudah diuji dan proses pembaruan terencana. Kebijakan restart unless-stopped bukan pemeriksaan kesehatan aplikasi. Batas json-file pada contoh mengaktifkan rotasi dengan max-size dan max-file; sesuaikan dengan beban layanan, bukan menganggapnya batas seluruh ruang disk Docker.
Jalankan, buat ulang, dan periksa data persisten
(
set -eu
cd ~/compose-lab
sudo docker compose config
sudo docker compose pull
sudo docker compose up -d
sudo docker compose ps
sudo docker compose logs --tail 30 web
)
Lanjutkan setelah config berhasil dan image selesai diunduh. Periksa status serta log layanan web sebelum menulis konten. Keluaran compose config dapat menampilkan nilai konfigurasi sensitif pada proyek lain; jangan membagikannya tanpa pemeriksaan.
Jalankan seluruh blok berikut hanya pada proyek dan volume latihan yang baru. Perintah exec menimpa index.html di volume tersebut. Dua permintaan HTTP diberi percobaan ulang untuk koneksi yang ditolak ketika proses web belum siap; ini tetap dapat gagal jika aplikasinya bermasalah.
(
set -eu
cd "$HOME/compose-lab"
sudo docker compose exec web sh -c 'printf "volume-lab\n" > /usr/share/nginx/html/index.html'
curl --noproxy '*' --fail --show-error --retry 10 --retry-connrefused --retry-delay 1 http://127.0.0.1:8081/
sudo docker compose up -d --force-recreate
curl --noproxy '*' --fail --show-error --retry 10 --retry-connrefused --retry-delay 1 http://127.0.0.1:8081/
sudo docker image inspect nginx:stable-alpine --format '{{json .RepoDigests}}'
)
Respons sebelum dan setelah --force-recreate harus sama-sama volume-lab. Compose up membuat ulang kontainer sambil mempertahankan volume yang dipasang. Respons yang sama membuktikan bahwa aplikasi masih membaca berkas volume latihan; hasil itu bukan bukti keberhasilan cadangan atau kesehatan seluruh aplikasi.
Jika curl tetap gagal, jangan ulangi seluruh blok secara otomatis karena blok itu kembali menulis berkas dan membuat ulang kontainer. Periksa compose ps dan log, lalu ulangi hanya permintaan HTTP setelah penyebabnya diperbaiki. --noproxy menjaga pemeriksaan loopback ini agar tidak dikirim melalui proxy lingkungan. Perintah image inspect mencatat RepoDigests image lokal; cocokkan identitas image kontainer berjalan sebelum menganggapnya bukti versi layanan.
Setiap blok mulai dengan masuk ke ~/compose-lab. Perubahan direktori dalam tanda kurung tidak bertahan di shell pemanggil. Gunakan berkas Compose dan identitas proyek yang sama pada semua langkah; penggantian nama direktori, opsi proyek, COMPOSE_FILE, atau COMPOSE_PROJECT_NAME dapat mengarahkan perintah ke proyek atau volume lain. Periksa konfigurasi yang benar-benar digunakan sebelum menjalankan perintah yang mengubah data.
Periksa pemetaan host aktual dengan ss dan docker compose ps, lalu uji koneksi baru dari perangkat lain yang seharusnya ditolak. Pengujian harus ditujukan ke alamat jaringan host yang benar, bukan 127.0.0.1 perangkat lain. Dokumentasi firewall Docker menjelaskan bahwa lalu lintas port yang dipublikasikan dapat melewati aturan UFW. Jangan mengandalkan UFW saja atau mematikan pengelolaan firewall Docker untuk memaksa hasil.
Bedakan menghentikan proyek dan menghapus data
(
set -eu
cd "$HOME/compose-lab"
sudo docker compose down
sudo docker volume ls
)
Compose down menghentikan dan menghapus kontainer serta jaringan proyek, sementara named volume dipertahankan secara default. Setelah masuk kembali ke direktori yang sama, jalankan up -d dan ulangi pemeriksaan HTTP untuk memastikan volume-lab masih tersedia. Daftar volume saja belum membuktikan isi atau pemasangan volume benar.
Jangan memakai down -v atau volume prune sebagai perintah berhenti rutin karena keduanya dapat menghapus data. Jangan membersihkan seluruh volume host saat hanya ingin mengakhiri latihan ini. Pencadangan volume memerlukan pengaturan penulisan aplikasi dan uji pemulihan ke lokasi terpisah; volume persisten tidak menggantikan cadangan.




