SSD Nodes Learn RAM 8GB — $66/tahun
Panduan Matt ConnorOleh Matt Connor · Diperbarui 2026-08-01

Cheat Sheet Docker Compose untuk Server Nyata

Pelajari perintah Docker Compose V2 untuk siklus layanan, perubahan, log, shell, jaringan, volume, dan pembersihan aman, termasuk error %%C11%% di Ubuntu baru.

Perintah Compose yang benar-benar Anda gunakan

Docker Compose merilis lebih dari empat puluh subperintah. Pekerjaan harian di server biasanya menggunakan sekitar selusin. Halaman ini mengelompokkan perintah tersebut berdasarkan tugas yang Anda lakukan, memberikan satu alasan singkat untuk setiap perintah, dan mengarahkan Anda ke pembahasan mendalam jika suatu perintah memiliki jebakan tertentu.

Semua contoh di sini menggunakan Compose V2: docker compose dengan spasi, bukan skrip lama docker-compose. V2 adalah plugin Go yang dipasang bersama Docker Engine, sedangkan V1 sudah tidak tersedia dalam paket saat ini. Jadi, docker-compose: command not found pada instalasi Ubuntu baru per Juli 2026 merupakan kondisi yang diharapkan, bukan kerusakan. Periksa dengan docker compose version. Jika perintah tersebut tidak menampilkan apa pun, pasang paket docker-compose-plugin.

Setiap perintah di bawah ini dijalankan dari direktori yang berisi compose.yaml, karena Compose mengambil nama proyek dari direktori tersebut dan mencari file secara relatif terhadapnya. Jika Anda menjalankan perintah yang sama satu tingkat di atasnya, Compose berhenti dengan no configuration file provided: not found. Jika format file tersebut masih baru bagi Anda, mulai dengan file Compose pertama di VPS, lalu kembali ke sini untuk mempelajari perintah-perintahnya.

Siklus hidup: empat perintah yang Anda ketik, dan satu perintah yang menghapus container

docker compose up -d
docker compose up -d --wait
docker compose stop
docker compose start
docker compose restart web
docker compose down

up -d membuat network, membuat container, menjalankannya, lalu selesai. Perintah ini selesai segera setelah container dibuat. Karena itu, skrip deployment yang langsung menjalankan pemeriksaan curl sering gagal pada percobaan pertama. up -d --wait menunggu hingga setiap service yang mendeklarasikan healthcheck melaporkan status healthy, lalu keluar dengan kode nonzero jika salah satunya tidak pernah mencapai status tersebut. Flag ini hanya sebaik pemeriksaan yang mendasarinya. Karena itu, tulis healthcheck yang dapat dipercaya oleh Compose sebelum mengandalkannya dalam automation.

stop menghentikan container dan mempertahankannya. Dengan demikian, start menjalankan kembali container yang sama dengan writable layer yang sama. down menghentikan container, lalu menghapus container dan network project. Semua data yang ditulis di dalam container dan di luar volume akan ikut terhapus. Ini adalah kesalahpahaman paling merugikan dalam Compose. Perbedaan lengkap antara down dan stop menjelaskan dampaknya.

restart bukan operasi reload. Perintah ini menghentikan dan menjalankan kembali container yang sama dengan konfigurasi yang sudah dimilikinya. Karena itu, perubahan environment variable, tag image baru, atau port mapping yang diedit sama sekali tidak berpengaruh. Untuk menerapkan perubahan file, jalankan up -d lagi. Compose membandingkan setiap service dengan container yang sedang berjalan, lalu hanya membuat ulang service yang konfigurasinya berubah.

Menerapkan perubahan: buat ulang, pull, atau build ulang

docker compose up -d --force-recreate
docker compose pull && docker compose up -d
docker compose build --no-cache web
docker compose up -d --build web

up -d tidak melakukan apa pun jika tidak ada perubahan. Karena itu, perintah ini aman dijalankan berulang kali. --force-recreate mengabaikan perbandingan tersebut dan mengganti setiap container meskipun konfigurasinya identik. Ini adalah cara tercepat untuk menghapus status aneh di dalam container.

Memperbarui image memerlukan dua perintah karena keduanya melakukan hal yang berbeda. pull mengunduh image terbaru untuk setiap tag yang tercantum dalam file. up -d kemudian mendeteksi bahwa ID image service tidak lagi cocok dengan container yang sedang berjalan, lalu membuatnya kembali. Jika pull dilewati, up -d tetap menjalankan latest dari bulan lalu tanpa kesalahan.

build berlaku untuk service yang mendeklarasikan bagian build:, bukan image:. up -d --build melakukan build dan memulai service dalam satu langkah. Ini adalah alur kerja yang umum saat Anda mengubah kode. Gunakan --no-cache hanya jika suatu layer cache jelas sudah kedaluwarsa, karena perintah ini membangun ulang setiap layer dari awal.

Melihat apa yang sedang berjalan

docker compose ps
docker compose ps -a
docker compose logs -f --tail=100
docker compose logs --since 15m --timestamps db
docker compose top
docker compose ls

ps hanya menampilkan container yang sedang berjalan. Layanan yang gagal saat memulai tidak akan terlihat di sana sampai Anda menambahkan -a. Karena itu, container yang tidak ada dalam ps, sementara ps -a menampilkannya sebagai Exited (1), merupakan pola umum kegagalan saat memulai. Periksa kode keluar, lalu periksa log.

logs -f mengikuti semua layanan sekaligus dan menambahkan nama layanan di awal setiap baris. Tampilan ini diperlukan ketika layanan saling berkomunikasi dan urutan kejadian penting. Cantumkan nama layanan untuk mempersempit hasil. --tail=100 penting pada container yang telah berjalan selama sebulan, karena secara default perintah tersebut menampilkan seluruh riwayat dan membanjiri terminal. --since 15m menjawab pertanyaan yang biasanya Anda miliki, yaitu apa yang terjadi selama restart yang baru saja dilakukan.

top menampilkan proses di dalam setiap container. Dengan demikian, Anda dapat membedakan antara "container sedang berjalan" dan "proses di dalamnya sedang berjalan". ls keluar dari direktori saat ini dan menampilkan semua project Compose di host beserta statusnya. Anda dapat menemukan stack yang dimulai tiga bulan lalu.

Membuka shell di dalam layanan

docker compose exec web sh
docker compose exec -u root web sh
docker compose run --rm web env
docker compose run --rm --no-deps web sh

exec menjalankan perintah di dalam container yang sudah berjalan. run memulai container baru berdasarkan definisi layanan yang sama. Gunakan run jika layanan tidak berjalan cukup lama untuk menjalankan perintah dengan exec. Selalu gunakan run bersama --rm. Tanpa opsi tersebut, setiap pemanggilan meninggalkan container yang berhenti, dan container itu terus bertambah hingga docker compose ps -a tidak dapat dibaca.

Coba sh sebelum bash. Image berbasis Alpine tidak menyertakan bash, sehingga kegagalannya menampilkan exec: "bash": executable file not found in $PATH. Menambahkan --no-deps ke run melewati dependensi layanan. Dengan demikian, pemeriksaan konfigurasi singkat tidak memulai seluruh database Anda.

run --rm web env adalah cara tercepat untuk melihat environment yang benar-benar diterima layanan setelah setiap file .env, blok environment:, dan variabel shell digabungkan. Jika suatu nilai salah, biasanya penyebabnya adalah urutan penggabungan. cara Compose menyelesaikan file env dan secret menjelaskan sumber yang diprioritaskan.

Jaringan, port, dan resolusi nama

docker compose port web 80
docker compose exec web getent hosts db
docker compose config --networks

Compose menempatkan semua layanan pada satu jaringan proyek, dan setiap nama layanan menjadi nama DNS di jaringan tersebut. Menjalankan getent hosts db di dalam web menampilkan IP container jika resolusi berhasil dan tidak menampilkan apa pun jika gagal. Dengan demikian, perintah ini menjawab pertanyaan "apakah container-container ini dapat saling terhubung" dalam dua detik. Jika nama berhasil di-resolve tetapi koneksi ditolak, proses di dalam db terikat ke 127.0.0.1, bukan 0.0.0.0. Akibatnya, proses tersebut tidak pernah menerima paket dari container lain. Penjelasan selengkapnya tentang model ini terdapat di cara kerja jaringan Compose dan DNS layanan.

port web 80 menampilkan alamat host dan port tempat port container dipublikasikan. Hal ini menghindari perkiraan ketika pemetaan berasal dari variabel. Mempublikasikan port juga menulis aturan firewall yang dikelola Docker sendiri. Aturan tersebut berada sebelum aturan Anda. Akibatnya, layanan yang Anda anggap privat dapat terbuka ke internet. Kasus ini dibahas di alasan port Docker yang dipublikasikan melewati ufw.

Volume dan data

docker compose config --volumes
docker compose cp db:/etc/postgresql/pg_hba.conf ./pg_hba.conf
docker compose down -v

config --volumes menampilkan volume bernama yang dideklarasikan oleh proyek, satu per baris. Daftar tersebut adalah data yang harus Anda cadangkan. cp menyalin file ke dalam atau ke luar container tanpa membuka shell, dengan menggunakan format service:path pada sisi yang merupakan container.

down -v menghapus volume bernama tersebut bersama container. Perintah ini tepat untuk membongkar stack pengujian, tetapi tidak tepat untuk apa pun yang menyimpan data penting karena tidak ada konfirmasi dan tidak dapat dibatalkan. Bind mount tetap ada karena berada di filesystem host. Perbedaan dalam cakupan dampak ini adalah salah satu alasan untuk memilih secara cermat antara bind mount dan volume bernama.

Pembersihan yang membebaskan ruang disk tanpa kehilangan data

docker compose down --remove-orphans
docker system df
docker image prune -a
docker builder prune

--remove-orphans menghapus container yang menjadi bagian dari project tetapi tidak lagi tercantum dalam file. Kondisi ini biasanya terjadi setelah Anda mengganti nama service. Tanpa opsi ini, container tersebut tetap berjalan dan tidak terlihat oleh docker compose ps.

docker system df menunjukkan penggunaan disk sebelum Anda menghapus apa pun. Perintah ini memisahkan image, container, volume lokal, dan cache build, serta menampilkan jumlah ruang yang dapat diperoleh kembali untuk masing-masing. image prune -a menghapus setiap image yang tidak dirujuk oleh tag apa pun. Pada server yang telah mengunduh beberapa versi image berukuran besar, tindakan ini biasanya memberikan penghematan terbesar. builder prune menghapus cache build, yang bertambah secara perlahan pada setiap server yang membangun image sendiri.

Tidak satu pun dari perintah tersebut menyentuh named volume. Hanya docker volume prune dan docker compose down -v yang melakukannya.

Memeriksa file sebelum menimbulkan masalah

docker compose config --quiet
docker compose config --services
docker compose --dry-run up -d

config --quiet memvalidasi file dan tidak mencetak apa pun jika berhasil. Karena itu, jalankan perintah ini dalam langkah prapenerapan atau git hook. Perintah config tanpa opsi mencetak file yang telah digabungkan dan diinterpolasi sepenuhnya. Dengan cara ini, Anda dapat memastikan bahwa variabel berhasil di-resolve dan file override diterapkan sesuai harapan. Variabel yang tidak ditetapkan muncul sebagai nilai kosong, disertai peringatan The "X" variable is not set. Defaulting to a blank string.

--dry-run adalah flag global, bukan flag subperintah. Karena itu, letakkan flag ini sebelum up. Perintah ini mencetak setiap tindakan yang akan dilakukan Compose tanpa mengubah apa pun. Waktu tiga puluh detik ini layak digunakan sebelum menjalankan down pada stack penting.

Bekerja di berbagai file, profil, dan proyek

docker compose -f compose.yaml -f compose.prod.yaml up -d
docker compose --profile debug up -d
docker compose -p staging up -d

Beberapa flag -f digabungkan secara berurutan. File berikutnya menimpa file sebelumnya berdasarkan setiap kunci. Ini adalah cara standar untuk mempertahankan satu file dasar dengan override produksi yang kecil. Namun, aturannya berbeda untuk daftar dan map. Baca cara Compose menggabungkan beberapa file sebelum menelusuri masalah yang tidak terduga.

--profile memulai layanan yang ditandai dengan profil tersebut bersama layanan yang tidak ditandai. Dengan demikian, alat debugging tidak dimasukkan ke dalam up normal. -p menetapkan nama proyek. Karena itu, dua salinan stack yang sama dapat berjalan berdampingan dengan jaringan dan nama volume yang terpisah. Untuk memulihkan stack setelah reboot, Anda tidak perlu mengetikkan perintah. Gunakan unit yang menjalankannya secara otomatis, seperti dijelaskan dalam memulai stack Compose saat boot.

FAQ

Apa yang menggantikan docker-compose dengan tanda hubung?

Compose V2, yang dijalankan sebagai docker compose dengan spasi. Ini adalah plugin yang disertakan dalam Docker Engine, sedangkan alat Python V1 tidak lagi diinstal oleh paket saat ini. Jika bentuk dengan spasi tidak menampilkan apa pun, instal paket docker-compose-plugin untuk distribusi Anda. Perbarui skrip lama agar menggunakan bentuk dengan spasi, bukan menambahkan alias, karena V2 memiliki flag yang tidak tersedia di V1.

Mengapa docker compose restart tidak menerapkan perubahan konfigurasi saya?

restart menghentikan dan memulai container yang ada dengan konfigurasi saat container tersebut dibuat, dan tidak pernah membaca ulang compose.yaml. Setiap perubahan pada variabel lingkungan, port, volume, atau tag image memerlukan docker compose up -d. Perintah ini membandingkan setiap service dengan container yang sedang berjalan dan membuat ulang service yang berbeda. Tambahkan --force-recreate jika Anda ingin penggantian tetap dilakukan meskipun tidak ada perubahan dalam file.

Bagaimana cara memperbarui service ke image yang lebih baru?

Jalankan docker compose pull, lalu docker compose up -d. Perintah pull mengambil image terbaru untuk setiap tag dalam file, sedangkan up -d membuat ulang service apa pun yang ID image-nya tidak lagi cocok dengan container-nya. Menjalankan up -d saja akan menggunakan kembali image yang sudah tersimpan di disk. Akibatnya, stack yang dikunci ke latest dapat tetap menggunakan build yang sudah berusia beberapa bulan tanpa menampilkan kesalahan.

Perintah pembersihan mana yang aman di server aktif?

docker system df, docker image prune -a, dan docker builder prune hanya menghapus image dan cache. Service yang sedang berjalan tetap berfungsi, dan named volume tidak tersentuh. Pasangan perintah yang berbahaya adalah docker compose down -v dan docker volume prune karena menghapus named volume tanpa meminta konfirmasi. Jalankan docker compose config --volumes terlebih dahulu agar Anda mengetahui apa yang berisiko terhapus.

Dapatkah saya menjalankan satu perintah tanpa memulai seluruh stack?

Ya. docker compose run --rm --no-deps web sh memulai satu container dari definisi service web, melewati dependensinya, dan menghapus container saat Anda keluar. Gunakan exec jika container sudah berjalan, karena exec bergabung ke proses yang aktif dan menampilkan kondisi service yang sebenarnya.